From e892da65c8ac2c28b253524134d258e4f3f39d35 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 18 May 2025 19:12:02 -0400 Subject: [PATCH 01/77] First chunk of major refactor. Move code to external files located in .includes. Better code organization and easier to deal with. --- .includes/checkup.sh | 109 +++++++++++++++ .includes/functions.sh | 32 +++++ .includes/help.sh | 98 +++++++++++++ .includes/update.sh | 52 +++++++ audiogame-manager.sh | 303 ++--------------------------------------- 5 files changed, 304 insertions(+), 290 deletions(-) create mode 100755 .includes/checkup.sh create mode 100644 .includes/functions.sh create mode 100644 .includes/help.sh create mode 100644 .includes/update.sh diff --git a/.includes/checkup.sh b/.includes/checkup.sh new file mode 100755 index 0000000..ed68e06 --- /dev/null +++ b/.includes/checkup.sh @@ -0,0 +1,109 @@ +declare -a errorList +declare -a packageList +if [[ $# -eq 0 ]]; then + echo "Checking your system..." + echo +fi +if command -v wine &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Wine is installed." +else + errorList+=("Critical: Wine is not installed. You will not be able to play any games.") +fi +packageList+=("wine") +if command -v curl &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Curl is installed." +else + errorList+=("Critical: Curl is not installed. Critical functionality will not work.") +fi +packageList+=("curl") +if command -v dialog &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Dialog is installed." +else + errorList+=("Critical: Dialog is not installed. You will not be able to install, launch, or remove any games.") +fi +packageList+=("dialog") +for i in 7z cabextract unzip xz ; do + if command -v $i &> /dev/null ; then + [[ $# -eq 0 ]] && echo "${i^} is installed." + else + errorList+=("Critical: ${i^} is not installed. You will not be able to install some games or their components.") + fi + packageList+=("$i") +done +if command -v gawk &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Gawk is installed." +else + errorList+=("Warning: gawk is not installed. Game removal with -r will not work.") +fi +packageList+=("gawk") +if command -v ocrdesktop &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Ocrdesktop is installed." +else + errorList+=("Warning: ocrdesktop is not installed. It can help if the installer gets stuck to figure out what is happening.") +fi +packageList+=("ocrdesktop") +if command -v qjoypad &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Qjoypad is installed." +else + errorList+=("Warning: qjoypad is not installed. Qjoypad allows you to play keyboard only games with a gamepad.") +fi +packageList+=("qjoypad") +if command -v sox &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Sox is installed." +else + errorList+=("Warning: Sox is not installed. Audio will not work.") +fi +packageList+=("sox") +if command -v trans &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Translate-shell is installed." +else + errorList+=("Warning: translate-shell is not installed. Games that require translation will not be translated.") +fi +packageList+=("translate-shell") +if command -v sqlite3 &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Sqlite3 is installed." +else + errorList+=("Warning: sqlite is not installed. Required for games that need to be translated.") +fi +if command -v perl &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Perl is installed." +else + errorList+=("Warning: perl is not installed. Required for games that need to be translated.") +fi +packageList+=("perl") +packageList+=("sqlite") +if command -v w3m &> /dev/null ; then + [[ $# -eq 0 ]] && echo "W3m is installed." +else + errorList+=("Warning: w3m is not installed. W3m is used to view game documentation.") +fi +packageList+=("w3m") +if command -v xclip &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Xclip is installed." +else + errorList+=("Warning: Xclip is not installed. Some games may not speak or register properly.") +fi +packageList+=("xclip") +if command -v xdotool &> /dev/null ; then + [[ $# -eq 0 ]] && echo "Xdotool is installed." +else + errorList+=("Warning: Xdotool is not installed. Some installers may not work or may need manual intervention.") +fi +packageList+=("xdotool") +# Show the results +if [[ $# -ne 0 ]]; then + for i in "${packageList[@]}" ; do + echo "$i" + done | sort + exit 0 +fi +if [[ ${#errorList[@]} -eq 0 ]]; then + echo "No problems found, you are good to go." + exit 0 +fi +echo "Errors detected, here is a list along with the severity." +echo "Note that errors marked critical mean that you will not be able to install and play games until they are resolved." +for i in "${errorList[@]}" ; do + echo "$i" +done +exit 0 diff --git a/.includes/functions.sh b/.includes/functions.sh new file mode 100644 index 0000000..dd40b8c --- /dev/null +++ b/.includes/functions.sh @@ -0,0 +1,32 @@ +# Alerts, for when user needs to read something. +alert() { + play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t + echo + read -rp "Press enter to continue." continue +} + +check_requirements() { + # Make sure the minimum of curl, sox, wine, and winetricks are installed or fex-emu on aarch64 + if [[ "$(uname -m)" == "aarch64" ]]; then + minimumDependencies=("FEXLoader") + wine="FEXLoader -- /usr/bin/wine" + else + minimumDependencies=("curl" "sox" "wine") + fi + for i in "${minimumDependencies[@]}" ; do + if ! command -v $i &> /dev/null ; then + echo "Please install $i before continuing." + return 1 + fi + done + return 0 +} + +# Function to open urls across OS. +open_url() { + if [[ "$(uname)" == "Darwin" ]]; then + open "${*}" 2> /dev/null + else + xdg-open "${*}" 2> /dev/null + fi +} diff --git a/.includes/help.sh b/.includes/help.sh new file mode 100644 index 0000000..e710959 --- /dev/null +++ b/.includes/help.sh @@ -0,0 +1,98 @@ +documentation() { + if [[ "$2" == "Become a Patron" ]]; then + return + fi + if [[ "$2" == "Donate" ]]; then + return + fi + if ! command -v w3m &> /dev/null ; then + echo "This feature of audiogame-manager requires w3m. Please install it before continuing." + exit 1 + fi + get_bottle "$1" +echo "Loading documentation, please wait..." + # Try to find documentation based on common naming conventions. + local gamePath="$(winepath -u "$2" 2> /dev/null)" + gamePath="${gamePath%/*}" + local gameDoc="$(find "$gamePath" -type f -iname 'user_manual.htm*' -or -iname 'user manual.htm*' -or -iname '*user guide.htm*' | head -1)" + # Game name specific docs, add the name to the for loop. + if [[ -z "$gameDoc" ]]; then + for i in "troopanum.txt" "superdeekout.txt" scw.html ; do + gameDoc="$(find "$gamePath" -type f -iname "$i" -or -iname 'manual.htm' | head -1)" + done + fi + if [[ -z "$gameDoc" ]]; then + gameDoc="$(find "$gamePath" -type f -path '*/Manual/index.html' | head -1)" + fi + if [[ -z "$gameDoc" ]]; then + gameDoc="$(find "$gamePath" -type f -iname '[A-Z]*Help.htm' -or -iname '[A-Z]*Help.html' | head -1)" + fi + if [[ -z "$gameDoc" ]]; then + gameDoc="$(find "$gamePath" -type f -iname 'manual.html' -or -iname 'manual.htm' | head -1)" + fi + if [[ -z "$gameDoc" ]]; then + gameDoc="$(find "$gamePath" -type f -iname 'en.html' -or -iname 'en.htm' | head -1)" + fi + if [[ -z "$gameDoc" ]]; then + gameDoc="$(find "$gamePath" -type f -iname 'readme.html' -or -iname 'readme.htm' | head -1)" + fi + if [[ -z "$gameDoc" ]]; then + gameDoc="$(find "$gamePath" -type f -iname 'manual.txt' | head -1)" + fi + if [[ -z "$gameDoc" ]]; then + gameDoc="$(find "$gamePath" -type f -iname 'readme.txt' -or -iname 'help.txt' | head -1)" + fi + if [[ -z "$gameDoc" ]]; then + gameDoc="$(find "$gamePath" -type f -iname '*.url' -exec grep -i 'url=' {} \; | grep -iv 'score' | head -1)" + gameDoc="${gameDoc#*=}" + gameDoc="${gameDoc//[[:cntrl:]]/}" + fi + # Display documentation if available. + if [[ -n "$gameDoc" ]]; then + w3m "$gameDoc" + else + echo "No documentation found." + fi + exit 0 +} + +license() { + cat << EOF + ■The contents of this file are subject to the Common Public Attribution + License Version 1.0 (the ■License■); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + https://opensource.org/licenses/CPAL-1.0. The License is based on the Mozilla Public License Version + 1.1 but Sections 14 and 15 have been added to cover use of software over a + computer network and provide for limited attribution for the Original + Developer. In addition, Exhibit A has been modified to be consistent with + Exhibit B. + + Software distributed under the License is distributed on an ■AS IS■ basis, + WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + for the specific language governing rights and limitations under the + License. + + The Original Code is audiogame manager. + + The Original Developer is not the Initial Developer and is . If + left blank, the Original Developer is the Initial Developer. + + The Initial Developer of the Original Code is Billy "Storm Dragon" Wolfe. All portions of + the code written by Billy Wolfe are Copyright (c) 2020, 2024. All Rights + Reserved. + + Contributor Michael Taboada. + + Attribution Copyright Notice: Audiogame manager copyright 2020 Storm Dragon. All rights reserved. + + Attribution Phrase (not exceeding 10 words): A Stormux project + + Attribution URL: https://stormgames.wolfe.casa + + Graphic Image as provided in the Covered Code, if any. + + Display of Attribution Information is required in Larger + Works which are defined in the CPAL as a work which combines Covered Code + or portions thereof with code not governed by the terms of the CPAL. +EOF +} diff --git a/.includes/update.sh b/.includes/update.sh new file mode 100644 index 0000000..4ae1bf6 --- /dev/null +++ b/.includes/update.sh @@ -0,0 +1,52 @@ +# Check for latest news +check_news() { + # For use by update scripts that want to source functions in this file. + [[ "$agmNoLaunch" == "true" ]] && return + trap return INT + # url for news file + local newsFile="https://stormgames.wolfe.casa/media/agm.ogg" + local newsPath="${configFile%/*.conf}/.news" + local newsTag="$(curl --connect-timeout 5 -sI "$newsFile" | grep -i '^etag: "' | cut -d '"' -f2)" + if [[ -z "${newsTag}" ]]; then + return + fi + local newsOldTag="$(cat "$newsPath" 2> /dev/null)" + if [[ "$newsTag" != "$newsOldTag" ]]; then + dialog --yes-label 'Play' \ + --no-label 'Later' \ + --backtitle 'Audiogame Manager News' \ + --yesno 'Audiogame manager news is available. Please use left and right arrows to navigate and enter to confirm.' -1 -1 || return + sox -qV0 "$newsFile" -d &> /dev/null + echo -n "$newsTag" > "$newsPath" + fi +} + +# Automatic update function +# Automatic update function +update() { + if ! [[ -d ".git" ]]; then + return + fi + local url="$(git ls-remote --get-url)" + if [[ "$url" =~ ^ssh://|git@|gitea@ ]] || [[ -z "$url" ]]; then + return + fi + git remote update &> /dev/null + local upstream='@{u}' + local home="$(git rev-parse @)" + local remote="$(git rev-parse "$upstream")" +if [[ "$home" == "$remote" ]]; then + return +fi + dialog --backtitle "Audiogame Manager" \ + --yesno "Updates are available. Would you like to update now?" -1 -1 --stdout || return + { git pull + git log '@{1}..' --pretty=format:'%an: %s' | tac; } + exit $? +} +# Get latest news if available +check_news +# With no arguments, open the game launcher. +if [[ $# -eq 0 ]]; then + game_launcher +fi diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 65d2412..14bc1e2 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -1,113 +1,9 @@ #!/usr/bin/env bash -license() { - cat << EOF - ■The contents of this file are subject to the Common Public Attribution - License Version 1.0 (the ■License■); you may not use this file except in - compliance with the License. You may obtain a copy of the License at - https://opensource.org/licenses/CPAL-1.0. The License is based on the Mozilla Public License Version - 1.1 but Sections 14 and 15 have been added to cover use of software over a - computer network and provide for limited attribution for the Original - Developer. In addition, Exhibit A has been modified to be consistent with - Exhibit B. - - Software distributed under the License is distributed on an ■AS IS■ basis, - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - for the specific language governing rights and limitations under the - License. - - The Original Code is audiogame manager. - - The Original Developer is not the Initial Developer and is . If - left blank, the Original Developer is the Initial Developer. - - The Initial Developer of the Original Code is Billy "Storm Dragon" Wolfe. All portions of - the code written by Billy Wolfe are Copyright (c) 2020, 2024. All Rights - Reserved. - - Contributor Michael Taboada. - - Attribution Copyright Notice: Audiogame manager copyright 2020 Storm Dragon. All rights reserved. - - Attribution Phrase (not exceeding 10 words): A Stormux project - - Attribution URL: https://stormgames.wolfe.casa - - Graphic Image as provided in the Covered Code, if any. - - Display of Attribution Information is required in Larger - Works which are defined in the CPAL as a work which combines Covered Code - or portions thereof with code not governed by the terms of the CPAL. -EOF -} - # Dialog accessibility export DIALOGOPTS='--no-lines --visit-items' -# Alerts, for when user needs to read something. -alert() { - play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t - echo - read -rp "Press enter to continue." continue -} - -# Check for latest news -check_news() { - # For use by update scripts that want to source functions in this file. - [[ "$agmNoLaunch" == "true" ]] && return - trap return INT - # url for news file - local newsFile="https://stormgames.wolfe.casa/media/agm.ogg" - local newsPath="${configFile%/*.conf}/.news" - local newsTag="$(curl --connect-timeout 5 -sI "$newsFile" | grep -i '^etag: "' | cut -d '"' -f2)" - if [[ -z "${newsTag}" ]]; then - return - fi - local newsOldTag="$(cat "$newsPath" 2> /dev/null)" - if [[ "$newsTag" != "$newsOldTag" ]]; then - dialog --yes-label 'Play' \ - --no-label 'Later' \ - --backtitle 'Audiogame Manager News' \ - --yesno 'Audiogame manager news is available. Please use left and right arrows to navigate and enter to confirm.' -1 -1 || return - sox -qV0 "$newsFile" -d &> /dev/null - echo -n "$newsTag" > "$newsPath" - fi -} - -# Automatic update function -# Automatic update function -update() { - if ! [[ -d ".git" ]]; then - return - fi - local url="$(git ls-remote --get-url)" - if [[ "$url" =~ ^ssh://|git@|gitea@ ]] || [[ -z "$url" ]]; then - return - fi - git remote update &> /dev/null - local upstream='@{u}' - local home="$(git rev-parse @)" - local remote="$(git rev-parse "$upstream")" -if [[ "$home" == "$remote" ]]; then - return -fi - dialog --backtitle "Audiogame Manager" \ - --yesno "Updates are available. Would you like to update now?" -1 -1 --stdout || return - { git pull - git log '@{1}..' --pretty=format:'%an: %s' | tac; } - exit $? -} - -# Function to open urls across OS. -open_url() { - if [[ "$(uname)" == "Darwin" ]]; then - open "${*}" 2> /dev/null - else - xdg-open "${*}" 2> /dev/null - fi -} - # Create desktop launcher file desktop_launcher() { local desktopFile="${HOME}/audiogame-manager.desktop" @@ -147,118 +43,6 @@ desktop_launcher() { # Wine configuration section -checklist() { - declare -a errorList - declare -a packageList - if [[ $# -eq 0 ]]; then - echo "Checking your system..." - echo - fi - if command -v wine &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Wine is installed." - else - errorList+=("Critical: Wine is not installed. You will not be able to play any games.") - fi - packageList+=("wine") - if command -v curl &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Curl is installed." - else - errorList+=("Critical: Curl is not installed. Critical functionality will not work.") - fi - packageList+=("curl") - if command -v dialog &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Dialog is installed." - else - errorList+=("Critical: Dialog is not installed. You will not be able to install, launch, or remove any games.") - fi - packageList+=("dialog") - for i in 7z cabextract unzip xz ; do - if command -v $i &> /dev/null ; then - [[ $# -eq 0 ]] && echo "${i^} is installed." - else - errorList+=("Critical: ${i^} is not installed. You will not be able to install some games or their components.") - fi - packageList+=("$i") - done - if command -v gawk &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Gawk is installed." - else - errorList+=("Warning: gawk is not installed. Game removal with -r will not work.") - fi - packageList+=("gawk") - if command -v ocrdesktop &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Ocrdesktop is installed." - else - errorList+=("Warning: ocrdesktop is not installed. It can help if the installer gets stuck to figure out what is happening.") - fi - packageList+=("ocrdesktop") - if command -v qjoypad &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Qjoypad is installed." - else - errorList+=("Warning: qjoypad is not installed. Qjoypad allows you to play keyboard only games with a gamepad.") - fi - packageList+=("qjoypad") - if command -v sox &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Sox is installed." - else - errorList+=("Warning: Sox is not installed. Audio will not work.") - fi - packageList+=("sox") - if command -v trans &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Translate-shell is installed." - else - errorList+=("Warning: translate-shell is not installed. Games that require translation will not be translated.") - fi - packageList+=("translate-shell") - if command -v sqlite3 &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Sqlite3 is installed." - else - errorList+=("Warning: sqlite is not installed. Required for games that need to be translated.") - fi - if command -v perl &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Perl is installed." - else - errorList+=("Warning: perl is not installed. Required for games that need to be translated.") - fi - packageList+=("perl") - packageList+=("sqlite") - if command -v w3m &> /dev/null ; then - [[ $# -eq 0 ]] && echo "W3m is installed." - else - errorList+=("Warning: w3m is not installed. W3m is used to view game documentation.") - fi - packageList+=("w3m") - if command -v xclip &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Xclip is installed." - else - errorList+=("Warning: Xclip is not installed. Some games may not speak or register properly.") - fi - packageList+=("xclip") - if command -v xdotool &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Xdotool is installed." - else - errorList+=("Warning: Xdotool is not installed. Some installers may not work or may need manual intervention.") - fi - packageList+=("xdotool") - # Show the results - if [[ $# -ne 0 ]]; then - for i in "${packageList[@]}" ; do - echo "$i" - done | sort - exit 0 - fi - if [[ ${#errorList[@]} -eq 0 ]]; then - echo "No problems found, you are good to go." - exit 0 - fi - echo "Errors detected, here is a list along with the severity." - echo "Note that errors marked critical mean that you will not be able to install and play games until they are resolved." - for i in "${errorList[@]}" ; do - echo "$i" - done - exit 0 -} - clear_cache() { local answer if [[ ! -d "${cache}" ]]; then @@ -532,64 +316,6 @@ help() { exit 0 } -documentation() { - if [[ "$2" == "Become a Patron" ]]; then - return - fi - if [[ "$2" == "Donate" ]]; then - return - fi - if ! command -v w3m &> /dev/null ; then - echo "This feature of audiogame-manager requires w3m. Please install it before continuing." - exit 1 - fi - get_bottle "$1" -echo "Loading documentation, please wait..." - # Try to find documentation based on common naming conventions. - local gamePath="$(winepath -u "$2" 2> /dev/null)" - gamePath="${gamePath%/*}" - local gameDoc="$(find "$gamePath" -type f -iname 'user_manual.htm*' -or -iname 'user manual.htm*' -or -iname '*user guide.htm*' | head -1)" - # Game name specific docs, add the name to the for loop. - if [[ -z "$gameDoc" ]]; then - for i in "troopanum.txt" "superdeekout.txt" scw.html ; do - gameDoc="$(find "$gamePath" -type f -iname "$i" -or -iname 'manual.htm' | head -1)" - done - fi - if [[ -z "$gameDoc" ]]; then - gameDoc="$(find "$gamePath" -type f -path '*/Manual/index.html' | head -1)" - fi - if [[ -z "$gameDoc" ]]; then - gameDoc="$(find "$gamePath" -type f -iname '[A-Z]*Help.htm' -or -iname '[A-Z]*Help.html' | head -1)" - fi - if [[ -z "$gameDoc" ]]; then - gameDoc="$(find "$gamePath" -type f -iname 'manual.html' -or -iname 'manual.htm' | head -1)" - fi - if [[ -z "$gameDoc" ]]; then - gameDoc="$(find "$gamePath" -type f -iname 'en.html' -or -iname 'en.htm' | head -1)" - fi - if [[ -z "$gameDoc" ]]; then - gameDoc="$(find "$gamePath" -type f -iname 'readme.html' -or -iname 'readme.htm' | head -1)" - fi - if [[ -z "$gameDoc" ]]; then - gameDoc="$(find "$gamePath" -type f -iname 'manual.txt' | head -1)" - fi - if [[ -z "$gameDoc" ]]; then - gameDoc="$(find "$gamePath" -type f -iname 'readme.txt' -or -iname 'help.txt' | head -1)" - fi - if [[ -z "$gameDoc" ]]; then - gameDoc="$(find "$gamePath" -type f -iname '*.url' -exec grep -i 'url=' {} \; | grep -iv 'score' | head -1)" - gameDoc="${gameDoc#*=}" - gameDoc="${gameDoc//[[:cntrl:]]/}" - fi - # Display documentation if available. - if [[ -n "$gameDoc" ]]; then - w3m "$gameDoc" - else - echo "No documentation found." - fi - exit 0 -} - install_wine() { # Requires wine version, e.g. 7.7 and architecture, 32|64 if [[ $# -ne 2 ]]; then @@ -1070,6 +796,7 @@ game_launcher() { if [[ $menuCode -eq 1 ]] || [[ $menuCode -eq 255 ]]; then exit 0 elif [[ $menuCode -eq 3 ]]; then + source .includes/help.sh # Make available in this function documentation "$game" "$(echo "$game" | cut -d '|' -f2)" fi create_game_array @@ -1153,8 +880,7 @@ add_launcher() { } trap "exit 0" SIGINT -# Check for updates -update + # If display isn't set assume we are launching from console and an X environment is running using display :0 if [[ -z "$DISPLAY" ]]; then export DISPLAY=":0" @@ -1196,21 +922,18 @@ export ipfsGateway="${ipfsGateway:-https://ipfs.stormux.org}" export nvdaControllerClientDll="${ipfsGateway}/ipfs/QmWu7YdSbKMk1Qm5DKvEA5hk1YuAK8wVkwhDf2CsmPkmF1?filename=nvdaControllerClient32.dll" -# Make sure the minimum of curl, sox, wine, and winetricks are installed or fex-emu on aarch64 -if [[ "$(uname -m)" == "aarch64" ]]; then - minimumDependencies=("FEXLoader") - wine="FEXLoader -- /usr/bin/wine" -else - minimumDependencies=("curl" "sox" "wine") -fi -for i in "${minimumDependencies[@]}" ; do - if ! command -v $i &> /dev/null ; then - echo "Please install $i before continuing." - exit 1 - fi -done +# Source helper functions +source .includes/functions.sh +source .includes/help.sh +source .includes/update.sh + +# Check minimum requirements +check_requirements || exit 1 +# Check for updates +update # Get latest news if available check_news + # With no arguments, open the game launcher. if [[ $# -eq 0 ]]; then game_launcher @@ -1245,7 +968,7 @@ args="${!command[*]}" args="${args//[[:space:]]/}" while getopts "${args}" i ; do case "$i" in - c) checklist;; + c) ./.includes/checkup.sh;; C) clear_cache;; D) desktop_launcher;; d) From 6e4d7bae8d11a18de750fe38b05f712e64768351 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 18 May 2025 20:16:22 -0400 Subject: [PATCH 02/77] More conversion to a modular system. --- .includes/desktop.sh | 35 ++++++++++++ .includes/functions.sh | 61 ++++++++++++++++++++ .includes/help.sh | 27 +++++++++ audiogame-manager.sh | 126 ----------------------------------------- 4 files changed, 123 insertions(+), 126 deletions(-) create mode 100644 .includes/desktop.sh diff --git a/.includes/desktop.sh b/.includes/desktop.sh new file mode 100644 index 0000000..b881de2 --- /dev/null +++ b/.includes/desktop.sh @@ -0,0 +1,35 @@ +# Create desktop launcher file +desktop_launcher() { + local desktopFile="${HOME}/audiogame-manager.desktop" + if [[ -e "${desktopFile}" ]]; then + echo "the file ${desktopFile} exists. Cannot create the launcher." + exit 1 + fi + local dotDesktop + local terminal + # Try to find an accessible terminal + for i in mate-terminal lxterminal terminator gnome-terminal ; do + if command -v $i &> /dev/null ; then + terminal="$i" + break + fi + done + dotDesktop=('[Desktop Entry]' + 'Name=Audiogame manager' + 'GenericName=Audiogame Manager' + 'Comment=Play audio games' + "Exec=${terminal} -t \"Audiogame Manager\" -e \"/usr/bin/bash -c 'nohup $(readlink -e "$0") 2> /dev/null'\"" + 'Terminal=false' + 'Type=Application' + 'StartupNotify=false' + 'Keywords=game;' + 'Categories=Game;' + 'Version=1.0') + for i in "${dotDesktop[@]}" ; do + echo "$i" >> "${desktopFile}" + done + desktop-file-install --dir "${HOME}/.local/share/applications" -m 755 "${desktopFile}" + xdg-desktop-icon install ~/.local/share/applications/audiogame-manager.desktop + rm "${desktopFile}" + exit 0 +} diff --git a/.includes/functions.sh b/.includes/functions.sh index dd40b8c..6a39edf 100644 --- a/.includes/functions.sh +++ b/.includes/functions.sh @@ -22,6 +22,67 @@ check_requirements() { return 0 } +download() { + local source=($@) + for i in "${source[@]}" ; do + local dest="${i##*/}" + dest="${dest//%20/ }" + dest="${dest#*\?filename=}" + dest="${dest%\?*}" + # Remove the destination file if it is empty. + [[ -s "${cache}/${dest}" ]] || rm -f "${cache}/${dest}" 2> /dev/null + if [[ "${redownload}" == "true" ]] && [[ -e "${cache}/${dest}" ]]; then + rm -v "${cache}/${dest}" + fi + # Skip if the item is in cache. + [[ -e "${cache}/${dest}" ]] && continue + { if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" ; then + echo "Could not download \"$i\"..." + exit 1 + fi; } | dialog --backtitle "Audio Game Manager" \ + --progressbox "Downloading \"$dest\" from \"$i\"" -1 -1 + local downloadError=1 + case "${dest##*.}" in + "pk3"|"zip") + unzip -tq "${cache}/${dest}" | dialog --backtitle "Audio Game Manager" \ + --progressbox "Validating ${dest##*.} file" -1 -1 --stdout + downloadError=$? + ;; + "7z") + 7z t "${cache}/${dest}" | dialog --backtitle "Audio Game Manager" \ + --progressbox "Validating 7z file" -1 -1 --stdout + downloadError=$? + ;; + "exe") + # Check if it's a valid Windows executable by looking at the MZ header + hexdump -n 2 -v -e '/1 "%02X"' "${cache}/${dest}" | grep -q "4D5A" + downloadError=$? + ;; + "wad") + if [[ "$(file -b --mime-type "${cache}/${dest}")" != "application/octet-stream" ]]; then + downloadError=0 + fi + ;; + *) + # Add HTML check for other file types + if file -b "${cache}/${dest}" | grep -q "HTML document" ; then + echo "File not found: \"$i\" (HTML document probably 404)" + downloadError=1 + else + downloadError=0 + fi + ;; + esac + if [[ $downloadError -ne 0 ]]; then + rm -fv "${cache}/${dest}" + dialog --backtitle "Audio Game Manager" \ + --infobox "Error downloading \"${dest}\". Installation cannot continue." -1 -1 --stdout + alert + exit 1 + fi + done +} + # Function to open urls across OS. open_url() { if [[ "$(uname)" == "Darwin" ]]; then diff --git a/.includes/help.sh b/.includes/help.sh index e710959..3ee8097 100644 --- a/.includes/help.sh +++ b/.includes/help.sh @@ -56,6 +56,33 @@ echo "Loading documentation, please wait..." exit 0 } +help() { + echo "${0##*/}" + echo "Released under the terms of the Common Public Attribution License Version 1.0" + echo -e "This is a Stormux project: https://stormux.org\n" + echo -e "Usage:\n" + echo "With no arguments, open the game launcher." + for i in "${!command[@]}" ; do + echo "-${i/:/ }: ${command[${i}]}" + done | sort + echo + echo "Some settings that are often used can be stored in a settings.conf file." + echo "If wanted, place it at the following location:" + echo "${configFile%/*}/settings.conf" + echo "The syntax is variable=\"value\"" + echo + echo "ipfsGateway=\"https://ipfs.stormux.org\" # Gateway to be used for ipfs downloads." + echo "noCache=\"true\" # Do not keep downloaded items in the cache." + echo "noqjoypad=\"true\" # Do not launch qjoypad." + echo "norh=\"true\" # Do not install RHVoice." + echo "redownload=\"true\" # Redownload sources, do not use the version stored in cache." + echo "voiceName=\"voicename\" # Select the voice to be installed (default Bdl)." + echo "defaultVoice=\"voicename\" # Select the default voice to use for the bottle, e.g. MSMike or RHVoice." + echo "defaultRate=\"Default voice rate for the bottle, default 7, may not work in all games. Values 1-9 or A." + echo "winedebug=\"flag(s)\" # Set wine debug flags, useful for development." + exit 0 +} + license() { cat << EOF ■The contents of this file are subject to the Common Public Attribution diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 14bc1e2..8bdc0ae 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -3,44 +3,6 @@ # Dialog accessibility export DIALOGOPTS='--no-lines --visit-items' - -# Create desktop launcher file -desktop_launcher() { - local desktopFile="${HOME}/audiogame-manager.desktop" - if [[ -e "${desktopFile}" ]]; then - echo "the file ${desktopFile} exists. Cannot create the launcher." - exit 1 - fi - local dotDesktop - local terminal - # Try to find an accessible terminal - for i in mate-terminal lxterminal terminator gnome-terminal ; do - if command -v $i &> /dev/null ; then - terminal="$i" - break - fi - done - dotDesktop=('[Desktop Entry]' - 'Name=Audiogame manager' - 'GenericName=Audiogame Manager' - 'Comment=Play audio games' - "Exec=${terminal} -t \"Audiogame Manager\" -e \"/usr/bin/bash -c 'nohup $(readlink -e "$0") 2> /dev/null'\"" - 'Terminal=false' - 'Type=Application' - 'StartupNotify=false' - 'Keywords=game;' - 'Categories=Game;' - 'Version=1.0') - for i in "${dotDesktop[@]}" ; do - echo "$i" >> "${desktopFile}" - done - desktop-file-install --dir "${HOME}/.local/share/applications" -m 755 "${desktopFile}" - xdg-desktop-icon install ~/.local/share/applications/audiogame-manager.desktop - rm "${desktopFile}" - exit 0 -} - - # Wine configuration section clear_cache() { @@ -63,67 +25,6 @@ clear_cache() { echo "Cache deleted." } -download() { - local source=($@) - for i in "${source[@]}" ; do - local dest="${i##*/}" - dest="${dest//%20/ }" - dest="${dest#*\?filename=}" - dest="${dest%\?*}" - # Remove the destination file if it is empty. - [[ -s "${cache}/${dest}" ]] || rm -f "${cache}/${dest}" 2> /dev/null - if [[ "${redownload}" == "true" ]] && [[ -e "${cache}/${dest}" ]]; then - rm -v "${cache}/${dest}" - fi - # Skip if the item is in cache. - [[ -e "${cache}/${dest}" ]] && continue - { if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" ; then - echo "Could not download \"$i\"..." - exit 1 - fi; } | dialog --backtitle "Audio Game Manager" \ - --progressbox "Downloading \"$dest\" from \"$i\"" -1 -1 - local downloadError=1 - case "${dest##*.}" in - "pk3"|"zip") - unzip -tq "${cache}/${dest}" | dialog --backtitle "Audio Game Manager" \ - --progressbox "Validating ${dest##*.} file" -1 -1 --stdout - downloadError=$? - ;; - "7z") - 7z t "${cache}/${dest}" | dialog --backtitle "Audio Game Manager" \ - --progressbox "Validating 7z file" -1 -1 --stdout - downloadError=$? - ;; - "exe") - # Check if it's a valid Windows executable by looking at the MZ header - hexdump -n 2 -v -e '/1 "%02X"' "${cache}/${dest}" | grep -q "4D5A" - downloadError=$? - ;; - "wad") - if [[ "$(file -b --mime-type "${cache}/${dest}")" != "application/octet-stream" ]]; then - downloadError=0 - fi - ;; - *) - # Add HTML check for other file types - if file -b "${cache}/${dest}" | grep -q "HTML document" ; then - echo "File not found: \"$i\" (HTML document probably 404)" - downloadError=1 - else - downloadError=0 - fi - ;; - esac - if [[ $downloadError -ne 0 ]]; then - rm -fv "${cache}/${dest}" - dialog --backtitle "Audio Game Manager" \ - --infobox "Error downloading \"${dest}\". Installation cannot continue." -1 -1 --stdout - alert - exit 1 - fi - done -} - get_bottle() { # Handles games that use the same wine bottle case "${game}" in @@ -289,33 +190,6 @@ get_steam() { exit 1; } } -help() { - echo "${0##*/}" - echo "Released under the terms of the Common Public Attribution License Version 1.0" - echo -e "This is a Stormux project: https://stormux.org\n" - echo -e "Usage:\n" - echo "With no arguments, open the game launcher." - for i in "${!command[@]}" ; do - echo "-${i/:/ }: ${command[${i}]}" - done | sort - echo - echo "Some settings that are often used can be stored in a settings.conf file." - echo "If wanted, place it at the following location:" - echo "${configFile%/*}/settings.conf" - echo "The syntax is variable=\"value\"" - echo - echo "ipfsGateway=\"https://ipfs.stormux.org\" # Gateway to be used for ipfs downloads." - echo "noCache=\"true\" # Do not keep downloaded items in the cache." - echo "noqjoypad=\"true\" # Do not launch qjoypad." - echo "norh=\"true\" # Do not install RHVoice." - echo "redownload=\"true\" # Redownload sources, do not use the version stored in cache." - echo "voiceName=\"voicename\" # Select the voice to be installed (default Bdl)." - echo "defaultVoice=\"voicename\" # Select the default voice to use for the bottle, e.g. MSMike or RHVoice." - echo "defaultRate=\"Default voice rate for the bottle, default 7, may not work in all games. Values 1-9 or A." - echo "winedebug=\"flag(s)\" # Set wine debug flags, useful for development." - exit 0 -} - install_wine() { # Requires wine version, e.g. 7.7 and architecture, 32|64 if [[ $# -ne 2 ]]; then From 31018bc55f5c3d5da03e97ef9ef41f089910c976 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 18 May 2025 20:50:52 -0400 Subject: [PATCH 03/77] Everything moved to it's new file for now. Cleanup is well under way. Improved the unix2dos function. --- .includes/bottle.sh | 261 ++++++++++++++++++++++++++++ .includes/functions.sh | 105 ++++++++++++ audiogame-manager.sh | 379 +---------------------------------------- 3 files changed, 371 insertions(+), 374 deletions(-) create mode 100644 .includes/bottle.sh diff --git a/.includes/bottle.sh b/.includes/bottle.sh new file mode 100644 index 0000000..cc81266 --- /dev/null +++ b/.includes/bottle.sh @@ -0,0 +1,261 @@ +get_bottle() { + # Handles games that use the same wine bottle + case "${game}" in + # Aprone (Jeremy Kaldobsky) games. + "castaways"*) ;& + "castaways-2"*) ;& + "daytona-and-the-book-of-gold"*) ;& + "dog-who-hates-toast"*) ;& + "lunimals"*) ;& + "paw-prints"*) ;& + "penta-path"*) ;& + "preludeamals"*) ;& + "puzzle-divided"*) ;& + "rettou"*) ;& + "revelation"*) ;& + "swamp"*) ;& + "tarot-assistant"*) ;& + "triple-triad"*) + export WINEPREFIX="${HOME}/.local/wine/aprone" ;; + "bg-"*) export WINEPREFIX="${HOME}/.local/wine/bg";; + # draconis games + "esp-pinball-classic"*) ;& + "esp-pinball-extreme"*) ;& + "esp-pinball-party-pack"*) ;& + "silver-dollar"*) ;& + "monkey-business"*) ;& + "alien-outback"*) ;& + "dyna-man"*) ;& + "change-reaction"*) ;& + "ten-pin-alley"*) export WINEPREFIX="${HOME}/.local/wine/draconis";; + # l-works games group + "duck-hunt"*) ;& + "judgement-day"*) ;& + "lockpick"*) ;& + "pigeon-panic"*) ;& + "smashathon"*) ;& + "super-egg-hunt"*) ;& + "super-liam"*) ;& + "the-great-toy-robbery"*) export WINEPREFIX="${HOME}/.local/wine/l-works";; + # Nyanchan games group + "bokurano-daibouken"*) ;& + "laser-breakout"*) ;& + "marina-break"*) ;& + "mp5"*) ;& + "screaming-strike-2"*) ;& + "world-of-war"*) export WINEPREFIX="${HOME}/.local/wine/nyanchan";; + # Oriol Gomez games group + "bombercats"*) ;& + "copter-mission"*) ;& + "danger-on-the-wheel"*) ;& + "death-on-the-road"*) ;& + "fuck-that-bird"*) ;& + "hammer-of-glory"*) ;& + "insect-therapy"*) ;& + "rhythm-rage"*) ;& + "run-for-your-life"*) ;& + "thief"*) ;& + "villains-from-beyond"*) export WINEPREFIX="${HOME}/.local/wine/oriol-gomez";; + # pbgames group + "dark-destroyer"*) ;& + "PBGames TMP") export WINEPREFIX="$HOME/.local/wine/pbgames" ;; + # tunmi13 games group + "battle-of-the-hunter"*) ;& + "clashes-of-the-sky"*) ;& + "challenge-of-the-horse"*) export WINEPREFIX="${HOME}/.local/wine/tunmi13";; + # tunmi13-64bit games group + "battlefield-2d"*) ;& + "haunted-party"*) ;& + "skateboarder-pro"*) export WINEPREFIX="${HOME}/.local/wine/tunmi13-64bit";; + # Dan Z games group + "lost"*) ;& + "maze-craze"*) ;& + "super-deekout"*) + export norh="true" + export WINEPREFIX="$HOME/.local/wine/dan-z" + ;; + *) export WINEPREFIX="${HOME}/.local/wine/${game%|*}";; + esac + # 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 "$HOME/.local/wine/${bottle}/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() { + # 32 bit installations work best and are the default here, if you need to override it, do it in the game specific installation steps. + 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" + if [[ -z "$bottle" ]]; 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 + export WINEPREFIX="$HOME/.local/wine/${bottle}" + # 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 + # This is in a brace list to pipe through dialog. + { 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:-winxp} ${winetricksSettings}; } | dialog --progressbox "Installing wine bottle, please wait..." -1 -1 + # make it easy for game scripts to know which version of wine to use. + echo "WINE=\"${WINE}\"" > "$HOME/.local/wine/${bottle}/agm.conf" + echo "WINESERVER=\"${WINESERVER}\"" >> "$HOME/.local/wine/${bottle}/agm.conf" + # If default voice is set, change it for the bottle + if [[ ${#defaultVoice} -ge 2 ]] && [[ "${*}" =~ (speechsdk|sapi) ]]; then + echo "Setting default voice for bottle \"${bottle}\" to \"${defaultVoice}\"." + "${0%/*}/speech/set-voice.sh" -b "${bottle}" -r "${defaultRate:-7}" -v "${defaultVoice}" + fi +} + +add_launcher() { + local launchSettings="${game,,}" + launchSettings="${launchSettings//[[:space:]]/-}|${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 +} diff --git a/.includes/functions.sh b/.includes/functions.sh index 6a39edf..1d98a1d 100644 --- a/.includes/functions.sh +++ b/.includes/functions.sh @@ -22,6 +22,26 @@ check_requirements() { return 0 } +clear_cache() { + local answer + if [[ ! -d "${cache}" ]]; then + echo "No cache found at ${cache}." + return + fi + while ! [[ "${answer,,}" =~ ^yes$|^no$ ]]; do + echo "This will delete all contents of ${cache}. Are you sure you want to continue?" + echo "Please type yes or no." + echo + read -r answer + done + if [[ "$answer" == "no" ]]; then + return + fi + # All safety checks done. Delete the cache. + rm -rfv "${cache}" + echo "Cache deleted." +} + download() { local source=($@) for i in "${source[@]}" ; do @@ -83,6 +103,81 @@ download() { done } +get_installer() { + trap "exit 0" SIGINT + # If the file is in cache nothing else needs to be done. + if [[ -f "${cache}/$1" ]]; then + return + fi + # Create message for dialog. + local message="Make sure $1 is available in either your Downloads or Desktop directory and press enter to continue." + if [[ -n "$2" ]]; then + message+="\n\nThe last good known URL for $game is:" + message+="\n$2" + fi + if echo "$2" | xclip -selection clipboard 2> /dev/null ; then + message+="\n\nThe URL has been copied to the clipboard." + fi + dialog --ok-label "Continue" \ + --backtitle "Audiogame Manager" \ + --msgbox "$message" -1 -1 + # Search the Desktop and Downloads directories for the installation file + for i in ~/Downloads ~/Desktop ; do + find $i -type f -name "$1" -exec cp -v {} "${cache}/" \; + done + # If the file is still not available abort. + if [[ ! -f "${cache}/$1" ]]; then + echo "couldn't find $1. Please download the file and try again." + exit 1 + fi +} + +get_steam() { + # Arguments: $1 id of item for download, $2 url for game + trap "exit 0" SIGINT + echo "manual intervention required." + alert + dialog --backtitle "Audiogame Manager" \ + --yes-label "Continue with Steam" \ + --no-label "Install manually" \ + --extra-button \ + --extra-label "Exit" \ + --yesno "To install the game manually, place files in \"${WINEPREFIX}/drive_c/Program Files/${game}\"" -1 -1 --stdout + case $? in + 0) echo "The next steps will install through steamcmd." ;; + 1) + mkdir -p "${WINEPREFIX}/drive_c/Program Files/${game}" + dialog --backtitle "Audiogame Manager" \ + --msgbox "Place game files in \"${WINEPREFIX}/drive_c/Program Files/${game}\" and press enter to continue." -1 -1 --stdout + return + ;; + *) exit 0 ;; + esac + # Check for steamcmd + if ! command -v steamcmd &> /dev/null ; then + dialog --backtitle "Audiogame Manager" \ + --infobox "This installer requires steamcmd. Please install steamcmd and try again." -1 -1 + exit 1 + fi + # Create message for dialog. + local message="Make sure ${game} is available in your Steam library and press enter to continue. The URL for ${game} is $2" + if echo "$2" | xclip -selection clipboard 2> /dev/null ; then + message+="\n\nThe URL has been copied to the clipboard." + fi + dialog --ok-label "Continue" \ + --backtitle "Audiogame Manager" \ + --msgbox "$message" -1 -1 + # Get Steam user name. + steamUser="$(dialog --ok-label "Continue" \ + --backtitle "Audiogame Manager" \ + --inputbox "Please enter your Steam user name:" -1 -1 --stdout)" + # Download the game + mkdir -p "${WINEPREFIX}/drive_c/Program Files/${game}" + steamcmd +@sSteamCmdForcePlatformType windows +force_install_dir "${WINEPREFIX}/drive_c/Program Files/$game" +login "$steamUser" +app_update "$1" +quit || { dialog --backtitle "Audiogame Manager" \ + --infobox "Something went wrong. Please make sure you have a stable internet connection, and if the problem persists, contact audiogame-manager's developers." -1 -1 + exit 1; } +} + # Function to open urls across OS. open_url() { if [[ "$(uname)" == "Darwin" ]]; then @@ -91,3 +186,13 @@ open_url() { xdg-open "${*}" 2> /dev/null fi } + +unix2dos() { + if [[ $# -eq 0 ]]; then + echo "Usage: unix2dos file(s)." + exit 1 + fi + for file in "$@"; do + sed -i 's/\r\{0,\}$/\r/' "$file" + done +} diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 8bdc0ae..1822ad0 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -3,352 +3,6 @@ # Dialog accessibility export DIALOGOPTS='--no-lines --visit-items' -# Wine configuration section - -clear_cache() { - local answer - if [[ ! -d "${cache}" ]]; then - echo "No cache found at ${cache}." - return - fi - while ! [[ "${answer,,}" =~ ^yes$|^no$ ]]; do - echo "This will delete all contents of ${cache}. Are you sure you want to continue?" - echo "Please type yes or no." - echo - read -r answer - done - if [[ "$answer" == "no" ]]; then - return - fi - # All safety checks done. Delete the cache. - rm -rfv "${cache}" - echo "Cache deleted." -} - -get_bottle() { - # Handles games that use the same wine bottle - case "${game}" in - # Aprone (Jeremy Kaldobsky) games. - "castaways"*) ;& - "castaways-2"*) ;& - "daytona-and-the-book-of-gold"*) ;& - "dog-who-hates-toast"*) ;& - "lunimals"*) ;& - "paw-prints"*) ;& - "penta-path"*) ;& - "preludeamals"*) ;& - "puzzle-divided"*) ;& - "rettou"*) ;& - "revelation"*) ;& - "swamp"*) ;& - "tarot-assistant"*) ;& - "triple-triad"*) - export WINEPREFIX="${HOME}/.local/wine/aprone" ;; - "bg-"*) export WINEPREFIX="${HOME}/.local/wine/bg";; - # draconis games - "esp-pinball-classic"*) ;& - "esp-pinball-extreme"*) ;& - "esp-pinball-party-pack"*) ;& - "silver-dollar"*) ;& - "monkey-business"*) ;& - "alien-outback"*) ;& - "dyna-man"*) ;& - "change-reaction"*) ;& - "ten-pin-alley"*) export WINEPREFIX="${HOME}/.local/wine/draconis";; - # l-works games group - "duck-hunt"*) ;& - "judgement-day"*) ;& - "lockpick"*) ;& - "pigeon-panic"*) ;& - "smashathon"*) ;& - "super-egg-hunt"*) ;& - "super-liam"*) ;& - "the-great-toy-robbery"*) export WINEPREFIX="${HOME}/.local/wine/l-works";; - # Nyanchan games group - "bokurano-daibouken"*) ;& - "laser-breakout"*) ;& - "marina-break"*) ;& - "mp5"*) ;& - "screaming-strike-2"*) ;& - "world-of-war"*) export WINEPREFIX="${HOME}/.local/wine/nyanchan";; - # Oriol Gomez games group - "bombercats"*) ;& - "copter-mission"*) ;& - "danger-on-the-wheel"*) ;& - "death-on-the-road"*) ;& - "fuck-that-bird"*) ;& - "hammer-of-glory"*) ;& - "insect-therapy"*) ;& - "rhythm-rage"*) ;& - "run-for-your-life"*) ;& - "thief"*) ;& - "villains-from-beyond"*) export WINEPREFIX="${HOME}/.local/wine/oriol-gomez";; - # pbgames group - "dark-destroyer"*) ;& - "PBGames TMP") export WINEPREFIX="$HOME/.local/wine/pbgames" ;; - # tunmi13 games group - "battle-of-the-hunter"*) ;& - "clashes-of-the-sky"*) ;& - "challenge-of-the-horse"*) export WINEPREFIX="${HOME}/.local/wine/tunmi13";; - # tunmi13-64bit games group - "battlefield-2d"*) ;& - "haunted-party"*) ;& - "skateboarder-pro"*) export WINEPREFIX="${HOME}/.local/wine/tunmi13-64bit";; - # Dan Z games group - "lost"*) ;& - "maze-craze"*) ;& - "super-deekout"*) - export norh="true" - export WINEPREFIX="$HOME/.local/wine/dan-z" - ;; - *) export WINEPREFIX="${HOME}/.local/wine/${game%|*}";; - esac - # 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 -} - -get_installer() { - trap "exit 0" SIGINT - # If the file is in cache nothing else needs to be done. - if [[ -f "${cache}/$1" ]]; then - return - fi - # Create message for dialog. - local message="Make sure $1 is available in either your Downloads or Desktop directory and press enter to continue." - if [[ -n "$2" ]]; then - message+="\n\nThe last good known URL for $game is:" - message+="\n$2" - fi - if echo "$2" | xclip -selection clipboard 2> /dev/null ; then - message+="\n\nThe URL has been copied to the clipboard." - fi - dialog --ok-label "Continue" \ - --backtitle "Audiogame Manager" \ - --msgbox "$message" -1 -1 - # Search the Desktop and Downloads directories for the installation file - for i in ~/Downloads ~/Desktop ; do - find $i -type f -name "$1" -exec cp -v {} "${cache}/" \; - done - # If the file is still not available abort. - if [[ ! -f "${cache}/$1" ]]; then - echo "couldn't find $1. Please download the file and try again." - exit 1 - fi -} - -get_steam() { - # Arguments: $1 id of item for download, $2 url for game - trap "exit 0" SIGINT - echo "manual intervention required." - alert - dialog --backtitle "Audiogame Manager" \ - --yes-label "Continue with Steam" \ - --no-label "Install manually" \ - --extra-button \ - --extra-label "Exit" \ - --yesno "To install the game manually, place files in \"${WINEPREFIX}/drive_c/Program Files/${game}\"" -1 -1 --stdout - case $? in - 0) echo "The next steps will install through steamcmd." ;; - 1) - mkdir -p "${WINEPREFIX}/drive_c/Program Files/${game}" - dialog --backtitle "Audiogame Manager" \ - --msgbox "Place game files in \"${WINEPREFIX}/drive_c/Program Files/${game}\" and press enter to continue." -1 -1 --stdout - return - ;; - *) exit 0 ;; - esac - # Check for steamcmd - if ! command -v steamcmd &> /dev/null ; then - dialog --backtitle "Audiogame Manager" \ - --infobox "This installer requires steamcmd. Please install steamcmd and try again." -1 -1 - exit 1 - fi - # Create message for dialog. - local message="Make sure ${game} is available in your Steam library and press enter to continue. The URL for ${game} is $2" - if echo "$2" | xclip -selection clipboard 2> /dev/null ; then - message+="\n\nThe URL has been copied to the clipboard." - fi - dialog --ok-label "Continue" \ - --backtitle "Audiogame Manager" \ - --msgbox "$message" -1 -1 - # Get Steam user name. - steamUser="$(dialog --ok-label "Continue" \ - --backtitle "Audiogame Manager" \ - --inputbox "Please enter your Steam user name:" -1 -1 --stdout)" - # Download the game - mkdir -p "${WINEPREFIX}/drive_c/Program Files/${game}" - steamcmd +@sSteamCmdForcePlatformType windows +force_install_dir "${WINEPREFIX}/drive_c/Program Files/$game" +login "$steamUser" +app_update "$1" +quit || { dialog --backtitle "Audiogame Manager" \ - --infobox "Something went wrong. Please make sure you have a stable internet connection, and if the problem persists, contact audiogame-manager's developers." -1 -1 - exit 1; } -} - -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 -} - - -unix2dos() { - if [[ $# -eq 0 ]]; then - echo "Usage: unix2dos file(s)." - exit 1 - fi - for file in "${@}" ; do - sed -i 's/$/\r/' "${file}" - done -} - - -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 "$HOME/.local/wine/${bottle}/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() { - # 32 bit installations work best and are the default here, if you need to override it, do it in the game specific installation steps. - 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" - if [[ -z "$bottle" ]]; 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 - export WINEPREFIX="$HOME/.local/wine/${bottle}" - # 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 - # This is in a brace list to pipe through dialog. - { 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:-winxp} ${winetricksSettings}; } | dialog --progressbox "Installing wine bottle, please wait..." -1 -1 - # make it easy for game scripts to know which version of wine to use. - echo "WINE=\"${WINE}\"" > "$HOME/.local/wine/${bottle}/agm.conf" - echo "WINESERVER=\"${WINESERVER}\"" >> "$HOME/.local/wine/${bottle}/agm.conf" - # If default voice is set, change it for the bottle - if [[ ${#defaultVoice} -ge 2 ]] && [[ "${*}" =~ (speechsdk|sapi) ]]; then - echo "Setting default voice for bottle \"${bottle}\" to \"${defaultVoice}\"." - "${0%/*}/speech/set-voice.sh" -b "${bottle}" -r "${defaultRate:-7}" -v "${defaultVoice}" - fi -} - - # Install games game_installer() { export LANG="en_US.UTF-8" @@ -421,6 +75,7 @@ game_installer() { # remove games game_removal() { + source .includes/bottle.sh if [[ "$(uname -m)" == "aarch64" ]]; then export wine="${wine:-/usr/bin/wine}" else @@ -481,6 +136,7 @@ game_removal() { # kill games that are stuck kill_game() { + source .includes/bottle.sh if [[ "$(uname -m)" == "aarch64" ]]; then export wine="${wine:-/usr/bin/wine}" else @@ -636,6 +292,7 @@ create_game_array() { game_launcher() { # For use by update scripts that want to source functions in this file. [[ "$agmNoLaunch" == "true" ]] && return + source .includes/bottle.sh pgrep -u "$USER" nvda2speechd &> /dev/null || { if [[ -x ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd ]]; then if command -v FEXLoader &> /dev/null ; then @@ -725,34 +382,6 @@ game_launcher() { # main script -#functions - -add_launcher() { - local launchSettings="${game,,}" - launchSettings="${launchSettings//[[:space:]]/-}|${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 -} - trap "exit 0" SIGINT # If display isn't set assume we are launching from console and an X environment is running using display :0 @@ -797,6 +426,8 @@ export nvdaControllerClientDll="${ipfsGateway}/ipfs/QmWu7YdSbKMk1Qm5DKvEA5hk1YuA # Source helper functions +source .includes/bottle.sh # Also sourced in functions that need it +source .includes/desktop.sh source .includes/functions.sh source .includes/help.sh source .includes/update.sh From faba6bcbcbbba0d03e2673fdfb0762ef5f39bfec Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Mon, 19 May 2025 00:09:35 -0400 Subject: [PATCH 04/77] Work on unifying bottles for wine. Most games should now install to 1 of 2 possible locations, ~/.local/wine32 or ~/.local/wine64. Untested, will probably break a lot of things, do not use yet. --- .includes/bottle.sh | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index cc81266..11bca66 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -179,14 +179,15 @@ install_rhvoice() { } install_wine_bottle() { - # 32 bit installations work best and are the default here, if you need to override it, do it in the game specific installation steps. + # 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" - if [[ -z "$bottle" ]]; then + # 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 @@ -194,7 +195,12 @@ install_wine_bottle() { exit 1 fi fi - export WINEPREFIX="$HOME/.local/wine/${bottle}" + if [[ -z "$WINEARCH" ]] || [[ "${WINEARCH}" == "win64" ]]; then + local architecture=64 + else + local architecture=32 + fi + export WINEPREFIX="$HOME/.local/wine${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)" @@ -207,8 +213,7 @@ install_wine_bottle() { 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 - # This is in a brace list to pipe through dialog. - { echo -n "Using " + echo -n "Using " ${wine} --version DISPLAY="" ${wine}boot -u ${wine} msiexec /i z:"$monoPath" /quiet @@ -223,15 +228,21 @@ install_wine_bottle() { 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:-winxp} ${winetricksSettings}; } | dialog --progressbox "Installing wine bottle, please wait..." -1 -1 + winetricks -q isolate_home $@ ${winVer:-win7} ${winetricksSettings} # make it easy for game scripts to know which version of wine to use. - echo "WINE=\"${WINE}\"" > "$HOME/.local/wine/${bottle}/agm.conf" - echo "WINESERVER=\"${WINESERVER}\"" >> "$HOME/.local/wine/${bottle}/agm.conf" - # If default voice is set, change it for the bottle - if [[ ${#defaultVoice} -ge 2 ]] && [[ "${*}" =~ (speechsdk|sapi) ]]; then + 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() { From d9ef202b33b731f14386060da755e49005c269a6 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 20 May 2025 05:13:22 -0400 Subject: [PATCH 05/77] more progress, but create_game_array is horribly broken. --- .includes/bottle.sh | 88 +++---------------------------------------- .install/Bloodshed.sh | 1 - .install/RS Games.sh | 5 +-- audiogame-manager.sh | 5 +-- 4 files changed, 9 insertions(+), 90 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index 11bca66..cc7b8e6 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -1,81 +1,6 @@ get_bottle() { - # Handles games that use the same wine bottle - case "${game}" in - # Aprone (Jeremy Kaldobsky) games. - "castaways"*) ;& - "castaways-2"*) ;& - "daytona-and-the-book-of-gold"*) ;& - "dog-who-hates-toast"*) ;& - "lunimals"*) ;& - "paw-prints"*) ;& - "penta-path"*) ;& - "preludeamals"*) ;& - "puzzle-divided"*) ;& - "rettou"*) ;& - "revelation"*) ;& - "swamp"*) ;& - "tarot-assistant"*) ;& - "triple-triad"*) - export WINEPREFIX="${HOME}/.local/wine/aprone" ;; - "bg-"*) export WINEPREFIX="${HOME}/.local/wine/bg";; - # draconis games - "esp-pinball-classic"*) ;& - "esp-pinball-extreme"*) ;& - "esp-pinball-party-pack"*) ;& - "silver-dollar"*) ;& - "monkey-business"*) ;& - "alien-outback"*) ;& - "dyna-man"*) ;& - "change-reaction"*) ;& - "ten-pin-alley"*) export WINEPREFIX="${HOME}/.local/wine/draconis";; - # l-works games group - "duck-hunt"*) ;& - "judgement-day"*) ;& - "lockpick"*) ;& - "pigeon-panic"*) ;& - "smashathon"*) ;& - "super-egg-hunt"*) ;& - "super-liam"*) ;& - "the-great-toy-robbery"*) export WINEPREFIX="${HOME}/.local/wine/l-works";; - # Nyanchan games group - "bokurano-daibouken"*) ;& - "laser-breakout"*) ;& - "marina-break"*) ;& - "mp5"*) ;& - "screaming-strike-2"*) ;& - "world-of-war"*) export WINEPREFIX="${HOME}/.local/wine/nyanchan";; - # Oriol Gomez games group - "bombercats"*) ;& - "copter-mission"*) ;& - "danger-on-the-wheel"*) ;& - "death-on-the-road"*) ;& - "fuck-that-bird"*) ;& - "hammer-of-glory"*) ;& - "insect-therapy"*) ;& - "rhythm-rage"*) ;& - "run-for-your-life"*) ;& - "thief"*) ;& - "villains-from-beyond"*) export WINEPREFIX="${HOME}/.local/wine/oriol-gomez";; - # pbgames group - "dark-destroyer"*) ;& - "PBGames TMP") export WINEPREFIX="$HOME/.local/wine/pbgames" ;; - # tunmi13 games group - "battle-of-the-hunter"*) ;& - "clashes-of-the-sky"*) ;& - "challenge-of-the-horse"*) export WINEPREFIX="${HOME}/.local/wine/tunmi13";; - # tunmi13-64bit games group - "battlefield-2d"*) ;& - "haunted-party"*) ;& - "skateboarder-pro"*) export WINEPREFIX="${HOME}/.local/wine/tunmi13-64bit";; - # Dan Z games group - "lost"*) ;& - "maze-craze"*) ;& - "super-deekout"*) - export norh="true" - export WINEPREFIX="$HOME/.local/wine/dan-z" - ;; - *) export WINEPREFIX="${HOME}/.local/wine/${game%|*}";; - esac + local architecture="${1/win/}" + export WINEPREFIX="$HOME/.local/wine${architecture}" # Wine version for bottles if [[ "$game" =~ entombed ]]; then install_wine "6.18" "32" @@ -145,7 +70,7 @@ winetricks() { } install_rhvoice() { - if [[ -d "$HOME/.local/wine/${bottle}/drive_c/Program Files/Olga Yakovleva/" ]]; then + if [[ -d "${WINEPREFIX}/drive_c/Program Files/Olga Yakovleva/" ]]; then return fi if [[ "$norh" == "true" ]]; then @@ -195,12 +120,12 @@ install_wine_bottle() { exit 1 fi fi - if [[ -z "$WINEARCH" ]] || [[ "${WINEARCH}" == "win64" ]]; then + if [[ ( -z "$WINEARCH" || "$WINEARCH" == "win64" ) && ! "$*" =~ speechsdk ]]; then local architecture=64 else local architecture=32 fi - export WINEPREFIX="$HOME/.local/wine${architecture}" + 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)" @@ -246,8 +171,7 @@ install_wine_bottle() { } add_launcher() { - local launchSettings="${game,,}" - launchSettings="${launchSettings//[[:space:]]/-}|${1}|${game}" + local launchSettings="${WINEARCH:-win64}|${1}|${game}" shift while [[ $# -gt 0 ]]; do launchSettings+="|$1" diff --git a/.install/Bloodshed.sh b/.install/Bloodshed.sh index 87f838a..cfd5957 100644 --- a/.install/Bloodshed.sh +++ b/.install/Bloodshed.sh @@ -1,5 +1,4 @@ download "${ipfsGateway}/ipfs/QmcTCTMep4zp5zTw8ZaXYpjtu9inNPn8bNzwhW6cX97egw?filename=bloodshed.exe" -export winVer="win7" install_wine_bottle speechsdk cp "${cache}/bloodshed.exe" "$WINEPREFIX/drive_c/Program Files/" add_launcher "c:\Program Files\bloodshed.exe" diff --git a/.install/RS Games.sh b/.install/RS Games.sh index 2a0907c..c9e5fa4 100644 --- a/.install/RS Games.sh +++ b/.install/RS Games.sh @@ -1,8 +1,5 @@ -export version="7.0" download "http://rsgames.org/rsdownloads/rsgclient/rsgames-client-setup-2.01.exe" "${nvdaControllerClientDll}" -install_wine "$version" "32" -export winVer="win7" install_wine_bottle speechsdk ${wine} "${cache}/rsgames-client-setup-2.01.exe" /silent -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; +find "${WINEPREFIX}/drive_c/Program Files/RS Games Client" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; add_launcher "c:\Program Files\RS Games Client\rsg.exe" diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 1822ad0..88dc76e 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -279,8 +279,8 @@ process_launcher-flags() { create_game_array() { # Game array 0 bottle, 1 path, 2 title, 3+ flags for i in "${lines[@]}" ; do - if [[ "${game}" =~ ^${i} ]]; then - # This is weird. Why do I have to set game to i before making the array? + # Escape pipe characters in both strings for regex matching + if [[ "${i//|/\\|}" =~ ^${game//|/\\|}$ ]]; then game="$i" IFS='|' read -ra game <<< "$i" break @@ -510,6 +510,5 @@ done [[ ${#game} -lt 1 ]] && exit 0 -[[ "$agmNoLaunch" != "true" ]] && winetricks sandbox [[ "$agmNoLaunch" != "true" ]] && exit 0 From 6526d40c68fd45f0da985ffd210f863a0646cd64 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 20 May 2025 17:51:20 -0400 Subject: [PATCH 06/77] Fixed create_game_array function. --- audiogame-manager.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 88dc76e..0274ff8 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -278,10 +278,13 @@ process_launcher-flags() { create_game_array() { # Game array 0 bottle, 1 path, 2 title, 3+ flags + game="$1" for i in "${lines[@]}" ; do - # Escape pipe characters in both strings for regex matching - if [[ "${i//|/\\|}" =~ ^${game//|/\\|}$ ]]; then - game="$i" + # Only compare the launcher section + j="${game#*|}" + k="${i#*|}" + k="${k%%|*}" + if [[ "$j" == "$k" ]]; then IFS='|' read -ra game <<< "$i" break fi @@ -330,9 +333,9 @@ game_launcher() { source .includes/help.sh # Make available in this function documentation "$game" "$(echo "$game" | cut -d '|' -f2)" fi - create_game_array + create_game_array "$game" else - create_game_array + create_game_array "$game" if [[ -z "$game" ]]; then echo "Game $1 not found." exit 1 From 737432a63f1bb219d7b4c91ae08664748660b759 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 20 May 2025 18:46:17 -0400 Subject: [PATCH 07/77] Set-voice updated to support the new system. Hopefully also more reliable. --- speech/set-voice.sh | 99 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 75 insertions(+), 24 deletions(-) diff --git a/speech/set-voice.sh b/speech/set-voice.sh index 0d9ef85..29656b1 100755 --- a/speech/set-voice.sh +++ b/speech/set-voice.sh @@ -1,18 +1,18 @@ #!/usr/bin/env bash # Set Voice -# Set the default wine voice ba$sed on installed options. +# Set the default wine voice based on installed options. # -# ■The contents of this file are subject to the Common Public Attribution -# License Version 1.0 (the ■License■); you may not use this file except in +# âe contents of this file are subject to the Common Public Attribution +# License Version 1.0 (the âcenseâ you may not use this file except in # compliance with the License. You may obtain a copy of the License at -# https://opensource.org/licenses/CPAL-1.0. The License is ba$sed on the Mozilla Public License Version +# https://opensource.org/licenses/CPAL-1.0. The License is based on the Mozilla Public License Version # 1.1 but Sections 14 and 15 have been added to cover use of software over a # computer network and provide for limited attribution for the Original # Developer. In addition, Exhibit A has been modified to be consistent with # Exhibit B. # -# Software distributed under the License is distributed on an ■AS IS■ basis, +# Software distributed under the License is distributed on an â ISâasis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. @@ -81,7 +81,6 @@ declare -A command=( ) - msgbox() { # Returns: None # Shows the provided message on the screen with an ok button. @@ -143,10 +142,18 @@ set_voice() { [[ "$x" = "$tmp" ]] && break counter=$(( $counter + 1 )) done - local RHVoiceName="$(find "${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/" -maxdepth 1 -type d)" - RHVoiceName="${RHVoiceName##*/}" + local RHVoiceName="" + local RHVoicePath="${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/" + if [[ -d "$RHVoicePath" ]]; then + RHVoiceName="$(find "$RHVoicePath" -maxdepth 1 -type d -not -path "$RHVoicePath" | head -1)" + if [[ -n "$RHVoiceName" ]]; then + RHVoiceName="${RHVoiceName##*/}" + fi + fi fullVoice="${voiceListFullName[$counter]}" - fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}" + if [[ -n "$RHVoiceName" ]]; then + fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}" + fi ${wine}server -k # If we don't do this it's likely wine will overwrite our reverted change or even clobber the registry key entirely # Remove any existing rate change for voices $sed -i '/"DefaultTTSRate"=dword:/d' "${WINEPREFIX}/user.reg" @@ -162,13 +169,21 @@ test_voice() { [ "$x" = "$tmp" ] && break counter=$(( $counter + 1 )) done - local RHVoiceName="$(find "${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/" -maxdepth 1 -type d)" - RHVoiceName="${RHVoiceName##*/}" + local RHVoiceName="" + local RHVoicePath="${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/" + if [[ -d "$RHVoicePath" ]]; then + RHVoiceName="$(find "$RHVoicePath" -maxdepth 1 -type d -not -path "$RHVoicePath" | head -1)" + if [[ -n "$RHVoiceName" ]]; then + RHVoiceName="${RHVoiceName##*/}" + fi + fi fullVoice="${voiceListFullName[$counter]}" - fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}" + if [[ -n "$RHVoiceName" ]]; then + fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}" + fi ${wine}server -k # If we don't do this it's likely wine will overwrite our reverted change or even clobber the registry key entirely -$sed -i -E -e 's/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\'"${fullVoice//\\/\\\\}"'"/g' "${WINEPREFIX}/user.reg" - cat << "EOF" > "${bottle}/drive_c/windows/temp/speak.vbs" + $sed -i -E -e 's/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\'"${fullVoice//\\/\\\\}"'"/g' "${WINEPREFIX}/user.reg" + cat << "EOF" > "${WINEPREFIX}/drive_c/windows/temp/speak.vbs" dim speechobject set speechobject=createobject("sapi.spvoice") speechobject.speak "This is a test of your chosen voice. It contains multiple sentences and punctuation, and is designed to give a full representation of this voices qualities." @@ -186,12 +201,20 @@ args="${args//[[:space:]]/}" while getopts "${args}" i ; do case "$i" in b) - if ! [[ -d ~/".local/wine/${OPTARG}" ]]; then + # Check for valid bottles in all possible locations + if [[ -d ~/.local/wine/${OPTARG} ]]; then + export bottle=~/.local/wine/${OPTARG} + export WINEPREFIX=~/.local/wine/${OPTARG} + elif [[ -d ~/.local/wine32 && ${OPTARG} == "wine32" ]]; then + export bottle=~/.local/wine32 + export WINEPREFIX=~/.local/wine32 + elif [[ -d ~/.local/wine64 && ${OPTARG} == "wine64" ]]; then + export bottle=~/.local/wine64 + export WINEPREFIX=~/.local/wine64 + else echo "Invalid wine bottle specified." exit 1 fi - export bottle=~/".local/wine/${OPTARG}" - export WINEPREFIX=~/".local/wine/${OPTARG}" ;; h) help;; r) @@ -210,14 +233,28 @@ done # Offer a list of wine bottles if one isn't specified on the command line. if [[ -z "${bottle}" ]]; then - declare -a bottle - for i in $(find ~/.local/wine/ -maxdepth 1 -type d -not -name 'wine' | sort) ; do - bottle+=("$i" "${i##*/}") + declare -a bottles=() + + # Check for wine32 and wine64 bottles + [[ -d ~/.local/wine32 ]] && bottles+=("$HOME/.local/wine32" "wine32") + [[ -d ~/.local/wine64 ]] && bottles+=("$HOME/.local/wine64" "wine64") + + # Add bottles from ~/.local/wine directory + if [[ -d ~/.local/wine ]]; then + for i in $(find ~/.local/wine/ -maxdepth 1 -type d -not -name 'wine' | sort); do + bottles+=("$i" "${i##*/}") done + fi + + if [[ ${#bottles[@]} -eq 0 ]]; then + echo "No wine bottles found in ~/.local/wine32, ~/.local/wine64, or ~/.local/wine/" + exit 1 + fi + export WINEPREFIX="$(dialog --backtitle "Use the up and down arrow keys to find the option you want, then press enter to select it." \ --clear \ - --no-tags \ - --menu "Select A Wine Bottle" 0 0 0 "${bottle[@]}" --stdout)" + --no-tags \ + --menu "Select A Wine Bottle" 0 0 0 "${bottles[@]}" --stdout)" fi if [[ -z "${WINEPREFIX}" ]]; then @@ -231,9 +268,16 @@ if [[ -r "${WINEPREFIX}/agm.conf" ]]; then export WINESERVER fi wine="${WINE:-$(command -v wine)}" +wineserver="${WINESERVER:-$(command -v wineserver)}" + +# Debug information - comment out or delete when not needed +# echo "Using wine bottle: ${WINEPREFIX}" +# echo "Wine executable: ${wine}" +# echo "Wineserver executable: ${wineserver}" # In case the user hasn't run a game using sapi in this prefix yet, let's try to initialize all the registry keys properly. -cat << "EOF" > "${bottle}/drive_c/windows/temp/speak.vbs" +mkdir -p "${WINEPREFIX}/drive_c/windows/temp" +cat << "EOF" > "${WINEPREFIX}/drive_c/windows/temp/speak.vbs" dim speechobject set speechobject=createobject("sapi.spvoice") speechobject.speak "" @@ -245,6 +289,13 @@ ifs="$IFS" IFS=$'\n' voiceListFullName=($($grep -P '\[Software\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^\\]+\].*' "${WINEPREFIX}/system.reg" | $sed -E -e 's/\[([^]]+)\].*/\1/g')) IFS="$ifs" + +# Debug the voice list - comment out or delete when not needed +# echo "Found ${#voiceListFullName[@]} voices in registry" +# for voice in "${voiceListFullName[@]}"; do +# echo "Voice: $voice" +# done + voiceList=() for x in "${voiceListFullName[@]}" ; do voiceList+=("$(echo "$x" | $sed -E -e 's/Software\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\(.+)/\3/g')") @@ -252,7 +303,7 @@ done oldVoice="$($grep -P '"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"' "${WINEPREFIX}/user.reg" | $sed -E -e 's/"DefaultTokenId"="([^"]+)"/\1/g')" exit=1 if [[ "${#voiceList[@]}" -eq 0 ]]; then - dialog --msgbox "No voices found." -1 -1 + dialog --msgbox "No voices found in ${WINEPREFIX}. Make sure SAPI voices are installed in this Wine prefix." 0 0 exit 1 fi while [[ $exit -ne 0 ]] ; do From e3df3c44855c60c24bf9de869598689962ed69b2 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 20 May 2025 19:11:21 -0400 Subject: [PATCH 08/77] More games updated for the new system. --- .install/BG 15 Puzzle.sh | 2 +- .install/BG 2048.sh | 2 +- .install/BG Aces Up Solitaire.sh | 2 +- .install/BG Alchemy.sh | 2 +- .install/BG Battleship.sh | 2 +- .install/BG Boggle.sh | 2 +- .install/BG Boxes.sh | 2 +- .install/BG Brainiac.sh | 2 +- .install/BG Chess Challenge.sh | 2 +- .install/BG Code Breaker.sh | 2 +- .install/BG Cribbage Solitaire.sh | 2 +- .install/BG Cribbage.sh | 2 +- .install/BG Crossword Puzzle.sh | 2 +- .install/BG Draw Dominoes.sh | 2 +- .install/BG Elevens Solitaire.sh | 2 +- .install/BG Fives Dominoes.sh | 2 +- .install/BG Free Cell Solitaire.sh | 2 +- .install/BG Golf Solitaire.sh | 2 +- .install/BG Hangman.sh | 2 +- .install/BG Hearts.sh | 2 +- .install/BG Klondike Solitaire.sh | 2 +- .install/BG LAP.sh | 2 +- .install/BG Master Mind.sh | 2 +- .install/BG Mine Sweeper.sh | 2 +- .install/BG Nomination Whist.sh | 2 +- .install/BG Penguin Solitaire.sh | 2 +- .install/BG Poker Solitaire.sh | 2 +- .install/BG Pyramid Solitaire.sh | 2 +- .install/BG Scorpion Solitaire.sh | 2 +- .install/BG Scrabble.sh | 2 +- .install/BG Simon.sh | 2 +- .install/BG Spider Solitaire.sh | 2 +- .install/BG Sudoku.sh | 2 +- .install/BG Tablic Solitaire.sh | 2 +- .install/BG Tri-Peaks Solitaire.sh | 2 +- .install/BG Twenty 20 Cricket.sh | 2 +- .install/BG Uno.sh | 2 +- .install/BG Word Builder.sh | 2 +- .install/BG Word Candy.sh | 2 +- .install/BG Word Jumble.sh | 2 +- .install/BG Word Maze.sh | 2 +- .install/BG Word Solitaire.sh | 2 +- .install/BG Word Target.sh | 2 +- .install/BG Word Yahtzee.sh | 2 +- .install/BG Yahtzee.sh | 2 +- 45 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.install/BG 15 Puzzle.sh b/.install/BG 15 Puzzle.sh index 702588e..8f5d0e4 100644 --- a/.install/BG 15 Puzzle.sh +++ b/.install/BG 15 Puzzle.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmQiocMpMXoxejDftKKvmrR5xxpj1qcWcgkhBBwTcyijXg?filename=FPB32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/FPB32Setup10a.exe" /silent diff --git a/.install/BG 2048.sh b/.install/BG 2048.sh index 2e8de3f..d482326 100644 --- a/.install/BG 2048.sh +++ b/.install/BG 2048.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmPNt3c78UBgEMrTH3eJ5eD2mCMdth6jwes1iDKGW24Uj5?filename=BG204832Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/BG204832Setup10a.exe" /silent diff --git a/.install/BG Aces Up Solitaire.sh b/.install/BG Aces Up Solitaire.sh index 66eabab..72f9666 100644 --- a/.install/BG Aces Up Solitaire.sh +++ b/.install/BG Aces Up Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmTshtHBEV9dh7wFtaQpNUEYHZ3fBpuhSRZqc7k8HwmtPM?filename=ASB32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/ASB32Setup10.exe" /silent diff --git a/.install/BG Alchemy.sh b/.install/BG Alchemy.sh index 61c7640..64ec1ec 100644 --- a/.install/BG Alchemy.sh +++ b/.install/BG Alchemy.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/Qma76HXBhmKgMDeHH1XLePsaWzzzLsBS2HRL3c7MVwDokg?filename=BAC32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BAC32Setup10.exe" /silent diff --git a/.install/BG Battleship.sh b/.install/BG Battleship.sh index 092fc96..de4055c 100644 --- a/.install/BG Battleship.sh +++ b/.install/BG Battleship.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/Qmaq9P9fxdLTEFMGg4mhHrRuUbPg6HgU3eYVJNqZUimHjo?filename=BGB32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BGB32Setup10.exe" /silent diff --git a/.install/BG Boggle.sh b/.install/BG Boggle.sh index 504d952..1e90a30 100644 --- a/.install/BG Boggle.sh +++ b/.install/BG Boggle.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmQwWiJw9hDiPdfwDyL4XepeoD66ztVRi3HwbSjFFP4CNg?filename=BGB32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/BGB32Setup10a.exe" /silent diff --git a/.install/BG Boxes.sh b/.install/BG Boxes.sh index c080c97..12b52ac 100644 --- a/.install/BG Boxes.sh +++ b/.install/BG Boxes.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmRn21tREXxXVSaDe9i54zEPzPSespjJAFBqu4DWocuagD?filename=BXB32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BXB32Setup10.exe" /silent diff --git a/.install/BG Brainiac.sh b/.install/BG Brainiac.sh index 7e48002..a139563 100644 --- a/.install/BG Brainiac.sh +++ b/.install/BG Brainiac.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmWEdmTkQsjSqBgWUgnDajMf8QvQBbEF4Nxo6mhkXYzBtQ?filename=BRN32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/BRN32Setup10a.exe" /silent diff --git a/.install/BG Chess Challenge.sh b/.install/BG Chess Challenge.sh index 757d0ca..e291efa 100644 --- a/.install/BG Chess Challenge.sh +++ b/.install/BG Chess Challenge.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmT2yBpU5Jqna18FxYtyWzi4xMGAY9PyJWStAskxCHqBDw?filename=BGC32Setup10d.exe" install_wine_bottle speechsdk wine "${cache}/BGC32Setup10d.exe" /silent diff --git a/.install/BG Code Breaker.sh b/.install/BG Code Breaker.sh index cdc3170..1c4ecc5 100644 --- a/.install/BG Code Breaker.sh +++ b/.install/BG Code Breaker.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmU486SssAdM7kPKwDyAKDLQs3Z92bG6wFjaLhzqDZCxAF?filename=BCB32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BCB32Setup10.exe" /silent diff --git a/.install/BG Cribbage Solitaire.sh b/.install/BG Cribbage Solitaire.sh index ffa8408..539f1b8 100644 --- a/.install/BG Cribbage Solitaire.sh +++ b/.install/BG Cribbage Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmbRUiknnNcibWD3NwK4DFZGNHWswBgsFidUzU1TFGJ5Ra?filename=BCS32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BCS32Setup10.exe" /silent diff --git a/.install/BG Cribbage.sh b/.install/BG Cribbage.sh index fa9d97d..e265e4f 100644 --- a/.install/BG Cribbage.sh +++ b/.install/BG Cribbage.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmeFud3EPHy7wQe8UENgvh96HdAazEkwqA2AutCNkYvB3t?filename=BGC32Setup12e.exe" install_wine_bottle speechsdk wine "${cache}/BGC32Setup12e.exe" /silent diff --git a/.install/BG Crossword Puzzle.sh b/.install/BG Crossword Puzzle.sh index 8608898..1dd64ca 100644 --- a/.install/BG Crossword Puzzle.sh +++ b/.install/BG Crossword Puzzle.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmZQGY9CeATEiWrSqsKBz4AN6jPgQuvbBZSpQoLiMjoDr2?filename=BGX32Setup10h.exe" install_wine_bottle speechsdk wine "${cache}/BGX32Setup10h.exe" /silent diff --git a/.install/BG Draw Dominoes.sh b/.install/BG Draw Dominoes.sh index 6aab34b..62fda2e 100644 --- a/.install/BG Draw Dominoes.sh +++ b/.install/BG Draw Dominoes.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmZQGY9CeATEiWrSqsKBz4AN6jPgQuvbBZSpQoLiMjoDr2?filename=BDD32Setup.exe" install_wine_bottle speechsdk wine "${cache}/BDD32Setup.exe" /silent diff --git a/.install/BG Elevens Solitaire.sh b/.install/BG Elevens Solitaire.sh index e7411a3..48486a3 100644 --- a/.install/BG Elevens Solitaire.sh +++ b/.install/BG Elevens Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmWWZByYL5CsDSi6gQLGcMyBL7zqD5hWXbPXJr3shRt5AQ?filename=ESB32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/ESB32Setup10.exe" /silent diff --git a/.install/BG Fives Dominoes.sh b/.install/BG Fives Dominoes.sh index cafd61a..7c2d0a1 100644 --- a/.install/BG Fives Dominoes.sh +++ b/.install/BG Fives Dominoes.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmSZt6dz7WQkNrFBmYq9n4WdYrrZyQAebTBPo46uHqCuNi?filename=BFD32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BFD32Setup10.exe" /silent diff --git a/.install/BG Free Cell Solitaire.sh b/.install/BG Free Cell Solitaire.sh index 93cc67d..b7306a2 100644 --- a/.install/BG Free Cell Solitaire.sh +++ b/.install/BG Free Cell Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmVfQMMnqTD9Zm8Xwv7rGrUTdS9FXToq7Fv6wtQQVgbQGR?filename=BGF32Setup20.exe" install_wine_bottle speechsdk wine "${cache}/BGF32Setup20.exe" /silent diff --git a/.install/BG Golf Solitaire.sh b/.install/BG Golf Solitaire.sh index 74dbf71..7556809 100644 --- a/.install/BG Golf Solitaire.sh +++ b/.install/BG Golf Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmfAp9EYou1pndLwYSdpYdUCHBv2DR94oFccQh1ii9JVLD?filename=GSB32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/GSB32Setup10a.exe" /silent diff --git a/.install/BG Hangman.sh b/.install/BG Hangman.sh index 73731b0..a212dae 100644 --- a/.install/BG Hangman.sh +++ b/.install/BG Hangman.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmXTPMmvw7JE2eLuPBLGSpkZqUn12TX7QEQZbX8qtp7GBx?filename=HMB32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/HMB32Setup10.exe" /silent diff --git a/.install/BG Hearts.sh b/.install/BG Hearts.sh index 7f199aa..ccbe1e0 100644 --- a/.install/BG Hearts.sh +++ b/.install/BG Hearts.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmdU5ag1PRjvG28wNX7aNuJqZSVxaqEEKjgG6GoRoDT8k4?filename=BGH32Setup10b.exe" install_wine_bottle speechsdk wine "${cache}/${BGH32Setup10b.exe}" /silent diff --git a/.install/BG Klondike Solitaire.sh b/.install/BG Klondike Solitaire.sh index 4fd82ef..c1e02a3 100644 --- a/.install/BG Klondike Solitaire.sh +++ b/.install/BG Klondike Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmctBDvhQWwER94LvgauR7sMDxv9D1mS9cToV47orTCdzU?filename=BGK32Setup10b.exe" install_wine_bottle speechsdk wine "${cache}/BGK32Setup10b.exe" /silent diff --git a/.install/BG LAP.sh b/.install/BG LAP.sh index 89c8b5b..b356c0f 100644 --- a/.install/BG LAP.sh +++ b/.install/BG LAP.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/Qma5WeCC9B2P5abRGX9nGYV8Zi9F8vfCCr4ehejP2bgmNm?filename=LAP32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/LAP32Setup10.exe" /silent diff --git a/.install/BG Master Mind.sh b/.install/BG Master Mind.sh index 53835cd..515e46b 100644 --- a/.install/BG Master Mind.sh +++ b/.install/BG Master Mind.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmP6cwMbirbBqAaG9JLfNRnD2dvJfh6nq74kfwxs5hN2RQ?filename=BMM32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BMM32Setup10.exe" /silent diff --git a/.install/BG Mine Sweeper.sh b/.install/BG Mine Sweeper.sh index e6ddce3..1eb8df2 100644 --- a/.install/BG Mine Sweeper.sh +++ b/.install/BG Mine Sweeper.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmRa54HroWjwxHYfKr6hdmP34sHW5G3ecuzcjMA5UBBVKa?filename=MSB32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/MSB32Setup10.exe" /silent diff --git a/.install/BG Nomination Whist.sh b/.install/BG Nomination Whist.sh index 10654ae..6c351fb 100644 --- a/.install/BG Nomination Whist.sh +++ b/.install/BG Nomination Whist.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/Qmb7eGTMDgiaDC9muMW9n8bHoistGcNm1VgHc6sr7dRyHU?filename=BNW32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/BNW32Setup10a.exe" /silent diff --git a/.install/BG Penguin Solitaire.sh b/.install/BG Penguin Solitaire.sh index 06ff077..6185659 100644 --- a/.install/BG Penguin Solitaire.sh +++ b/.install/BG Penguin Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmXKvQ6WNNSnDiSyYmvAhZXVdALnuhUGK7dSMQVkQNReJr?filename=BPS32Setup10c.exe" install_wine_bottle speechsdk wine "${cache}/BPS32Setup10c.exe" /silent diff --git a/.install/BG Poker Solitaire.sh b/.install/BG Poker Solitaire.sh index f39f52e..f4d288e 100644 --- a/.install/BG Poker Solitaire.sh +++ b/.install/BG Poker Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmPLv74LiDgVGuiGhu9HuPhx3uoMm9QyCYk6jgeFUHjj3S?filename=BPS32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BPS32Setup10.exe" /silent diff --git a/.install/BG Pyramid Solitaire.sh b/.install/BG Pyramid Solitaire.sh index 14e1840..1005336 100644 --- a/.install/BG Pyramid Solitaire.sh +++ b/.install/BG Pyramid Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmaqXaBKD3xY2smhU2LcejXRTPnWZHqaTW9se8yRepLsHu?filename=PSB32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/PSB32Setup10a.exe" /silent diff --git a/.install/BG Scorpion Solitaire.sh b/.install/BG Scorpion Solitaire.sh index 93668ec..3904b57 100644 --- a/.install/BG Scorpion Solitaire.sh +++ b/.install/BG Scorpion Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmSxJs2MiLQ61Fgx6vCpSD7GmQziLiCEU3sZ3mgWc7RsJ8?filename=BSS32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BSS32Setup10.exe" /silent diff --git a/.install/BG Scrabble.sh b/.install/BG Scrabble.sh index 09d42d6..0e02fb1 100644 --- a/.install/BG Scrabble.sh +++ b/.install/BG Scrabble.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmVrwyPdJBnmc4wLW7oT2hexxXnXxs8bA7gfiqbnJsWJ16?filename=BGS32Setup20.exe" install_wine_bottle speechsdk wine "${cache}/BGS32Setup20.exe" /silent diff --git a/.install/BG Simon.sh b/.install/BG Simon.sh index 451175a..9e5e0b9 100644 --- a/.install/BG Simon.sh +++ b/.install/BG Simon.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmXtBCqB6VCFPaDYuLaFNP1BDtJSLCJdJZzgm61zMtrsQt?filename=BGS32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BGS32Setup10.exe" /silent diff --git a/.install/BG Spider Solitaire.sh b/.install/BG Spider Solitaire.sh index 1406e10..71f733a 100644 --- a/.install/BG Spider Solitaire.sh +++ b/.install/BG Spider Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmdWBaDnLVbKCJSpiqF675ew6nJ6KHUVXA5FEH3t3E7UAu?filename=SPB32Setup10b.exe" install_wine_bottle speechsdk wine "${cache}/SPB32Setup10b.exe" /silent diff --git a/.install/BG Sudoku.sh b/.install/BG Sudoku.sh index dc6c3b4..2f6b393 100644 --- a/.install/BG Sudoku.sh +++ b/.install/BG Sudoku.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmXCAHEVRGZBc8t45Jgn2vkxicwF9Aox6yz9XrQBdkv7WY?filename=SDB32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/SDB32Setup10a.exe" /silent diff --git a/.install/BG Tablic Solitaire.sh b/.install/BG Tablic Solitaire.sh index 61f57b5..e7d90f1 100644 --- a/.install/BG Tablic Solitaire.sh +++ b/.install/BG Tablic Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmYoiFQ6JuSXfZfZXT3SQDsYzMWLBu9rW9yivi1xiPjqZx?filename=SDB32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/SDB32Setup10a.exe" /silent diff --git a/.install/BG Tri-Peaks Solitaire.sh b/.install/BG Tri-Peaks Solitaire.sh index 142c912..30f0bfa 100644 --- a/.install/BG Tri-Peaks Solitaire.sh +++ b/.install/BG Tri-Peaks Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmWJGvSR6iaQfMHM3XuGCkWxx285jkzSDdNSvvk3bSCH8S?filename=TPB32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/TPB32Setup10a.exe" /silent diff --git a/.install/BG Twenty 20 Cricket.sh b/.install/BG Twenty 20 Cricket.sh index ad3c9e0..4720093 100644 --- a/.install/BG Twenty 20 Cricket.sh +++ b/.install/BG Twenty 20 Cricket.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmWAk2TMHMvW6Kjc1sZBEPsxmCNHfY3nF1K723PCqaTa57?filename=T20B32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/T20B32Setup10.exe" /silent diff --git a/.install/BG Uno.sh b/.install/BG Uno.sh index 6c76415..c84dfe9 100644 --- a/.install/BG Uno.sh +++ b/.install/BG Uno.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmVsfPkebSoTDwYSXF1n7y4P9eGJTgTcGXdrEjpcV8A3Dv?filename=BGU32Setup11a.exe" install_wine_bottle speechsdk wine "${cache}/BGU32Setup11a.exe" /silent diff --git a/.install/BG Word Builder.sh b/.install/BG Word Builder.sh index 5d112cc..1785740 100644 --- a/.install/BG Word Builder.sh +++ b/.install/BG Word Builder.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmXtR49EZShyj15Tc9CXQpBYVmKNfZpp4515Epm16bviuH?filename=BWB32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BWB32Setup10.exe" /silent diff --git a/.install/BG Word Candy.sh b/.install/BG Word Candy.sh index 795dc64..443d2f2 100644 --- a/.install/BG Word Candy.sh +++ b/.install/BG Word Candy.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmfTgfRzd4JMRqKSfDiz76iMorkaG19BqH1K7nRCCDwo4H?filename=WCB32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/WCB32Setup10a.exe" /silent diff --git a/.install/BG Word Jumble.sh b/.install/BG Word Jumble.sh index fa6942e..6d051a3 100644 --- a/.install/BG Word Jumble.sh +++ b/.install/BG Word Jumble.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmYQWZZifzKJSuVRCC1SabwRmEDz95GdFvbzRvsBMmTt6e?filename=BWJ32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BWJ32Setup10.wineExec" /silent diff --git a/.install/BG Word Maze.sh b/.install/BG Word Maze.sh index 20e019e..b2915dc 100644 --- a/.install/BG Word Maze.sh +++ b/.install/BG Word Maze.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmXPtj5PkVZjXpU3m6FAfm8MwVL6bQCvhEDoR385u6FGTL?filename=BWM32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BWM32Setup10.exe" /silent diff --git a/.install/BG Word Solitaire.sh b/.install/BG Word Solitaire.sh index 077146f..cf26bb6 100644 --- a/.install/BG Word Solitaire.sh +++ b/.install/BG Word Solitaire.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmZp73ARDPqgnCz7zxfKeBHjNoHrgZSgg2NdQZR2sMyZGD?filename=WSB32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/WSB32Setup10.exe" /silent diff --git a/.install/BG Word Target.sh b/.install/BG Word Target.sh index 14e9bd6..85f7f82 100644 --- a/.install/BG Word Target.sh +++ b/.install/BG Word Target.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmWWZFXVHNtmNkH55oermWWtrMcQ8qVqL687B7kGFyeezq?filename=WTB32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/WTB32Setup10a.exe" /silent diff --git a/.install/BG Word Yahtzee.sh b/.install/BG Word Yahtzee.sh index e7bc6a5..d3a9669 100644 --- a/.install/BG Word Yahtzee.sh +++ b/.install/BG Word Yahtzee.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmdicAVDegDktY3euVAC2PPn4YBGz96KedxYXNe4WDQaoq?filename=BWY32Setup10.exe" install_wine_bottle speechsdk wine "${cache}/BWY32Setup10.exe" /silent diff --git a/.install/BG Yahtzee.sh b/.install/BG Yahtzee.sh index 5ea200d..3d9cddc 100644 --- a/.install/BG Yahtzee.sh +++ b/.install/BG Yahtzee.sh @@ -1,4 +1,4 @@ -export bottle="bg" +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmZebvkKgFAADnb1cgW6Bz7wTYdUh82X61QdtW66KcvmpF?filename=BGY32Setup10a.exe" install_wine_bottle speechsdk wine "${cache}/BGY32Setup10a.exe" /silent From da065e5835a31c311e77493369996da26feb57c2 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 10 Jun 2025 01:54:56 -0400 Subject: [PATCH 09/77] A little more progress on refactor. --- .includes/bottle.sh | 7 ++++--- .includes/update.sh | 6 ------ .install/BG Word Jumble.sh | 2 +- .install/Bounce Bounce.sh | 3 +-- audiogame-manager.sh | 22 ++++++++++++++++------ 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index cc7b8e6..e418b5c 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -111,9 +111,10 @@ install_wine_bottle() { # 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,,}" + # Installation paths are based on WINEARCH unless game is set for custom bottle. + local bottle="" + if [[ ${#game} -gt 0 ]]; then + 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." diff --git a/.includes/update.sh b/.includes/update.sh index 4ae1bf6..fda540b 100644 --- a/.includes/update.sh +++ b/.includes/update.sh @@ -44,9 +44,3 @@ fi git log '@{1}..' --pretty=format:'%an: %s' | tac; } exit $? } -# Get latest news if available -check_news -# With no arguments, open the game launcher. -if [[ $# -eq 0 ]]; then - game_launcher -fi diff --git a/.install/BG Word Jumble.sh b/.install/BG Word Jumble.sh index 6d051a3..dfca585 100644 --- a/.install/BG Word Jumble.sh +++ b/.install/BG Word Jumble.sh @@ -1,5 +1,5 @@ export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmYQWZZifzKJSuVRCC1SabwRmEDz95GdFvbzRvsBMmTt6e?filename=BWJ32Setup10.exe" install_wine_bottle speechsdk -wine "${cache}/BWJ32Setup10.wineExec" /silent +wine "${cache}/BWJ32Setup10.exe" /silent add_launcher "c:\Program Files\Games\WordJumbleB\WordJumbleB.exe" diff --git a/.install/Bounce Bounce.sh b/.install/Bounce Bounce.sh index 01ab3e3..43f6b7c 100644 --- a/.install/Bounce Bounce.sh +++ b/.install/Bounce Bounce.sh @@ -1,7 +1,6 @@ +export WINEARCH=win64 get_installer "bounce_bounce.rar" "https://kavyapriya.itch.io/bounce-bounce" download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" -export winVer="win7" -export WINEARCH=win64 install_wine_bottle unrar x "${cache}/bounce_bounce.rar" -op"$WINEPREFIX/drive_c/Program Files" find "${WINEPREFIX}/drive_c/Program Files/bounce_bounce" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 0274ff8..c919ca5 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -267,7 +267,7 @@ custom_launch_parameters() { } # Process game launcher flags -process_launcher-flags() { +process_launcher_flags() { flags=("${game[@]:3}") for i in "${flags[@]}" ; do if [[ "${i}" =~ ^export\ [a-zA-Z_][a-zA-Z0-9_]*=\'?.*\'?$ ]]; then @@ -375,7 +375,7 @@ game_launcher() { fi fi fi - process_launcher-flags + process_launcher_flags custom_launch_parameters ${wine:-/usr/bin/wine} start /d "${game[1]%\\*}" "${game[1]##*\\}" /realtime fi @@ -486,7 +486,7 @@ while getopts "${args}" i ; do h) help;; i) game_installer;; I) - game="${OPTARG}" + export game="${OPTARG}" break;; k) kill_game;; L) license;; @@ -501,7 +501,7 @@ while getopts "${args}" i ; do r) game_removal;; S) defaultRate="${OPTARG}";; t) - gameCount=$(find .install -type f -iname "*.sh" | wc -l) + gameCount=$(find ".install" -type f -iname "*.sh" | wc -l) dialog --backtitle "Linux Game Manager" \ --infobox "There are currently ${gameCount} games available." -1 -1 exit 0 @@ -511,7 +511,17 @@ while getopts "${args}" i ; do esac done +# If agmNoLaunch is set, exit (script is being sourced) +[[ "$agmNoLaunch" == "true" ]] && exit 0 + +# If no game specified, exit [[ ${#game} -lt 1 ]] && exit 0 - -[[ "$agmNoLaunch" != "true" ]] && exit 0 +# Install the specified game noninteractively +if [[ -f ".install/${game}.sh" ]]; then + export LANG="en_US.UTF-8" + . ".install/${game}.sh" +else + echo "Error: Game '${game}' not found in .install directory" + exit 1 +fi From 15f90a797961010e86c40ee6f7ff18d4e07c90ea Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Fri, 1 Aug 2025 14:27:44 -0400 Subject: [PATCH 10/77] Split dependency installation scripts into distro specific scripts. This is more reliable than the script trying to figure out which distro is running on its own. --- ...encies.sh => install-dependencies-arch.sh} | 42 +++---------------- wine/install-dependencies-debian.sh | 29 +++++++++++++ 2 files changed, 35 insertions(+), 36 deletions(-) rename wine/{install-dependencies.sh => install-dependencies-arch.sh} (61%) mode change 100755 => 100644 create mode 100644 wine/install-dependencies-debian.sh diff --git a/wine/install-dependencies.sh b/wine/install-dependencies-arch.sh old mode 100755 new mode 100644 similarity index 61% rename from wine/install-dependencies.sh rename to wine/install-dependencies-arch.sh index 5aee44f..d750bdc --- a/wine/install-dependencies.sh +++ b/wine/install-dependencies-arch.sh @@ -3,13 +3,9 @@ # Immediately exit if errors are encountered. set -e -# Installer/configuration tool for wine -# If this fails on your system, please contact storm_dragon@linux-a11y.org +# Wine dependencies installer for Arch Linux +# If this fails on your system, please contact storm_dragon@stormux.org -is_function() { - LC_ALL=C type "$1" 2> /dev/null | grep -q "$1 is a function" -} - configure_arch() { packageList=( cabextract @@ -29,7 +25,7 @@ configure_arch() { mpg123 libpulse libpng - libjpeg-turbo + libjpeg-turbo gnutls alsa-plugins alsa-lib @@ -70,36 +66,10 @@ configure_arch() { # Some of these may fail, so do them in a for loop. yay -Syy for i in "${packageList[@]}" ; do - yay -S --needed --noconfirm $i + yay -S --needed --noconfirm "$i" || true done } -configure_debian() { - packageList=( - curl - dialog - gawk - gstreamer1.0-plugins-bad:i386 - gstreamer1.0-plugins-good:i386 - gstreamer1.0-plugins-ugly:i386 - mono-complete - ncurses5-dev - w3m - winehq-stable - ) - # make sure 32 bit libraries are available - sudo dpkg --add-architecture i386 - sudo apt install --install-recommends ${packageList[*]} -} +configure_arch - -distro="$(head -1 /etc/issue | cut -d ' ' -f1)" -distro="${distro,,}" - -if is_function configure_${distro} ; then - configure_${distro} -else - echo "${distro^} is not yet supported. If you want it added, please contact storm_dragon@linux-a11y.org" | fold -s -w 72 -fi - -exit 0 +exit 0 \ No newline at end of file diff --git a/wine/install-dependencies-debian.sh b/wine/install-dependencies-debian.sh new file mode 100644 index 0000000..70a59ed --- /dev/null +++ b/wine/install-dependencies-debian.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# Immediately exit if errors are encountered. +set -e + +# Wine dependencies installer for Debian/Ubuntu +# If this fails on your system, please contact storm_dragon@stormux.org + +configure_debian() { + packageList=( + curl + dialog + gawk + gstreamer1.0-plugins-bad:i386 + gstreamer1.0-plugins-good:i386 + gstreamer1.0-plugins-ugly:i386 + mono-complete + ncurses5-dev + w3m + winehq-stable + ) + # make sure 32 bit libraries are available + sudo dpkg --add-architecture i386 + sudo apt install --install-recommends "${packageList[@]}" +} + +configure_debian + +exit 0 From 76f0c66c9672b98a05be79851ec13c3be344f74b Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Fri, 1 Aug 2025 15:25:53 -0400 Subject: [PATCH 11/77] Added yad dialogues if in GUI session, retains the dialog interface if in console. --- .includes/bottle.sh | 2 +- .includes/dialog-interface.sh | 281 ++++++++++++++++++++++++ .includes/functions.sh | 40 +--- .includes/update.sh | 8 +- .install/Bokurano Daibouken 3.sh | 7 +- .install/Side Party.sh | 7 +- .install/Swamp.sh | 5 +- audiogame-manager.sh | 41 ++-- game-scripts/crazy-party-build-games.sh | 15 +- game-scripts/crazy-party-update.sh | 6 +- game-scripts/rettou-update.sh | 8 +- game-scripts/scramble-update.sh | 6 +- game-scripts/swamp-update.sh | 12 +- speech/install_cepstral.sh | 30 +-- speech/set-voice.sh | 30 +-- wine/mkwine.sh | 7 +- 16 files changed, 392 insertions(+), 113 deletions(-) create mode 100644 .includes/dialog-interface.sh diff --git a/.includes/bottle.sh b/.includes/bottle.sh index e418b5c..396a067 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -36,7 +36,7 @@ install_wine() { # 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 + tar xf "${installationFile}" -C "${wineInstallationPath}"; } | agm_progressbox "Wine Installation" "Installing $2 bit Wine version $1." set +e } diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh new file mode 100644 index 0000000..8f96bcc --- /dev/null +++ b/.includes/dialog-interface.sh @@ -0,0 +1,281 @@ +#!/usr/bin/env bash + +# Dialog interface wrapper for audiogame-manager +# Automatically switches between dialog (console) and yad (GUI) based on DISPLAY environment +# This provides better accessibility for GUI environments while maintaining console functionality + +# Note: dialogType is now detected in the main script before DISPLAY is modified +# This ensures console detection works correctly when AGM sets DISPLAY=":0" +# If dialogType is not set (e.g., when called from standalone scripts), detect it +if [[ -z "$dialogType" ]]; then + if [[ -z "$DISPLAY" ]]; then + dialogType="dialog" + else + dialogType="yad" + fi +fi + +# Wrapper function for menu selection +# Usage: agm_menu "title" "backtitle" "text" option1 "description1" option2 "description2" ... +agm_menu() { + local title="$1" + local backTitle="$2" + local text="$3" + shift 3 + + if [[ "$dialogType" == "yad" ]]; then + # Build yad list format: Display only, then map back to value + local yadList="" + declare -A valueMap + while [[ $# -gt 0 ]]; do + local option="$1" + local description="$2" + valueMap["$description"]="$option" + if [[ -n "$yadList" ]]; then + yadList="$yadList\n" + fi + yadList="${yadList}${description}" + shift 2 + done + + local selectedDescription + selectedDescription=$(echo -e "$yadList" | yad --list \ + --title="$title" \ + --text="$text" \ + --column="Option" \ + --no-headers \ + --selectable-labels \ + --search-column=1 \ + --height=400 \ + --width=600) + + # Return the mapped value + if [[ -n "$selectedDescription" ]]; then + echo "${valueMap["$selectedDescription"]}" + fi + else + # Build dialog menu format with mapping (same approach as yad) + local dialogArgs=() + declare -A valueMap + while [[ $# -gt 0 ]]; do + local option="$1" + local description="$2" + valueMap["$description"]="$option" + dialogArgs+=("$description" "$description") + shift 2 + done + + local selectedDescription + selectedDescription=$(dialog --backtitle "$backTitle" \ + --title "$title" \ + --no-tags \ + --menu "$text" 0 0 0 \ + "${dialogArgs[@]}" \ + --stdout) + + # Return the mapped value + if [[ -n "$selectedDescription" ]]; then + echo "${valueMap["$selectedDescription"]}" + fi + fi +} + +# Wrapper function for checklist selection +# Usage: agm_checklist "title" "backtitle" "text" option1 "description1" "status1" option2 "description2" "status2" ... +agm_checklist() { + local title="$1" + local backTitle="$2" + local text="$3" + shift 3 + + if [[ "$dialogType" == "yad" ]]; then + local yadList="" + while [[ $# -gt 0 ]]; do + local option="$1" + local description="$2" + local status="$3" + local checked="FALSE" + [[ "$status" == "on" ]] && checked="TRUE" + + if [[ -n "$yadList" ]]; then + yadList="$yadList\n" + fi + yadList="${yadList}${checked}|${description}|${option}" + shift 3 + done + + echo -e "$yadList" | yad --list \ + --title="$title" \ + --text="$text" \ + --checklist \ + --column="Select:CHK" \ + --column="Option" \ + --column="Value:HD" \ + --hide-column=3 \ + --print-column=3 \ + --no-headers \ + --selectable-labels \ + --height=400 \ + --width=600 \ + --separator=" " + else + local dialogArgs=() + while [[ $# -gt 0 ]]; do + dialogArgs+=("$1" "$2" "$3") + shift 3 + done + + dialog --backtitle "$backTitle" \ + --title "$title" \ + --checklist "$text" 0 0 0 \ + "${dialogArgs[@]}" \ + --stdout + fi +} + +# Wrapper function for input dialog +# Usage: agm_inputbox "title" "backtitle" "text" "default_value" +agm_inputbox() { + local title="$1" + local backTitle="$2" + local text="$3" + local defaultValue="$4" + + if [[ "$dialogType" == "yad" ]]; then + yad --entry \ + --title="$title" \ + --text="$text" \ + --entry-text="$defaultValue" \ + --selectable-labels \ + --width=400 + else + dialog --backtitle "$backTitle" \ + --title "$title" \ + --inputbox "$text" 0 0 "$defaultValue" \ + --stdout + fi +} + +# Wrapper function for message box +# Usage: agm_msgbox "title" "backtitle" "text" +agm_msgbox() { + local title="$1" + local backTitle="$2" + local text="$3" + + if [[ "$dialogType" == "yad" ]]; then + yad --info \ + --title="$title" \ + --text="$text" \ + --selectable-labels \ + --show-cursor \ + --width=400 + else + dialog --backtitle "$backTitle" \ + --title "$title" \ + --msgbox "$text" 0 0 + fi +} + +# Wrapper function for yes/no dialog +# Usage: agm_yesno "title" "backtitle" "text" +agm_yesno() { + local title="$1" + local backTitle="$2" + local text="$3" + + if [[ "$dialogType" == "yad" ]]; then + yad --question \ + --title="$title" \ + --text="$text" \ + --selectable-labels \ + --width=400 + else + dialog --backtitle "$backTitle" \ + --title "$title" \ + --yesno "$text" 0 0 + fi +} + +# Wrapper function for info box (non-blocking message) +# Usage: agm_infobox "title" "backtitle" "text" +agm_infobox() { + local title="$1" + local backTitle="$2" + local text="$3" + + if [[ "$dialogType" == "yad" ]]; then + # For yad, we'll use a notification since infobox is non-blocking + yad --notification \ + --text="$text" \ + --timeout=3 + else + dialog --backtitle "$backTitle" \ + --title "$title" \ + --infobox "$text" 0 0 + fi +} + +# Wrapper function for progress box +# Usage: command | agm_progressbox "title" "text" +agm_progressbox() { + local title="$1" + local text="$2" + + if [[ "$dialogType" == "yad" ]]; then + yad --progress \ + --title="$title" \ + --text="$text" \ + --pulsate \ + --auto-close \ + --no-buttons \ + --show-cursor \ + --width=400 + else + dialog --title "$title" \ + --progressbox "$text" 20 70 + fi +} + +# Wrapper function for file selection +# Usage: agm_fselect "title" "backtitle" "default_path" +agm_fselect() { + local title="$1" + local backTitle="$2" + local defaultPath="$3" + + if [[ "$dialogType" == "yad" ]]; then + yad --file \ + --title="$title" \ + --filename="$defaultPath" \ + --width=600 \ + --height=400 + else + dialog --backtitle "$backTitle" \ + --title "$title" \ + --fselect "$defaultPath" 0 0 \ + --stdout + fi +} + +# Wrapper function for directory selection +# Usage: agm_dselect "title" "backtitle" "default_path" +agm_dselect() { + local title="$1" + local backTitle="$2" + local defaultPath="$3" + + if [[ "$dialogType" == "yad" ]]; then + yad --file \ + --directory \ + --title="$title" \ + --filename="$defaultPath" \ + --width=600 \ + --height=400 + else + dialog --backtitle "$backTitle" \ + --title "$title" \ + --dselect "$defaultPath" 0 0 \ + --stdout + fi +} \ No newline at end of file diff --git a/.includes/functions.sh b/.includes/functions.sh index 1d98a1d..435651a 100644 --- a/.includes/functions.sh +++ b/.includes/functions.sh @@ -59,18 +59,15 @@ download() { { if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" ; then echo "Could not download \"$i\"..." exit 1 - fi; } | dialog --backtitle "Audio Game Manager" \ - --progressbox "Downloading \"$dest\" from \"$i\"" -1 -1 + fi; } | agm_progressbox "Audio Game Manager" "Downloading \"$dest\" from \"$i\"" local downloadError=1 case "${dest##*.}" in "pk3"|"zip") - unzip -tq "${cache}/${dest}" | dialog --backtitle "Audio Game Manager" \ - --progressbox "Validating ${dest##*.} file" -1 -1 --stdout + unzip -tq "${cache}/${dest}" | agm_progressbox "Audio Game Manager" "Validating ${dest##*.} file" downloadError=$? ;; "7z") - 7z t "${cache}/${dest}" | dialog --backtitle "Audio Game Manager" \ - --progressbox "Validating 7z file" -1 -1 --stdout + 7z t "${cache}/${dest}" | agm_progressbox "Audio Game Manager" "Validating 7z file" downloadError=$? ;; "exe") @@ -95,8 +92,7 @@ download() { esac if [[ $downloadError -ne 0 ]]; then rm -fv "${cache}/${dest}" - dialog --backtitle "Audio Game Manager" \ - --infobox "Error downloading \"${dest}\". Installation cannot continue." -1 -1 --stdout + agm_infobox "Audio Game Manager" "Audio Game Manager" "Error downloading \"${dest}\". Installation cannot continue." alert exit 1 fi @@ -118,9 +114,7 @@ get_installer() { if echo "$2" | xclip -selection clipboard 2> /dev/null ; then message+="\n\nThe URL has been copied to the clipboard." fi - dialog --ok-label "Continue" \ - --backtitle "Audiogame Manager" \ - --msgbox "$message" -1 -1 + agm_msgbox "Audiogame Manager" "Audiogame Manager" "$message" # Search the Desktop and Downloads directories for the installation file for i in ~/Downloads ~/Desktop ; do find $i -type f -name "$1" -exec cp -v {} "${cache}/" \; @@ -137,26 +131,19 @@ get_steam() { trap "exit 0" SIGINT echo "manual intervention required." alert - dialog --backtitle "Audiogame Manager" \ - --yes-label "Continue with Steam" \ - --no-label "Install manually" \ - --extra-button \ - --extra-label "Exit" \ - --yesno "To install the game manually, place files in \"${WINEPREFIX}/drive_c/Program Files/${game}\"" -1 -1 --stdout + agm_yesno "Audiogame Manager" "Audiogame Manager" "To install the game manually, place files in \"${WINEPREFIX}/drive_c/Program Files/${game}\". Continue with Steam installation?" case $? in 0) echo "The next steps will install through steamcmd." ;; 1) mkdir -p "${WINEPREFIX}/drive_c/Program Files/${game}" - dialog --backtitle "Audiogame Manager" \ - --msgbox "Place game files in \"${WINEPREFIX}/drive_c/Program Files/${game}\" and press enter to continue." -1 -1 --stdout + agm_msgbox "Audiogame Manager" "Audiogame Manager" "Place game files in \"${WINEPREFIX}/drive_c/Program Files/${game}\" and press enter to continue." return ;; *) exit 0 ;; esac # Check for steamcmd if ! command -v steamcmd &> /dev/null ; then - dialog --backtitle "Audiogame Manager" \ - --infobox "This installer requires steamcmd. Please install steamcmd and try again." -1 -1 + agm_infobox "Audiogame Manager" "Audiogame Manager" "This installer requires steamcmd. Please install steamcmd and try again." exit 1 fi # Create message for dialog. @@ -164,17 +151,12 @@ get_steam() { if echo "$2" | xclip -selection clipboard 2> /dev/null ; then message+="\n\nThe URL has been copied to the clipboard." fi - dialog --ok-label "Continue" \ - --backtitle "Audiogame Manager" \ - --msgbox "$message" -1 -1 + agm_msgbox "Audiogame Manager" "Audiogame Manager" "$message" # Get Steam user name. - steamUser="$(dialog --ok-label "Continue" \ - --backtitle "Audiogame Manager" \ - --inputbox "Please enter your Steam user name:" -1 -1 --stdout)" + steamUser="$(agm_inputbox "Audiogame Manager" "Audiogame Manager" "Please enter your Steam user name:" "")" # Download the game mkdir -p "${WINEPREFIX}/drive_c/Program Files/${game}" - steamcmd +@sSteamCmdForcePlatformType windows +force_install_dir "${WINEPREFIX}/drive_c/Program Files/$game" +login "$steamUser" +app_update "$1" +quit || { dialog --backtitle "Audiogame Manager" \ - --infobox "Something went wrong. Please make sure you have a stable internet connection, and if the problem persists, contact audiogame-manager's developers." -1 -1 + steamcmd +@sSteamCmdForcePlatformType windows +force_install_dir "${WINEPREFIX}/drive_c/Program Files/$game" +login "$steamUser" +app_update "$1" +quit || { agm_infobox "Audiogame Manager" "Audiogame Manager" "Something went wrong. Please make sure you have a stable internet connection, and if the problem persists, contact audiogame-manager's developers." exit 1; } } diff --git a/.includes/update.sh b/.includes/update.sh index fda540b..6af5e2a 100644 --- a/.includes/update.sh +++ b/.includes/update.sh @@ -12,10 +12,7 @@ check_news() { fi local newsOldTag="$(cat "$newsPath" 2> /dev/null)" if [[ "$newsTag" != "$newsOldTag" ]]; then - dialog --yes-label 'Play' \ - --no-label 'Later' \ - --backtitle 'Audiogame Manager News' \ - --yesno 'Audiogame manager news is available. Please use left and right arrows to navigate and enter to confirm.' -1 -1 || return + agm_yesno 'Audiogame Manager News' 'Audiogame Manager News' 'Audiogame manager news is available. Would you like to play it now?' || return sox -qV0 "$newsFile" -d &> /dev/null echo -n "$newsTag" > "$newsPath" fi @@ -38,8 +35,7 @@ update() { if [[ "$home" == "$remote" ]]; then return fi - dialog --backtitle "Audiogame Manager" \ - --yesno "Updates are available. Would you like to update now?" -1 -1 --stdout || return + agm_yesno "Audiogame Manager" "Audiogame Manager" "Updates are available. Would you like to update now?" || return { git pull git log '@{1}..' --pretty=format:'%an: %s' | tac; } exit $? diff --git a/.install/Bokurano Daibouken 3.sh b/.install/Bokurano Daibouken 3.sh index 4d1ed95..3d2f09c 100644 --- a/.install/Bokurano Daibouken 3.sh +++ b/.install/Bokurano Daibouken 3.sh @@ -1,6 +1,9 @@ +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" + if [[ ! -r "${cache}/bk3-dict.dat" ]]; then echo "http://www.nyanchangames.com/order/bk3translate.html" | xclip -selection clipboard 2> /dev/null - dialog --backtitle "Audiogame manager" --msgbox "If you would like English translations, the file is available at http://www.nyanchangames.com/order/bk3translate.html. Save the dict.dat file to your Downloads or Desktop directory. For convenience the url has been copied to your clipboard. Press enter when you are ready to continue." -1 -1 --stdout + agm_msgbox "Bokurano Daibouken 3" "Bokurano Daibouken 3" "If you would like English translations, the file is available at http://www.nyanchangames.com/order/bk3translate.html. Save the dict.dat file to your Downloads or Desktop directory. For convenience the url has been copied to your clipboard. Press enter when you are ready to continue." fi dictFile="" for i in "${HOME}/Downloads/dict.dat" "${HOME}/Desktop/dict.dat" ; do @@ -9,7 +12,7 @@ for i in "${HOME}/Downloads/dict.dat" "${HOME}/Desktop/dict.dat" ; do fi done if [[ "${#dictFile}" -ge 3 ]] && [[ ! -r "${cache}/bk3-dict.dat" ]]; then - dialog --backtitle "Audiogame manager" --yesno "Possible English translation file found at $dictFile. Would you like to use it for BK3?" -1 -1 --stdout && cp -v "$dictFile" "${cache}/bk3-dict.dat" + agm_yesno "Bokurano Daibouken 3" "Bokurano Daibouken 3" "Possible English translation file found at $dictFile. Would you like to use it for BK3?" && cp -v "$dictFile" "${cache}/bk3-dict.dat" fi download "https://www.nyanchangames.com/softs/nn3_setup.exe" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" export bottle="nyanchan" diff --git a/.install/Side Party.sh b/.install/Side Party.sh index 81099d8..52036f8 100644 --- a/.install/Side Party.sh +++ b/.install/Side Party.sh @@ -1,3 +1,6 @@ +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" + export WINEARCH=win64 export winVer="win7" get_installer "sideparty-win.zip" "https://masonasons.itch.io/sideparty" @@ -8,9 +11,7 @@ unzip -d "$WINEPREFIX/drive_c/Program Files/Side Party" "${cache}/sideparty-win. find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; add_launcher "c:\Program Files\Side Party\SideParty.exe" alert -sidePartyUser="$(dialog --ok-label "Continue" \ - --backtitle "Audiogame Manager" \ - --inputbox "Please enter a user name for Side Party score board:" -1 -1 --stdout)" +sidePartyUser="$(agm_inputbox "Side Party Installation" "Side Party Installation" "Please enter a user name for Side Party score board:" "")" mkdir -p "$WINEPREFIX/drive_c/Program Files/Side Party/masonasons.me/SideParty" cp -v "${cache}/SidePartySettings.dat" "$WINEPREFIX/drive_c/Program Files/Side Party/masonasons.me/SideParty/settings.dat" if [[ ${#sidePartyUser} -gt 3 ]]; then diff --git a/.install/Swamp.sh b/.install/Swamp.sh index 7df53a6..ee2737e 100644 --- a/.install/Swamp.sh +++ b/.install/Swamp.sh @@ -1,7 +1,10 @@ +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" + export bottle="aprone" export winVer="win7" export winetricksSettings="vd=1024x768" -dialog --backtitle "Audiogame manager" --yesno "If you do not have a full 32 bit gstreamer installation, the Swamp music can cause stuttering and crashes. Would you like to remove the music directory after installation?" -1 -1 --stdout +agm_yesno "Swamp Installation" "Swamp Installation" "If you do not have a full 32 bit gstreamer installation, the Swamp music can cause stuttering and crashes. Would you like to remove the music directory after installation?" deleteMusic=$? download "https://www.kaldobsky.com/audiogames/Swamp.zip" install_wine_bottle dx8vb quartz corefonts vb6run speechsdk diff --git a/audiogame-manager.sh b/audiogame-manager.sh index c919ca5..fe5cd46 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -39,11 +39,7 @@ game_installer() { menuList+=("Donate" "Donate") menuList+=("Become a Patron" "Become a Patron") # Show game selection dialog - game="$(dialog --backtitle "Audio Game Installer" \ - --clear \ - --ok-label "Install" \ - --no-tags \ - --menu "Please select a game to install" 0 0 0 "${menuList[@]}" --stdout)" + game="$(agm_menu "Audio Game Installer" "Audio Game Installer" "Please select a game to install" "${menuList[@]}")" [[ $? -ne 0 ]] && exit 0 # Handle selection if [[ -n "$game" ]]; then @@ -64,8 +60,7 @@ game_installer() { # Source and execute the install script source "$installScript" else - dialog --backtitle "Audio Game Installer" \ - --msgbox "Installation script not found for ${game}" -1 -1 + agm_msgbox "Audio Game Installer" "Audio Game Installer" "Installation script not found for ${game}" exit 1 fi ;; @@ -95,11 +90,7 @@ game_removal() { menuList+=("Donate" "Donate") menuList+=("Become a Patron" "Become a Patron") local game - game="$(dialog --backtitle "Audio Game Removal" \ - --clear \ - --ok-label "Remove" \ - --no-tags \ - --menu "Please select a game to delete" 0 0 0 "${menuList[@]}" --stdout)" + game="$(agm_menu "Audio Game Removal" "Audio Game Removal" "Please select a game to delete" "${menuList[@]}")" if [[ ${#game} -gt 0 ]]; then if [[ "$game" == "Donate" ]]; then open_url "https://ko-fi.com/stormux" @@ -155,11 +146,7 @@ kill_game() { done menuList+=("Donate" "Donate") menuList+=("Become a Patron" "Become a Patron") - local game="$(dialog --backtitle "Audio Game Killer" \ - --clear \ - --ok-label "Kill" \ - --no-tags \ - --menu "Please select a game to force stop" 0 0 0 "${menuList[@]}" --stdout)" + local game="$(agm_menu "Audio Game Killer" "Audio Game Killer" "Please select a game to force stop" "${menuList[@]}")" if [[ ${#game} -gt 0 ]]; then if [[ "$game" == "Donate" ]]; then open_url "https://ko-fi.com/stormux" @@ -319,13 +306,7 @@ game_launcher() { menuList+=("Donate" "Donate") menuList+=("Become a Patron" "Become a Patron") local game="" - game="$(dialog --backtitle "Audio Game Launcher" \ - --clear \ - --extra-button \ - --extra-label "Documentation" \ - --ok-label "Launch" \ - --no-tags \ - --menu "Please select a game to play" 0 0 0 "${menuList[@]}" --stdout)" + game="$(agm_menu "Audio Game Launcher" "Audio Game Launcher" "Please select a game to play" "${menuList[@]}")" local menuCode=$? if [[ $menuCode -eq 1 ]] || [[ $menuCode -eq 255 ]]; then exit 0 @@ -387,6 +368,14 @@ game_launcher() { trap "exit 0" SIGINT +# Detect dialog interface type BEFORE potentially setting DISPLAY +# This must happen before we modify DISPLAY to preserve console detection +if [[ -z "$DISPLAY" ]]; then + dialogType="dialog" +else + dialogType="yad" +fi + # If display isn't set assume we are launching from console and an X environment is running using display :0 if [[ -z "$DISPLAY" ]]; then export DISPLAY=":0" @@ -431,6 +420,7 @@ export nvdaControllerClientDll="${ipfsGateway}/ipfs/QmWu7YdSbKMk1Qm5DKvEA5hk1YuA # Source helper functions source .includes/bottle.sh # Also sourced in functions that need it source .includes/desktop.sh +source .includes/dialog-interface.sh source .includes/functions.sh source .includes/help.sh source .includes/update.sh @@ -502,8 +492,7 @@ while getopts "${args}" i ; do S) defaultRate="${OPTARG}";; t) gameCount=$(find ".install" -type f -iname "*.sh" | wc -l) - dialog --backtitle "Linux Game Manager" \ - --infobox "There are currently ${gameCount} games available." -1 -1 + agm_infobox "Linux Game Manager" "Linux Game Manager" "There are currently ${gameCount} games available." exit 0 ;; v) voiceName="${OPTARG}";; diff --git a/game-scripts/crazy-party-build-games.sh b/game-scripts/crazy-party-build-games.sh index ce2d45c..eb06f58 100755 --- a/game-scripts/crazy-party-build-games.sh +++ b/game-scripts/crazy-party-build-games.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # âe contents of this file are subject to the Common Public Attribution # License Version 1.0 (the âcenseâ you may not use this file except in @@ -37,6 +37,10 @@ # Works which are defined in the CPAL as a work which combines Covered Code # or portions thereof with code not governed by the terms of the CPAL. + +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" + for i in dialog unix2dos; do if ! command -v $i &> /dev/null ; then echo "Please install dialog and dos2unix before using this script." @@ -55,12 +59,7 @@ for i in "${gameList[@]}" ; do done unset gameList -gameList="$(dialog --clear \ - --no-tags \ - --ok-label "Add Games" \ - --separate-output \ - --backtitle "Select games to add to the $1 list." \ - --checklist "Press space to check or uncheck a selected game." 0 0 0 "${menuList[@]}" --stdout)" +gameList="$(agm_checklist "Crazy Party Game Builder" "Crazy Party Game Builder" "Press space to check or uncheck a selected game." "${menuList[@]}")" if [[ -z "${gameList}" ]]; then exit 0 @@ -70,5 +69,5 @@ mkdir -p "$HOME/.local/wine/crazy-party/drive_c/Program Files/Crazy-Party-beta73 echo "$gameList" >> "$HOME/.local/wine/crazy-party/drive_c/Program Files/Crazy-Party-beta73/game/${1}.txt" sort -uno "$HOME/.local/wine/crazy-party/drive_c/Program Files/Crazy-Party-beta73/game/${1}.txt" "$HOME/.local/wine/crazy-party/drive_c/Program Files/Crazy-Party-beta73/game/${1}.txt" eunix2dos "$HOME/.local/wine/crazy-party/drive_c/Program Files/Crazy-Party-beta73/game/${1}.txt" -dialog --infobox "Game list \"$1\" updated." 10 80 +agm_infobox "Crazy Party Game Builder" "Crazy Party Game Builder" "Game list \"$1\" updated." exit 0 diff --git a/game-scripts/crazy-party-update.sh b/game-scripts/crazy-party-update.sh index d8faeb6..8aa6bc2 100755 --- a/game-scripts/crazy-party-update.sh +++ b/game-scripts/crazy-party-update.sh @@ -37,6 +37,10 @@ # Works which are defined in the CPAL as a work which combines Covered Code # or portions thereof with code not governed by the terms of the CPAL. + +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" + newVersion=82 WINEPREFIX="${XDG_DATA_HOME:-$HOME/.local}/wine/crazy-party" @@ -68,6 +72,6 @@ find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${c sed -i "s/Crazy-Party-beta${oldVersion}/Crazy-Party-beta${newVersion}/" "$configFile" cp -v "${WINEPREFIX}/drive_c/Program Files/Crazy-Party-beta${oldVersion}/save.bin" "$HOME/.local/wine/crazy-party/drive_c/Program Files/Crazy-Party-beta${newVersion}/" cp -ruv "${WINEPREFIX}/drive_c/Program Files/Crazy-Party-beta${oldVersion}/"* "$HOME/.local/wine/crazy-party/drive_c/Program Files/Crazy-Party-beta${newVersion}/" 2> /dev/null -rm -rf "${WINEPREFIX}/drive_c/Program Files/Crazy-Party-beta${oldVersion}/") | dialog --progressbox "updating Crazy Party, please wait..." -1 -1 +rm -rf "${WINEPREFIX}/drive_c/Program Files/Crazy-Party-beta${oldVersion}/") | agm_progressbox "Crazy Party Update" "Updating Crazy Party, please wait..." exit 0 diff --git a/game-scripts/rettou-update.sh b/game-scripts/rettou-update.sh index d9b1920..f47bd21 100755 --- a/game-scripts/rettou-update.sh +++ b/game-scripts/rettou-update.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # âe contents of this file are subject to the Common Public Attribution # License Version 1.0 (the âcenseâ you may not use this file except in @@ -37,6 +37,10 @@ # Works which are defined in the CPAL as a work which combines Covered Code # or portions thereof with code not governed by the terms of the CPAL. + +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" + cache="${XDG_CACHE_HOME:-$HOME/.cache}/audiogame-manager" updateURL="https://www.kaldobsky.com/audiogames" updateFiles=("rettou.zip") @@ -47,7 +51,7 @@ for i in "${updateFiles[@]}" ; do rm -fv "${cache}/${i}" curl -L4 -C - --retry 10 --output "${cache}/$i" "${updateURL}/$i" unzip -o -d ~/".local/wine/aprone/drive_c/Program Files/rettou" "${cache}/${i}" -done | dialog --progressbox "Updating Rettou, please wait..." -1 -1 +done | agm_progressbox "Rettou Update" "Updating Rettou, please wait..." exit 0 diff --git a/game-scripts/scramble-update.sh b/game-scripts/scramble-update.sh index 2bd3a77..d098566 100755 --- a/game-scripts/scramble-update.sh +++ b/game-scripts/scramble-update.sh @@ -37,11 +37,15 @@ # Works which are defined in the CPAL as a work which combines Covered Code # or portions thereof with code not governed by the terms of the CPAL. + +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" + cache="${XDG_CACHE_HOME:-$HOME/.cache}/audiogame-manager" url="https://stevend.net/downloads/scramble_win32.zip" (rm -v "${cache}/scramble_win32.zip" wget -O "${cache}/scramble_win32.zip" "$url" || { echo "Could not download file."; exit 1; } unzip -DDod "$HOME/.local/wine/scramble!/drive_c/Program Files" "${cache}/scramble_win32.zip" -find ~/".local/wine/scramble!" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \;) | dialog --progressbox "updating Scramble!, please wait..." -1 -1 +find ~/".local/wine/scramble!" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \;) | agm_progressbox "Scramble Update" "Updating Scramble!, please wait..." exit 0 diff --git a/game-scripts/swamp-update.sh b/game-scripts/swamp-update.sh index d494af5..fbf397e 100755 --- a/game-scripts/swamp-update.sh +++ b/game-scripts/swamp-update.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # âe contents of this file are subject to the Common Public Attribution # License Version 1.0 (the âcenseâ you may not use this file except in @@ -37,19 +37,23 @@ # Works which are defined in the CPAL as a work which combines Covered Code # or portions thereof with code not governed by the terms of the CPAL. + +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" + cache="${XDG_CACHE_HOME:-$HOME/.cache}/audiogame-manager" updateURL="https://www.kaldobsky.com/audiogames" updateFiles=("SwampPatch.zip") -dialog --backtitle "Audiogame manager" --yesno "If you do not have a full 32 bit gstreamer installation, the Swamp music can cause stuttering and crashes. Would you like to remove the music directory after installation?" -1 -1 --stdout +agm_yesno "Swamp Update" "Swamp Update" "If you do not have a full 32 bit gstreamer installation, the Swamp music can cause stuttering and crashes. Would you like to remove the music directory after installation?" deleteMusic=$? # Back up configuration files. for i in losers.txt muted.txt scriptkeys.txt keyconfig.ini ; do cp -v ~/".local/wine/aprone/drive_c/Program Files/swamp/${i}" ~/".local/wine/aprone/drive_c/Program Files/swamp/${i}.agm" echo "${i} backed up as ${i}.agm" -done | dialog --progressbox "Backing up configuration files. They can be found in your swamp directory." -1 -1 +done | agm_progressbox "Swamp Update" "Backing up configuration files. They can be found in your swamp directory." sleep 3 @@ -57,7 +61,7 @@ sleep 3 for i in "${updateFiles[@]}" ; do wget -O "${cache}/$i" "${updateURL}/$i" unzip -o -d ~/".local/wine/aprone/drive_c/Program Files/swamp" "${cache}/${i}" -done | dialog --progressbox "Updating Swamp, please wait..." -1 -1 +done | agm_progressbox "Swamp Update" "Updating Swamp, please wait..." # Delete music if requested. if [[ $deleteMusic -eq 0 ]]; then diff --git a/speech/install_cepstral.sh b/speech/install_cepstral.sh index 2f971a5..3e33838 100755 --- a/speech/install_cepstral.sh +++ b/speech/install_cepstral.sh @@ -8,6 +8,16 @@ # Dialog accessibility export DIALOGOPTS='--no-lines --visit-items' + +# Detect dialog interface type BEFORE potentially setting DISPLAY +if [[ -z "$DISPLAY" ]]; then + dialogType="dialog" +else + dialogType="yad" +fi + +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" # Turn off debug messages export WINEDEBUG="-all" # Make sure display is set in case installed from console. @@ -21,9 +31,9 @@ prefix="https://www.cepstral.com/downloads/installers/windows/" register() { local v="$1" - company="$(dialog --clear --inputbox "Company name (leave empty if none)" -1 -1 --stdout)" || exit $? - customer="$(dialog --clear --inputbox "Customer name" -1 -1 --stdout)" || exit $? - key="$(dialog --clear --inputbox "License key" -1 -1 --stdout)" || exit $? + company="$(agm_inputbox "Install Cepstral" "Install Cepstral" "Company name (leave empty if none)" "")" || exit $? + customer="$(agm_inputbox "Install Cepstral" "Install Cepstral" "Customer name" "")" || exit $? + key="$(agm_inputbox "Install Cepstral" "Install Cepstral" "License key" "")" || exit $? eval "wine \"c:\\Program Files\\Cepstral\\bin\\swift.exe\" --reg-voice --voice-name \"$v\" --customer-name \"$customer\" --company-name \"$company\" --license-key \"$key\"" exit 0 } @@ -75,10 +85,7 @@ declare -a bottle for i in $(find ~/.local/wine/ -maxdepth 1 -type d -not -name 'wine' | sort) ; do bottle+=("$i" "${i##*/}") done -export WINEPREFIX="$(dialog --backtitle "Use the up and down arrow keys to find the option you want, then press enter to select it." \ - --clear \ - --no-tags \ - --menu "Select A Wine Bottle" 0 0 0 "${bottle[@]}" --stdout)" +export WINEPREFIX="$(agm_menu "Install Cepstral" "Install Cepstral" "Select A Wine Bottle" "${bottle[@]}")" if [[ -z "${WINEPREFIX}" ]]; then @@ -90,10 +97,7 @@ if [[ "$1" == "-r" || "$1" == "--register" ]]; then action="register" fi -voice="$(dialog --backtitle "Use the up and down arrow keys to find the option you want, then press enter to select it." \ - --clear \ - --no-tags \ - --menu "Select A voice to $action" 0 0 0 "${voices[@]}" --stdout)" +voice="$(agm_menu "Install Cepstral" "Install Cepstral" "Select A voice to $action" "${voices[@]}")" if [[ "$action" == "register" ]]; then register $voice @@ -103,7 +107,7 @@ fi mkdir -p ~/Downloads if ! [[ -e ~/Downloads/Cepstral_${voice}_windows_${version}.${msiexe} ]]; then - wget -P ~/Downloads/ "${prefix}Cepstral_${voice}_windows_${version}.${msiexe}" | dialog --progressbox "Downloading voice..." -1 -1 + wget -P ~/Downloads/ "${prefix}Cepstral_${voice}_windows_${version}.${msiexe}" | agm_progressbox "Install Cepstral" "Downloading voice..." fi # Get the install command. @@ -114,7 +118,7 @@ cmd="${cmd} ~/Downloads/Cepstral_${voice}_windows_${version}.${msiexe}" # Install the voice (eval "$cmd" & [ "$msiexe" = "exe" ] && xdotool sleep 20 key --delay 75 alt+n key --delay 75 alt+a key --delay 75 alt+n key --delay 75 alt+o key --delay 75 alt+i sleep 20 key --delay 75 alt+f -wineserver -w) | dialog --progressbox "installing voice..." -1 -1 +wineserver -w) | agm_progressbox "Install Cepstral" "Installing voice..." # Make voices louder. find "${WINEPREFIX}/drive_c/Program Files/Cepstral/voices" -type d -not -name voices -exec bash -c 'for d ; do echo "GAIN 2.5" > "$d/default.sfx";done' _ {} \; diff --git a/speech/set-voice.sh b/speech/set-voice.sh index 29656b1..595694e 100755 --- a/speech/set-voice.sh +++ b/speech/set-voice.sh @@ -42,6 +42,16 @@ #--code-- +# Detect dialog interface type BEFORE potentially setting DISPLAY +if [[ -z "$DISPLAY" ]]; then + dialogType="dialog" +else + dialogType="yad" +fi + +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" + help() { echo "${0##*/}" echo "Released under the terms of the Common Public Attribution License Version 1.0" @@ -84,14 +94,14 @@ declare -A command=( msgbox() { # Returns: None # Shows the provided message on the screen with an ok button. -dialog --clear --msgbox "$*" 0 0 +agm_msgbox "Set Voice" "Set Voice" "$*" } infobox() { # Returns: None # Shows the provided message on the screen with no buttons. local timeout=3 - dialog --infobox "$*" 0 0 + agm_infobox "Set Voice" "Set Voice" "$*" read -n1 -t $timeout continue # Clear any keypresses from the buffer read -t 0.01 continue @@ -102,7 +112,7 @@ yesno() { # Args: Question to user. # Called in if $(yesno) == "Yes" # Or variable=$(yesno) - dialog --clear --backtitle "Press 'Enter' for "yes" or 'Escape' for "no"." --yesno "$*" 0 0 --stdout + agm_yesno "Set Voice" "Set Voice" "$*" if [[ $? -eq 0 ]]; then echo "Yes" else @@ -117,12 +127,7 @@ menulist() { for i in "${@}" ; do menuList+=("$i" "$i") done - dialog --backtitle "Use the up and down arrow keys to find the option you want, then press enter to select it." \ - --clear \ - --extra-button \ - --extra-label "Test Voice" \ - --no-tags \ - --menu "Please select one" 0 0 0 "${menuList[@]}" --stdout + agm_menu "Set Voice" "Set Voice" "Please select one" "${menuList[@]}" return $? } @@ -251,10 +256,7 @@ if [[ -z "${bottle}" ]]; then exit 1 fi - export WINEPREFIX="$(dialog --backtitle "Use the up and down arrow keys to find the option you want, then press enter to select it." \ - --clear \ - --no-tags \ - --menu "Select A Wine Bottle" 0 0 0 "${bottles[@]}" --stdout)" + export WINEPREFIX="$(agm_menu "Set Voice" "Set Voice" "Select A Wine Bottle" "${bottles[@]}")" fi if [[ -z "${WINEPREFIX}" ]]; then @@ -303,7 +305,7 @@ done oldVoice="$($grep -P '"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"' "${WINEPREFIX}/user.reg" | $sed -E -e 's/"DefaultTokenId"="([^"]+)"/\1/g')" exit=1 if [[ "${#voiceList[@]}" -eq 0 ]]; then - dialog --msgbox "No voices found in ${WINEPREFIX}. Make sure SAPI voices are installed in this Wine prefix." 0 0 + agm_msgbox "Set Voice" "Set Voice" "No voices found in ${WINEPREFIX}. Make sure SAPI voices are installed in this Wine prefix." exit 1 fi while [[ $exit -ne 0 ]] ; do diff --git a/wine/mkwine.sh b/wine/mkwine.sh index 41b79da..ab1ec15 100755 --- a/wine/mkwine.sh +++ b/wine/mkwine.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # âe contents of this file are subject to the Common Public Attribution # License Version 1.0 (the âcenseâ you may not use this file except in @@ -38,6 +38,9 @@ # or portions thereof with code not governed by the terms of the CPAL. +# Source dialog interface wrapper +source "${0%/*}/../.includes/dialog-interface.sh" + export WINEARCH=win32 bottle="${1,,}" shift @@ -47,6 +50,6 @@ export WINEPREFIX="$HOME/.local/wine/${bottle}" # Arguments to the function are dependancies to be installed. (wine msiexec /i z:/usr/share/wine/mono/$(ls -1 /usr/share/wine/mono/) /silent wine msiexec /i z:$(ls -1 /usr/share/wine/gecko/*x86.msi) /silent - winetricks -q $@ ${winVer:-winxp} ${winetricksSettings}) | dialog --progressbox "Installing wine bottle, please wait..." -1 -1 + winetricks -q $@ ${winVer:-winxp} ${winetricksSettings}) | agm_progressbox "Wine Bottle Creation" "Installing wine bottle, please wait..." exit 0 From 4d2134b9a9b4070dd1dcf48bd0076f61e05c7892 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Mon, 4 Aug 2025 19:42:59 -0400 Subject: [PATCH 12/77] A *lot* of work done on the audiogame-manager refactor. Hopefully getting somewhat close to stability, but I doubt it. --- .includes/bottle.sh | 96 ++++++------------------ .includes/dialog-interface.sh | 9 ++- .install/Alien Outback.sh | 2 +- .install/Battle of the Hunter.sh | 2 +- .install/Battlefield 2D.sh | 2 +- .install/Bokurano Daibouken 2.sh | 2 +- .install/Bokurano Daibouken 3.sh | 2 +- .install/Bokurano Daibouken.sh | 2 +- .install/Bombercats.sh | 2 +- .install/Castaways 2.sh | 2 +- .install/Castaways.sh | 2 +- .install/Challenge of the Horse.sh | 2 +- .install/Change Reaction.sh | 2 +- .install/Clashes of the Sky.sh | 2 +- .install/Copter Mission.sh | 2 +- .install/Danger on the Wheel.sh | 2 +- .install/Dark Destroyer.sh | 2 +- .install/Daytona and the Book of Gold.sh | 2 +- .install/Death on the Road.sh | 2 +- .install/Dog Who Hates Toast.sh | 2 +- .install/Dreamland.sh | 2 +- .install/Duck Hunt.sh | 2 +- .install/DynaMan.sh | 2 +- .install/ESP Pinball Classic.sh | 2 +- .install/ESP Pinball Extreme.sh | 2 +- .install/ESP Pinball Party Pack.sh | 2 +- .install/Entombed.sh | 3 +- .install/Fuck That Bird.sh | 2 +- .install/Hammer of Glory.sh | 2 +- .install/Insect Therapy.sh | 2 +- .install/Judgement Day.sh | 2 +- .install/Laser Breakout.sh | 2 +- .install/Lockpick.sh | 2 +- .install/Lost.sh | 2 +- .install/Lunimals.sh | 2 +- .install/Marina Break.sh | 2 +- .install/Maze Craze.sh | 2 +- .install/Monkey Business.sh | 2 +- .install/Paw Prints.sh | 2 +- .install/Penta Path.sh | 2 +- .install/Pigeon Panic.sh | 2 +- .install/Preludeamals.sh | 2 +- .install/Puzzle Divided.sh | 2 +- .install/Rettou.sh | 2 +- .install/Revelation.sh | 2 +- .install/Rhythm Rage.sh | 2 +- .install/Run For Your Life.sh | 2 +- .install/Screaming Strike 2.sh | 2 +- .install/Shadow Line.sh | 3 +- .install/Silver Dollar.sh | 2 +- .install/Skateboarder Pro.sh | 2 +- .install/Slender Lost Vision.sh | 2 +- .install/Smashathon.sh | 2 +- .install/Super Deekout.sh | 2 +- .install/Super Egg Hunt.sh | 2 +- .install/Super Liam.sh | 2 +- .install/Swamp.sh | 2 +- .install/Tarot Assistant.sh | 2 +- .install/Ten Pin Alley.sh | 2 +- .install/The Great Toy Robbery.sh | 2 +- .install/Thief.sh | 2 +- .install/Triple Triad.sh | 2 +- .install/Ultimate SounDoku.sh | 2 +- .install/Villains From Beyond.sh | 2 +- .install/World of War.sh | 2 +- .install/haunted Party.sh | 2 +- speech/clipboard_translator.sh | 24 +++--- speech/speak_window_title.sh | 4 +- 68 files changed, 109 insertions(+), 154 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index 396a067..cf4bb05 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -1,44 +1,13 @@ +#!/usr/bin/env bash + get_bottle() { - local architecture="${1/win/}" + # Simple rule: wine64 for everything, wine32 only for speech APIs + local architecture="${1:-win64}" + architecture="${architecture/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}"; } | agm_progressbox "Wine Installation" "Installing $2 bit Wine version $1." - set +e -} +# 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. @@ -104,29 +73,22 @@ install_rhvoice() { } 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 + # Simple rule: wine64 for everything, wine32 ONLY for speech APIs (SAPI5 doesn't work in WOW64) + local architecture + if [[ "$*" =~ speechsdk || "$*" =~ sapi ]]; then + architecture=32 + export WINEARCH="win32" + echo "Using wine32 for speech API compatibility (SAPI5 broken in WOW64)" + else + architecture=64 + export WINEARCH="win64" + echo "Using wine64 for optimal performance" + fi + + export WINEPREFIX="$HOME/.local/wine${architecture}" 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 game is set for custom bottle. - local bottle="" - if [[ ${#game} -gt 0 ]]; then - 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)" @@ -154,21 +116,13 @@ install_wine_bottle() { 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}" + winetricks -q isolate_home "$@" "${winVer:-win7}" ${winetricksSettings} + + # Set default voice for speech-enabled games + 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 - # 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() { diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index 8f96bcc..322e3b9 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -49,8 +49,9 @@ agm_menu() { --height=400 \ --width=600) - # Return the mapped value + # Strip trailing pipes and return the mapped value if [[ -n "$selectedDescription" ]]; then + selectedDescription="${selectedDescription%|}" echo "${valueMap["$selectedDescription"]}" fi else @@ -185,10 +186,12 @@ agm_yesno() { local text="$3" if [[ "$dialogType" == "yad" ]]; then - yad --question \ + yad --form \ --title="$title" \ - --text="$text" \ + --field="$text:LBL" \ --selectable-labels \ + --button="Yes:0" \ + --button="No:1" \ --width=400 else dialog --backtitle "$backTitle" \ diff --git a/.install/Alien Outback.sh b/.install/Alien Outback.sh index 1a41a7c..70e0b6f 100644 --- a/.install/Alien Outback.sh +++ b/.install/Alien Outback.sh @@ -1,5 +1,5 @@ download "http://download.dracoent.com/Windows/classic/AOSetup.exe" -export bottle="draconis" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle vb6run dx8vb speechsdk quartz cp -v "${cache}/AOSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" diff --git a/.install/Battle of the Hunter.sh b/.install/Battle of the Hunter.sh index 444a7b4..e7d465a 100644 --- a/.install/Battle of the Hunter.sh +++ b/.install/Battle of the Hunter.sh @@ -1,5 +1,5 @@ download "http://files.tunmi13.com/projects_archive/bth.zip" -export bottle="tunmi13" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle speechsdk unzip -d "$WINEPREFIX/drive_c/Program Files/$game" "${cache}/bth.zip" diff --git a/.install/Battlefield 2D.sh b/.install/Battlefield 2D.sh index 7914fe8..b056b0f 100644 --- a/.install/Battlefield 2D.sh +++ b/.install/Battlefield 2D.sh @@ -2,7 +2,7 @@ get_installer "bf.zip" "https://tunmi13.itch.io/battlefield-2d" download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" -export bottle=tunmi13-64bit +# Uses standard wine path based on architecture (win32/win64) install_wine_bottle unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/bf.zip" find "${WINEPREFIX}/drive_c/Program Files/bf" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; diff --git a/.install/Bokurano Daibouken 2.sh b/.install/Bokurano Daibouken 2.sh index 85b5e50..2210988 100644 --- a/.install/Bokurano Daibouken 2.sh +++ b/.install/Bokurano Daibouken 2.sh @@ -1,5 +1,5 @@ download "https://www.nyanchangames.com/softs/nn2_setup.exe" -export bottle="nyanchan" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle 7z x -o"$WINEPREFIX/drive_c/nyanchangame/bk2" "${cache}/nn2_setup.exe" diff --git a/.install/Bokurano Daibouken 3.sh b/.install/Bokurano Daibouken 3.sh index 3d2f09c..ea40ee3 100644 --- a/.install/Bokurano Daibouken 3.sh +++ b/.install/Bokurano Daibouken 3.sh @@ -15,7 +15,7 @@ if [[ "${#dictFile}" -ge 3 ]] && [[ ! -r "${cache}/bk3-dict.dat" ]]; then agm_yesno "Bokurano Daibouken 3" "Bokurano Daibouken 3" "Possible English translation file found at $dictFile. Would you like to use it for BK3?" && cp -v "$dictFile" "${cache}/bk3-dict.dat" fi download "https://www.nyanchangames.com/softs/nn3_setup.exe" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" -export bottle="nyanchan" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle cp "${cache}/nvda2speechd" "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" diff --git a/.install/Bokurano Daibouken.sh b/.install/Bokurano Daibouken.sh index 4402fb5..9fc8179 100644 --- a/.install/Bokurano Daibouken.sh +++ b/.install/Bokurano Daibouken.sh @@ -1,5 +1,5 @@ download "https://www.nyanchangames.com/softs/nn_setup.exe" -export bottle="nyanchan" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle 7z x -o"$WINEPREFIX/drive_c/nyanchangame/bk" "${cache}/nn_setup.exe" diff --git a/.install/Bombercats.sh b/.install/Bombercats.sh index 1f206fc..91e0744 100644 --- a/.install/Bombercats.sh +++ b/.install/Bombercats.sh @@ -1,5 +1,5 @@ download "http://oriolgomez.com/games/bombercats_en.zip" -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle unzip -d "$WINEPREFIX/drive_c/Program Files/bomvercats" "${cache}/bombercats_en.zip" diff --git a/.install/Castaways 2.sh b/.install/Castaways 2.sh index adeecca..17e9f48 100644 --- a/.install/Castaways 2.sh +++ b/.install/Castaways 2.sh @@ -1,5 +1,5 @@ download "http://www.kaldobsky.com/audiogames/castaways2beta.zip" -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle vb6run dx8vb speechsdk unzip -d "$WINEPREFIX/drive_c/Program Files/castaways2" "${cache}/castaways2beta.zip" diff --git a/.install/Castaways.sh b/.install/Castaways.sh index 82cf9ea..48e2240 100644 --- a/.install/Castaways.sh +++ b/.install/Castaways.sh @@ -1,5 +1,5 @@ download "https://www.kaldobsky.com/audiogames/castaways.zip" -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle vb6run dx8vb speechsdk unzip -d "$WINEPREFIX/drive_c/Program Files/castaways" "${cache}/castaways.zip" diff --git a/.install/Challenge of the Horse.sh b/.install/Challenge of the Horse.sh index d0a8c04..a92f2c1 100644 --- a/.install/Challenge of the Horse.sh +++ b/.install/Challenge of the Horse.sh @@ -1,5 +1,5 @@ download "http://files.tunmi13.com/projects_archive/coth.zip" -export bottle="tunmi13" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle speechsdk unzip -d "$WINEPREFIX/drive_c/Program Files/$game" "${cache}/coth.zip" diff --git a/.install/Change Reaction.sh b/.install/Change Reaction.sh index af5df01..5ae499e 100644 --- a/.install/Change Reaction.sh +++ b/.install/Change Reaction.sh @@ -1,5 +1,5 @@ download "https://download.dracoent.com/Windows/ChangeReactionSetup.exe" -export bottle="draconis" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle vb6run dx8vb speechsdk quartz cp -v "${cache}/ChangeReactionSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" diff --git a/.install/Clashes of the Sky.sh b/.install/Clashes of the Sky.sh index 94b4ee1..136a5a3 100644 --- a/.install/Clashes of the Sky.sh +++ b/.install/Clashes of the Sky.sh @@ -1,5 +1,5 @@ get_installer "clashes_of_the_sky.zip" "https://tunmi13.itch.io/clashes-of-the-sky" -export bottle="tunmi13" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle speechsdk unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/clashes_of_the_sky.zip" diff --git a/.install/Copter Mission.sh b/.install/Copter Mission.sh index 14ac50e..c92a7a0 100644 --- a/.install/Copter Mission.sh +++ b/.install/Copter Mission.sh @@ -1,4 +1,4 @@ -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://oriolgomez.com/games/copter_en.zip" install_wine_bottle diff --git a/.install/Danger on the Wheel.sh b/.install/Danger on the Wheel.sh index 0dfe23b..05f21b4 100644 --- a/.install/Danger on the Wheel.sh +++ b/.install/Danger on the Wheel.sh @@ -1,5 +1,5 @@ download "http://oriolgomez.com/games/wheel_en.zip" -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle speechsdk unzip -d "$WINEPREFIX/drive_c/Program Files/danger on the wheel" "${cache}/wheel_en.zip" diff --git a/.install/Dark Destroyer.sh b/.install/Dark Destroyer.sh index dc8c70f..1286575 100644 --- a/.install/Dark Destroyer.sh +++ b/.install/Dark Destroyer.sh @@ -1,5 +1,5 @@ # -export bottle=pbgames +# No custom bottle needed - use standard wine path based on architecture download "https://www.agarchive.net/games/pb/Dark-Destroyer-Setup.exe" install_wine_bottle speechsdk ie6 wine "$cache/Dark-Destroyer-Setup.exe" /silent diff --git a/.install/Daytona and the Book of Gold.sh b/.install/Daytona and the Book of Gold.sh index 1e3c61d..a5fa3b7 100644 --- a/.install/Daytona and the Book of Gold.sh +++ b/.install/Daytona and the Book of Gold.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" export winetricksSettings="vd=1024x768" download "https://kaldobsky.com/audiogames/Daytona.zip" diff --git a/.install/Death on the Road.sh b/.install/Death on the Road.sh index e6d8ff0..2573437 100644 --- a/.install/Death on the Road.sh +++ b/.install/Death on the Road.sh @@ -1,4 +1,4 @@ -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://oriolgomez.com/games/road_en.zip" install_wine_bottle diff --git a/.install/Dog Who Hates Toast.sh b/.install/Dog Who Hates Toast.sh index 6aa746e..03d13ad 100644 --- a/.install/Dog Who Hates Toast.sh +++ b/.install/Dog Who Hates Toast.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/dogwhohatestoast.zip" diff --git a/.install/Dreamland.sh b/.install/Dreamland.sh index 8013107..9ca90e4 100644 --- a/.install/Dreamland.sh +++ b/.install/Dreamland.sh @@ -2,7 +2,7 @@ download https://scwl-1251129685.cos.ap-shanghai.myqcloud.com/dreamland/Win/Drea install_wine_bottle speechsdk ole32 $wine "${cache}/DreamLandSetup.exe" /silent "Duck Hunt") -export bottle="l-works" +# Uses standard wine path based on architecture (win32/win64) download "http://files.l-works.net/dhsetup.exe" install_wine_bottle vb6run dx8vb speechsdk wine "${cache}/dhsetup.exe" /silent diff --git a/.install/Duck Hunt.sh b/.install/Duck Hunt.sh index bb87a34..49a98ea 100644 --- a/.install/Duck Hunt.sh +++ b/.install/Duck Hunt.sh @@ -1,5 +1,5 @@ "Duck Hunt") -export bottle="l-works" +# Uses standard wine path based on architecture (win32/win64) download "http://files.l-works.net/dhsetup.exe" install_wine_bottle vb6run dx8vb speechsdk wine "${cache}/dhsetup.exe" /silent diff --git a/.install/DynaMan.sh b/.install/DynaMan.sh index 25c768c..ef6e1df 100644 --- a/.install/DynaMan.sh +++ b/.install/DynaMan.sh @@ -1,5 +1,5 @@ export winVer="win7" -export bottle="draconis" +# Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/DMSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz cp -v "${cache}/DMSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" diff --git a/.install/ESP Pinball Classic.sh b/.install/ESP Pinball Classic.sh index ac46a98..5c4f4bb 100644 --- a/.install/ESP Pinball Classic.sh +++ b/.install/ESP Pinball Classic.sh @@ -1,5 +1,5 @@ export winVer="win7" -export bottle="draconis" +# Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/PBCSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz cp -v "${cache}/PBCSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" diff --git a/.install/ESP Pinball Extreme.sh b/.install/ESP Pinball Extreme.sh index 4079c97..8e290c7 100644 --- a/.install/ESP Pinball Extreme.sh +++ b/.install/ESP Pinball Extreme.sh @@ -1,5 +1,5 @@ export winVer="win7" -export bottle="draconis" +# Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/PBXSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz cp -v "${cache}/PBXSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" diff --git a/.install/ESP Pinball Party Pack.sh b/.install/ESP Pinball Party Pack.sh index c4701d9..109ba61 100644 --- a/.install/ESP Pinball Party Pack.sh +++ b/.install/ESP Pinball Party Pack.sh @@ -1,5 +1,5 @@ export winVer="win7" -export bottle="draconis" +# Uses standard wine path based on architecture (win32/win64) export WINEPREFIX="$HOME/.local/wine/draconis" # Only works in conjunction with esp pinball extreme. if ! [ -f "$HOME/.local/wine/$bottle/drive_c/Program Files/Draconis Entertainment/ESP Pinball Xtreme/pbx.exe" ] ; then diff --git a/.install/Entombed.sh b/.install/Entombed.sh index f07746e..b3a3f73 100644 --- a/.install/Entombed.sh +++ b/.install/Entombed.sh @@ -1,6 +1,5 @@ -export version="6.18" download "http://blind-games.com/newentombed/EntombedSetup.exe" "https://download.microsoft.com/download/E/C/1/EC1B2340-67A0-4B87-85F0-74D987A27160/SSCERuntime-ENU.exe" "https://stormgames.wolfe.casa/downloads/Entombed.exe.config" "https://stormgames.wolfe.casa/downloads/mfplat.dll" -install_wine "$version" "32" +# Uses wine32 due to speechsdk dependency export winVer="win7" install_wine_bottle speechsdk msvcrt40 gdiplus ie7 wmp11 mf # Ok, more dotnet. diff --git a/.install/Fuck That Bird.sh b/.install/Fuck That Bird.sh index 0fad3e2..0f1a15e 100644 --- a/.install/Fuck That Bird.sh +++ b/.install/Fuck That Bird.sh @@ -1,4 +1,4 @@ -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://oriolgomez.com/games/bird_en.zip" install_wine_bottle diff --git a/.install/Hammer of Glory.sh b/.install/Hammer of Glory.sh index 520dc73..645b328 100644 --- a/.install/Hammer of Glory.sh +++ b/.install/Hammer of Glory.sh @@ -1,4 +1,4 @@ -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://oriolgomez.com/games/hammer_en.zip" install_wine_bottle speechsdk diff --git a/.install/Insect Therapy.sh b/.install/Insect Therapy.sh index 7aa5925..313aa0b 100644 --- a/.install/Insect Therapy.sh +++ b/.install/Insect Therapy.sh @@ -1,4 +1,4 @@ -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://oriolgomez.com/games/insect_en.zip" install_wine_bottle diff --git a/.install/Judgement Day.sh b/.install/Judgement Day.sh index 60ae578..a9a4f90 100644 --- a/.install/Judgement Day.sh +++ b/.install/Judgement Day.sh @@ -1,4 +1,4 @@ -export bottle="l-works" +# Uses standard wine path based on architecture (win32/win64) download "http://files.l-works.net/judgmentdayfullsetup.exe" install_wine_bottle vb6run dx8vb quartz wine "${cache}/judgmentdayfullsetup.exe" /silent diff --git a/.install/Laser Breakout.sh b/.install/Laser Breakout.sh index 1833bf8..8266a4d 100644 --- a/.install/Laser Breakout.sh +++ b/.install/Laser Breakout.sh @@ -1,5 +1,5 @@ # Currently only speaks in japanese, looking to see if we can find an english version. -export bottle="nyanchan" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "https://www.agarchive.net/games/nyanchan/laser%20breakout.7z" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" "https://stormgames.wolfe.casa/downloads/laser-breakout-options.dat" install_wine_bottle diff --git a/.install/Lockpick.sh b/.install/Lockpick.sh index 427142b..a9fa742 100644 --- a/.install/Lockpick.sh +++ b/.install/Lockpick.sh @@ -1,4 +1,4 @@ -export bottle="l-works" +# Uses standard wine path based on architecture (win32/win64) download "http://files.l-works.net/lockpicksetup.exe" install_wine_bottle vb6run dx8vb wine "${cache}/lockpicksetup.exe" /silent diff --git a/.install/Lost.sh b/.install/Lost.sh index 2313d07..7a24330 100644 --- a/.install/Lost.sh +++ b/.install/Lost.sh @@ -1,4 +1,4 @@ -export bottle=dan-z +# Uses standard wine path based on architecture (win32/win64) download "https://agarchive.net/games/danZ/lost.zip" install_wine_bottle speechsdk unzip -d "$WINEPREFIX/drive_c/Program Files/lost" "$cache/lost.zip" diff --git a/.install/Lunimals.sh b/.install/Lunimals.sh index 349ce03..901d25e 100644 --- a/.install/Lunimals.sh +++ b/.install/Lunimals.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" export winetricksSettings="vd=1024x768" download "https://kaldobsky.com/audiogames/lunimals.zip" diff --git a/.install/Marina Break.sh b/.install/Marina Break.sh index 8ed3afd..6a46527 100644 --- a/.install/Marina Break.sh +++ b/.install/Marina Break.sh @@ -1,5 +1,5 @@ # -export bottle="nyanchan" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "https://www.nyanchangames.com/softs/MbSetupE.exe" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" install_wine_bottle speechsdk diff --git a/.install/Maze Craze.sh b/.install/Maze Craze.sh index 5db7775..ce1052f 100644 --- a/.install/Maze Craze.sh +++ b/.install/Maze Craze.sh @@ -1,4 +1,4 @@ -export bottle=dan-z +# Uses standard wine path based on architecture (win32/win64) download "http://www.danielzingaro.com/maze_craze_setup.exe" install_wine_bottle vb6run dx8vb ${wine} "${cache}/maze_craze_setup.exe" & diff --git a/.install/Monkey Business.sh b/.install/Monkey Business.sh index c277831..bba69b6 100644 --- a/.install/Monkey Business.sh +++ b/.install/Monkey Business.sh @@ -1,5 +1,5 @@ export winVer="win7" -export bottle="draconis" +# Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/MBSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz cp -v "${cache}/MBSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" diff --git a/.install/Paw Prints.sh b/.install/Paw Prints.sh index 933a3be..60fb203 100644 --- a/.install/Paw Prints.sh +++ b/.install/Paw Prints.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/pawprints.zip" diff --git a/.install/Penta Path.sh b/.install/Penta Path.sh index f4ba764..50a243e 100644 --- a/.install/Penta Path.sh +++ b/.install/Penta Path.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" export winetricksSettings="vd=1024x768" download "http://www.kaldobsky.com/audiogames/pentapath.zip" diff --git a/.install/Pigeon Panic.sh b/.install/Pigeon Panic.sh index 32b4e1e..44dceaf 100644 --- a/.install/Pigeon Panic.sh +++ b/.install/Pigeon Panic.sh @@ -1,4 +1,4 @@ -export bottle="l-works" +# Uses standard wine path based on architecture (win32/win64) download "http://agarchive.net/games/lworks/pigeon%20panic%20setup.exe" install_wine_bottle vb6run dx8vb wine "${cache}/pigeon panic setup.exe" /silent diff --git a/.install/Preludeamals.sh b/.install/Preludeamals.sh index 67230ce..72daa46 100644 --- a/.install/Preludeamals.sh +++ b/.install/Preludeamals.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/Preludeamals.zip" diff --git a/.install/Puzzle Divided.sh b/.install/Puzzle Divided.sh index c616527..3b43880 100644 --- a/.install/Puzzle Divided.sh +++ b/.install/Puzzle Divided.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/puzzledivided.zip" diff --git a/.install/Rettou.sh b/.install/Rettou.sh index 7f6c1bc..7a12391 100644 --- a/.install/Rettou.sh +++ b/.install/Rettou.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" export winetricksSettings="vd=1024x768" download "http://www.kaldobsky.com/audiogames/rettou.zip" diff --git a/.install/Revelation.sh b/.install/Revelation.sh index cb288a6..31a1aed 100644 --- a/.install/Revelation.sh +++ b/.install/Revelation.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/revelation.zip" diff --git a/.install/Rhythm Rage.sh b/.install/Rhythm Rage.sh index b926ce0..0645465 100644 --- a/.install/Rhythm Rage.sh +++ b/.install/Rhythm Rage.sh @@ -1,4 +1,4 @@ -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://oriolgomez.com/games/rr_en.zip" "${nvdaControllerClientDll}" install_wine_bottle speechsdk diff --git a/.install/Run For Your Life.sh b/.install/Run For Your Life.sh index d7f2a1a..fa5cbd9 100644 --- a/.install/Run For Your Life.sh +++ b/.install/Run For Your Life.sh @@ -1,4 +1,4 @@ -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://oriolgomez.com/games/rfyl_en.zip" install_wine_bottle diff --git a/.install/Screaming Strike 2.sh b/.install/Screaming Strike 2.sh index d4592f5..969b845 100644 --- a/.install/Screaming Strike 2.sh +++ b/.install/Screaming Strike 2.sh @@ -1,4 +1,4 @@ -export bottle="nyanchan" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "https://www.nyanchangames.com/softs/screamingStrike2.exe" "${nvdaControllerClientDll}" install_wine_bottle fakejapanese speechsdk diff --git a/.install/Shadow Line.sh b/.install/Shadow Line.sh index 4f02b80..b724cca 100644 --- a/.install/Shadow Line.sh +++ b/.install/Shadow Line.sh @@ -1,6 +1,5 @@ -export version="7.7" download "https://www.mm-galabo.com/sr/Download_files_srfv/shadowrine_fullvoice3.171.exe" "https://raw.githubusercontent.com/LordLuceus/sr-english-localization/master/language_en.dat" -install_wine "$version" "32" +# Uses wine64 (no speech API dependency) export winVer="win8" install_wine_bottle $wine "${cache}/shadowrine_fullvoice3.171.exe" /sp- & diff --git a/.install/Silver Dollar.sh b/.install/Silver Dollar.sh index 827e6a4..e5e3ce2 100644 --- a/.install/Silver Dollar.sh +++ b/.install/Silver Dollar.sh @@ -1,5 +1,5 @@ export winVer="win7" -export bottle="draconis" +# Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/SilverDollarSetup.exe" install_wine_bottle speechsdk cp -v "${cache}/SilverDollarSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" diff --git a/.install/Skateboarder Pro.sh b/.install/Skateboarder Pro.sh index 944b4d6..e926253 100644 --- a/.install/Skateboarder Pro.sh +++ b/.install/Skateboarder Pro.sh @@ -1,7 +1,7 @@ download "https://tunmi13.com/projects/sb_pro_rw.zip" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" -export bottle=tunmi13-64bit +# No custom bottle - use standard wine64 path install_wine_bottle sapi unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/sb_pro_rw.zip" find "${WINEPREFIX}/drive_c/Program Files/sb_pro_rw" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; diff --git a/.install/Slender Lost Vision.sh b/.install/Slender Lost Vision.sh index 3b4f4ab..2b4fcd5 100644 --- a/.install/Slender Lost Vision.sh +++ b/.install/Slender Lost Vision.sh @@ -16,7 +16,7 @@ add_launcher "c:\Program Files\shooter\shooter.exe" download "https://tunmi13.com/projects/sb_pro_rw.zip" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" -export bottle=tunmi13-64bit +# Uses standard wine path based on architecture (win32/win64) install_wine_bottle sapi unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/sb_pro_rw.zip" find "${WINEPREFIX}/drive_c/Program Files/sb_pro_rw" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; diff --git a/.install/Smashathon.sh b/.install/Smashathon.sh index 48c652e..3048b6c 100644 --- a/.install/Smashathon.sh +++ b/.install/Smashathon.sh @@ -1,4 +1,4 @@ -export bottle="l-works" +# Uses standard wine path based on architecture (win32/win64) download "https://agarchive.net/games/lworks/Smashathon0.02.zip" install_wine_bottle speechsdk unzip -d "$WINEPREFIX/drive_c/Program Files" "$cache/Smashathon0.02.zip" diff --git a/.install/Super Deekout.sh b/.install/Super Deekout.sh index 92f96e6..dd5b1f8 100644 --- a/.install/Super Deekout.sh +++ b/.install/Super Deekout.sh @@ -1,4 +1,4 @@ -export bottle=dan-z +# Uses standard wine path based on architecture (win32/win64) download "http://www.danielzingaro.com/superdeekout_setup.exe" "http://www.danielzingaro.com/sd_full.exe" install_wine_bottle vb6run dx8vb ${wine} "${cache}/superdeekout_setup.exe" & diff --git a/.install/Super Egg Hunt.sh b/.install/Super Egg Hunt.sh index ebd9979..bb1c16c 100644 --- a/.install/Super Egg Hunt.sh +++ b/.install/Super Egg Hunt.sh @@ -1,4 +1,4 @@ -export bottle="l-works" +# Uses standard wine path based on architecture (win32/win64) download "https://agarchive.net/games/lworks/super%20egg%20hunt+%20setup.exe" install_wine_bottle wine "${cache}/super egg hunt+ setup.exe" /silent diff --git a/.install/Super Liam.sh b/.install/Super Liam.sh index 2d47580..595b71f 100644 --- a/.install/Super Liam.sh +++ b/.install/Super Liam.sh @@ -1,4 +1,4 @@ -export bottle="l-works" +# Uses standard wine path based on architecture (win32/win64) download "http://files.l-works.net/superliamsetup.exe" install_wine_bottle vb6run dx8vb wine "${cache}/superliamsetup.exe" /silent diff --git a/.install/Swamp.sh b/.install/Swamp.sh index ee2737e..ca5e96c 100644 --- a/.install/Swamp.sh +++ b/.install/Swamp.sh @@ -1,7 +1,7 @@ # Source dialog interface wrapper source "${0%/*}/../.includes/dialog-interface.sh" -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" export winetricksSettings="vd=1024x768" agm_yesno "Swamp Installation" "Swamp Installation" "If you do not have a full 32 bit gstreamer installation, the Swamp music can cause stuttering and crashes. Would you like to remove the music directory after installation?" diff --git a/.install/Tarot Assistant.sh b/.install/Tarot Assistant.sh index 5430bfe..12637f7 100644 --- a/.install/Tarot Assistant.sh +++ b/.install/Tarot Assistant.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "https://www.kaldobsky.com/audiogames/tarot.zip" install_wine_bottle vb6run dx8vb speechsdk diff --git a/.install/Ten Pin Alley.sh b/.install/Ten Pin Alley.sh index 743f197..799c19c 100644 --- a/.install/Ten Pin Alley.sh +++ b/.install/Ten Pin Alley.sh @@ -1,5 +1,5 @@ export winVer="win7" -export bottle="draconis" +# Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/TPAXPSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz cp -v "${cache}/TPAXPSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" diff --git a/.install/The Great Toy Robbery.sh b/.install/The Great Toy Robbery.sh index 67f79b7..d8b56f2 100644 --- a/.install/The Great Toy Robbery.sh +++ b/.install/The Great Toy Robbery.sh @@ -1,4 +1,4 @@ -export bottle="l-works" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://files.l-works.net/tgtrsetup_2.04.exe" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" install_wine_bottle dsound directmusic diff --git a/.install/Thief.sh b/.install/Thief.sh index 5a4f10a..1ced42a 100644 --- a/.install/Thief.sh +++ b/.install/Thief.sh @@ -1,4 +1,4 @@ -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://oriolgomez.com/games/thief_en.zip" install_wine_bottle diff --git a/.install/Triple Triad.sh b/.install/Triple Triad.sh index 4e3bf6f..d0658ab 100644 --- a/.install/Triple Triad.sh +++ b/.install/Triple Triad.sh @@ -1,4 +1,4 @@ -export bottle="aprone" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "https://www.kaldobsky.com/audiogames/tripletriad.zip" install_wine_bottle vb6run dx8vb speechsdk diff --git a/.install/Ultimate SounDoku.sh b/.install/Ultimate SounDoku.sh index 966c7fc..e69af1c 100644 --- a/.install/Ultimate SounDoku.sh +++ b/.install/Ultimate SounDoku.sh @@ -1,5 +1,5 @@ export winVer="win7" -export bottle="draconis" +# Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/USSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz cp -v "${cache}/USSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" diff --git a/.install/Villains From Beyond.sh b/.install/Villains From Beyond.sh index 03eca82..ebe6043 100644 --- a/.install/Villains From Beyond.sh +++ b/.install/Villains From Beyond.sh @@ -1,4 +1,4 @@ -export bottle="oriol-gomez" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "${ipfsGateway}/ipfs/QmWx271xuk3Mv9XTBoVu5BDJvXFZdasawC2nhtV21WAaUU?filename=villains_en.zip" install_wine_bottle speechsdk diff --git a/.install/World of War.sh b/.install/World of War.sh index 0a12abf..45d1fe5 100644 --- a/.install/World of War.sh +++ b/.install/World of War.sh @@ -1,4 +1,4 @@ -export bottle="nyanchan" +# Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "https://www.agarchive.net/games/nyanchan/world%20of%20war%20English.7z" install_wine_bottle diff --git a/.install/haunted Party.sh b/.install/haunted Party.sh index 95090fc..e0fd811 100644 --- a/.install/haunted Party.sh +++ b/.install/haunted Party.sh @@ -2,7 +2,7 @@ get_installer "hp.zip" "https://tunmi13.itch.io/haunted-party" download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" -export bottle=tunmi13-64bit +# Uses standard wine path based on architecture (win32/win64) install_wine_bottle unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/hp.zip" find "${WINEPREFIX}/drive_c/Program Files/hp" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; diff --git a/speech/clipboard_translator.sh b/speech/clipboard_translator.sh index d5ab82d..f05139d 100755 --- a/speech/clipboard_translator.sh +++ b/speech/clipboard_translator.sh @@ -39,20 +39,20 @@ fi # Define a function to safely query the database query_database() { - local db_file="$1" - local sql_query="$2" - sqlite3 -line "$db_file" "$sql_query" + local dbFile="$1" + local sqlQuery="$2" + sqlite3 -line "$dbFile" "$sqlQuery" } # Define a function to safely insert into the database insert_database() { - local db_file="$1" + local dbFile="$1" local text="$2" local translation="$3" # Use sqlite3 .import feature which is more robust for special characters - echo "$text|$translation" | sqlite3 -separator "|" "$db_file" ".import /dev/stdin temp_import" - sqlite3 "$db_file" "INSERT OR IGNORE INTO translations SELECT * FROM temp_import; DROP TABLE IF EXISTS temp_import;" + echo "$text|$translation" | sqlite3 -separator "|" "$dbFile" ".import /dev/stdin temp_import" + sqlite3 "$dbFile" "INSERT OR IGNORE INTO translations SELECT * FROM temp_import; DROP TABLE IF EXISTS temp_import;" } # Read so long as the application is running @@ -77,25 +77,25 @@ while pgrep -u "$USER" ^$1 &> /dev/null ; do # Normalize different unicode space characters to the same space # https://stackoverflow.com/a/43640405 - alias normalize_spaces="perl -CSDA -plE 's/[^\\S\\t]/ /g'" - alias normalize_unicode="normalize_spaces | nfc" + alias normalizeSpaces="perl -CSDA -plE 's/[^\\S\\t]/ /g'" + alias normalizeUnicode="normalizeSpaces | nfc" # Normalize text - normalized_text="$(echo "$text" | normalize_unicode)" + normalizedText="$(echo "$text" | normalizeUnicode)" # Create a temporary database for import sqlite3 "$translationFile" "CREATE TABLE IF NOT EXISTS temp_import(text TEXT, translation TEXT);" # Check if we already have a translation - translated=$(sqlite3 "$translationFile" "SELECT translation FROM translations WHERE text = '$normalized_text' LIMIT 1;" 2>/dev/null) + translated=$(sqlite3 "$translationFile" "SELECT translation FROM translations WHERE text = '$normalizedText' LIMIT 1;" 2>/dev/null) if [[ -z "$translated" ]]; then # Get translation from the trans utility - translated="$(trans -no-autocorrect -no-warn -brief "$normalized_text" | head -1 | sed 's/\s*$//' | normalize_unicode)" + translated="$(trans -no-autocorrect -no-warn -brief "$normalizedText" | head -1 | sed 's/\s*$//' | normalizeUnicode)" if [[ -n "$translated" ]]; then # Insert using echo piping to avoid escaping issues - echo "$normalized_text|$translated" | sqlite3 -separator "|" "$translationFile" ".import /dev/stdin temp_import" + echo "$normalizedText|$translated" | sqlite3 -separator "|" "$translationFile" ".import /dev/stdin temp_import" sqlite3 "$translationFile" "INSERT OR IGNORE INTO translations SELECT * FROM temp_import; DELETE FROM temp_import;" fi fi diff --git a/speech/speak_window_title.sh b/speech/speak_window_title.sh index eb73553..d296dfa 100755 --- a/speech/speak_window_title.sh +++ b/speech/speak_window_title.sh @@ -19,9 +19,9 @@ while pgrep -u "$USER" ^$1 &> /dev/null ; do if [[ "$wnd_title" =~ $lookfor ]]; then wnd_title=${BASH_REMATCH[1]} - if [[ "$old_title" != "$wnd_title" ]]; then + if [[ "$oldTitle" != "$wnd_title" ]]; then spd-say -- "$wnd_title" - old_title="$wnd_title" + oldTitle="$wnd_title" fi fi done From ddecf09fb1c2f873a4e629764b460459d849edda Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Mon, 4 Aug 2025 20:13:38 -0400 Subject: [PATCH 13/77] With upgrade to wow64 no need to use a variable so switch to direct wine calls. --- .includes/bottle.sh | 30 ++++++++++++++---------------- audiogame-manager.sh | 26 +++++++++++++------------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index cf4bb05..6e43cc7 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -67,28 +67,26 @@ install_rhvoice() { download "${RHVoice[${voiceName}]}" winetricks -q win8 echo "Installing RHVoice ${voiceName^}..." - ${wine} "${cache}/${voiceFile}" & + wine "${cache}/${voiceFile}" & sleep 20 - ${wine}server -k + wineserver -k } install_wine_bottle() { - # Simple rule: wine64 for everything, wine32 ONLY for speech APIs (SAPI5 doesn't work in WOW64) - local architecture + # Simple rule: wine64 for everything, let WOW64 handle 32-bit speech APIs + local architecture=64 + export WINEARCH="win64" + if [[ "$*" =~ speechsdk || "$*" =~ sapi ]]; then - architecture=32 - export WINEARCH="win32" - echo "Using wine32 for speech API compatibility (SAPI5 broken in WOW64)" + echo "Using wine64 with WOW64 for speech API compatibility" else - architecture=64 - export WINEARCH="win64" echo "Using wine64 for optimal performance" fi export WINEPREFIX="$HOME/.local/wine${architecture}" - export wine="${wine:-$(command -v wine)}" - export WINE="${wine}" - export WINESERVER="${wine}server" + # Modern wine is unified - no separate wine32/wine64 executables + export WINE="wine" + export WINESERVER="wineserver" # 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)" @@ -102,10 +100,10 @@ install_wine_bottle() { 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 + wine --version + DISPLAY="" wineboot -u + wine msiexec /i z:"$monoPath" /quiet + wine msiexec /i z:"$geckoPath" /quiet if [[ "${*}" =~ (speechsdk|sapi) ]]; then install_rhvoice fi diff --git a/audiogame-manager.sh b/audiogame-manager.sh index fe5cd46..8b1d75c 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -72,9 +72,9 @@ game_installer() { game_removal() { source .includes/bottle.sh if [[ "$(uname -m)" == "aarch64" ]]; then - export wine="${wine:-/usr/bin/wine}" + # Modern wine is unified else - export wine="${wine:-/usr/bin/wine}" + # Modern wine is unified fi mapfile -t lines < <(sed -e '/^$/d' -e '/^[[:space:]]*#/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then @@ -111,7 +111,7 @@ game_removal() { if [[ "${HOME}/.local/wine/${game%|*}" == "${WINEPREFIX}" ]]; then read -rp "To remove the wine bottle \"${WINEPREFIX##*/}\" and all of its contents press enter. To cancel press control+c. " continue # kill any previous existing wineservers for this prefix in case they didn't shut down properly. - ${wine}server -k + wineserver -k # remove the game rm -rf "${WINEPREFIX}" else @@ -129,9 +129,9 @@ game_removal() { kill_game() { source .includes/bottle.sh if [[ "$(uname -m)" == "aarch64" ]]; then - export wine="${wine:-/usr/bin/wine}" + # Modern wine is unified else - export wine="${wine:-/usr/bin/wine}" + # Modern wine is unified fi mapfile -t lines < <(sed '/^$/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then @@ -163,7 +163,7 @@ kill_game() { wineExec="${wineExec##*\\}" # kill the wine server. get_bottle "${game%|*}" - ${wine}server -k + wineserver -k echo "The selected game has been stopped." fi exit 0 @@ -231,7 +231,7 @@ custom_launch_parameters() { fi if [[ "${game[0]}" == "screaming-strike-2" ]]; then pushd "$(winepath "$winePath")" - ${wine} "$wineExec" + wine "$wineExec" popd exit 0 fi @@ -249,7 +249,7 @@ custom_launch_parameters() { fi if [[ -d "${WINEPREFIX}/drive_c/windows/syswow64" ]]; then # switch to wine64 for 64 bit prefix. - [[ "${wine}" == "/usr/bin/wine" ]] && export wine="/usr/bin/wine64" + # Modern wine is unified - no separate wine32/wine64 executables fi } @@ -334,14 +334,14 @@ game_launcher() { get_bottle "${game[0]}" # make sure wine is actually set to something if [[ "$(uname -m)" == "aarch64" ]]; then - export wine="${wine:-/usr/bin/wine}" + # Modern wine is unified else - export wine="${wine:-/usr/bin/wine}" + # Modern wine is unified fi echo -n "launching " - ${wine} --version + wine --version # kill any previous existing wineservers for this prefix in case they didn't shut down properly. - ${wine}server -k + wineserver -k # launch the game if command -v qjoypad &> /dev/null ; then mkdir -p ~/.qjoypad3 @@ -358,7 +358,7 @@ game_launcher() { fi process_launcher_flags custom_launch_parameters - ${wine:-/usr/bin/wine} start /d "${game[1]%\\*}" "${game[1]##*\\}" /realtime + wine start /d "${game[1]%\\*}" "${game[1]##*\\}" /realtime fi exit 0 } From 87c278d93547b8c234ab3366ca8653238fa19e1b Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Mon, 4 Aug 2025 20:18:44 -0400 Subject: [PATCH 14/77] Fixed a few syntax errors. --- audiogame-manager.sh | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 8b1d75c..599d684 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -71,11 +71,7 @@ game_installer() { # remove games game_removal() { source .includes/bottle.sh - if [[ "$(uname -m)" == "aarch64" ]]; then - # Modern wine is unified - else - # Modern wine is unified - fi + # Modern wine is unified - no architecture-specific wine executables needed mapfile -t lines < <(sed -e '/^$/d' -e '/^[[:space:]]*#/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then echo "No games found." @@ -128,11 +124,7 @@ game_removal() { # kill games that are stuck kill_game() { source .includes/bottle.sh - if [[ "$(uname -m)" == "aarch64" ]]; then - # Modern wine is unified - else - # Modern wine is unified - fi + # Modern wine is unified - no architecture-specific wine executables needed mapfile -t lines < <(sed '/^$/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then echo "No games found." @@ -247,10 +239,6 @@ custom_launch_parameters() { popd exit 0 fi - if [[ -d "${WINEPREFIX}/drive_c/windows/syswow64" ]]; then - # switch to wine64 for 64 bit prefix. - # Modern wine is unified - no separate wine32/wine64 executables - fi } # Process game launcher flags @@ -332,12 +320,6 @@ game_launcher() { exit 0 fi get_bottle "${game[0]}" - # make sure wine is actually set to something - if [[ "$(uname -m)" == "aarch64" ]]; then - # Modern wine is unified - else - # Modern wine is unified - fi echo -n "launching " wine --version # kill any previous existing wineservers for this prefix in case they didn't shut down properly. From abb0bbbb20554a678997248d25510974cb8ed1b8 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Mon, 4 Aug 2025 22:24:04 -0400 Subject: [PATCH 15/77] More syntax fixes. Thanks Claud for helping track this one down. It was very illusive. --- audiogame-manager.sh | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 599d684..b4a1098 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -271,14 +271,14 @@ game_launcher() { # For use by update scripts that want to source functions in this file. [[ "$agmNoLaunch" == "true" ]] && return source .includes/bottle.sh - pgrep -u "$USER" nvda2speechd &> /dev/null || { - if [[ -x ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd ]]; then - if command -v FEXLoader &> /dev/null ; then - FEXLoader -- ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd &> /dev/null & - else - ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd &> /dev/null & - fi - fi; } + # Start nvda2speechd if available + if [[ -x ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd ]]; then + if command -v FEXLoader &> /dev/null ; then + FEXLoader -- ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd &> /dev/null & + else + ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd &> /dev/null & + fi + fi mapfile -t lines < <(sed -e '/^$/d' -e '/^ *#/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then echo "Install some games first." @@ -384,8 +384,6 @@ fi checkWinetricksUpdate="false" # Turn off debug messages export WINEDEBUG="${winedebug:--all}" -# Compatibility with box86 -export BOX86_NOBANNER=1 # During installation, you can set winVer to the versions available. # To set winetricks arguments, such as virtual desktop, set the winetricksSettings variable. # Example: winetricksSettings="vd=1024x768" @@ -398,6 +396,16 @@ unset version export ipfsGateway="${ipfsGateway:-https://ipfs.stormux.org}" export nvdaControllerClientDll="${ipfsGateway}/ipfs/QmWu7YdSbKMk1Qm5DKvEA5hk1YuAK8wVkwhDf2CsmPkmF1?filename=nvdaControllerClient32.dll" +# Start nvda2speechd server + pgrep -u "$USER" nvda2speechd &> /dev/null || { + if [[ ! -f "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" ]]; then + download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd" + cp "${cache}/nvda2speechd" "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" + chmod +x "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" + fi + "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" ; +} + # Source helper functions source .includes/bottle.sh # Also sourced in functions that need it From 25c9aeaa5ab570a66531ae882168a0c2a10beda6 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 01:06:04 -0400 Subject: [PATCH 16/77] Because of the major reworking of how audiogame-manager works, had to almost completely rewrite the -r (remove game) function. Will be testing it quite a bit to make sure nothing is critically broken. --- .includes/bottle.sh | 20 ++++++++++++++------ audiogame-manager.sh | 30 ++++++++++++++++++++---------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index 6e43cc7..a7ba5a7 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -73,14 +73,22 @@ install_rhvoice() { } install_wine_bottle() { - # Simple rule: wine64 for everything, let WOW64 handle 32-bit speech APIs - local architecture=64 - export WINEARCH="win64" + # 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 - if [[ "$*" =~ speechsdk || "$*" =~ sapi ]]; then - echo "Using wine64 with WOW64 for speech API compatibility" + # Set architecture for WINEPREFIX path + local architecture + if [[ "$WINEARCH" == "win32" ]]; then + architecture=32 else - echo "Using wine64 for optimal performance" + architecture=64 fi export WINEPREFIX="$HOME/.local/wine${architecture}" diff --git a/audiogame-manager.sh b/audiogame-manager.sh index b4a1098..576a2cc 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -101,18 +101,28 @@ game_removal() { local wineExec="${game#*|}" wineExec="${wineExec%|*}" wineExec="${wineExec##*\\}" - # Confirm removal - get_bottle "${game%|*}" - # Make sure the game can be handled by remove - if [[ "${HOME}/.local/wine/${game%|*}" == "${WINEPREFIX}" ]]; then - read -rp "To remove the wine bottle \"${WINEPREFIX##*/}\" and all of its contents press enter. To cancel press control+c. " continue + # With shared bottles, always remove only the game files, never the entire bottle + create_game_array "$game" + if [[ ${#game[@]} -gt 0 ]]; then + # Set up wine environment for this game + source .includes/bottle.sh + get_bottle "${game[0]}" + + read -rp "This will remove the game files for \"${game[2]}\" from the shared wine bottle. To continue press enter. To cancel press control+c. " continue + # kill any previous existing wineservers for this prefix in case they didn't shut down properly. wineserver -k - # remove the game - rm -rf "${WINEPREFIX}" - else - read -rp "This bottle \"${WINEPREFIX##*/}\" contains multiple entries, so only the game will be removed. To continue press enter. To cancel press control+c. " continue - rm -rf "$(winepath "${winePath}")" + + # Remove only the game's installation directory + if [[ -n "$winePath" ]]; then + local gameDir="$(winepath "$winePath")" + if [[ -d "$gameDir" ]]; then + echo "Removing game directory: $gameDir" + rm -rf "$gameDir" + else + echo "Game directory not found, skipping file removal." + fi + fi fi # remove the launcher gawk -i inplace -vLine="${game//\\/\\\\}" '!index($0,Line)' "$configFile" From d49ca8a86bbfb46da1c88b93b18c1bb6df6cfd8f Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 01:40:27 -0400 Subject: [PATCH 17/77] Hopefully insure people using the GUI mode with audiogame-manager do not get stuck because some messages were only appearing in the terminal which may not be present at all in the GUI. --- .includes/functions.sh | 19 +++++++------------ audiogame-manager.sh | 18 +++++++++++------- game-scripts/mist_world_account_creator.sh | 13 +++++++++++-- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/.includes/functions.sh b/.includes/functions.sh index 435651a..a9d0d40 100644 --- a/.includes/functions.sh +++ b/.includes/functions.sh @@ -2,7 +2,7 @@ alert() { play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t echo - read -rp "Press enter to continue." continue + agm_msgbox "Alert" "" "Press OK to continue." } check_requirements() { @@ -23,23 +23,18 @@ check_requirements() { } clear_cache() { - local answer if [[ ! -d "${cache}" ]]; then - echo "No cache found at ${cache}." + agm_msgbox "Clear Cache" "" "No cache found at ${cache}." return fi - while ! [[ "${answer,,}" =~ ^yes$|^no$ ]]; do - echo "This will delete all contents of ${cache}. Are you sure you want to continue?" - echo "Please type yes or no." - echo - read -r answer - done - if [[ "$answer" == "no" ]]; then + + if ! agm_yesno "Clear Cache" "" "This will delete all contents of ${cache}. Are you sure you want to continue?"; then return fi + # All safety checks done. Delete the cache. - rm -rfv "${cache}" - echo "Cache deleted." + rm -rfv "${cache}" | agm_progressbox "Clear Cache" "Deleting cache files..." + agm_msgbox "Clear Cache" "" "Cache deleted." } download() { diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 576a2cc..ce219d3 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -108,7 +108,10 @@ game_removal() { source .includes/bottle.sh get_bottle "${game[0]}" - read -rp "This will remove the game files for \"${game[2]}\" from the shared wine bottle. To continue press enter. To cancel press control+c. " continue + if ! agm_yesno "Confirm Removal" "Audio Game Removal" "Are you sure you want to remove \"${game[2]}\"?"; then + echo "Removal cancelled." + exit 0 + fi # kill any previous existing wineservers for this prefix in case they didn't shut down properly. wineserver -k @@ -117,10 +120,9 @@ game_removal() { if [[ -n "$winePath" ]]; then local gameDir="$(winepath "$winePath")" if [[ -d "$gameDir" ]]; then - echo "Removing game directory: $gameDir" - rm -rf "$gameDir" + rm -rfv "$gameDir" | agm_progressbox "Removing Game" "Removing \"${game[2]}\" files..." else - echo "Game directory not found, skipping file removal." + agm_msgbox "Game Removal" "" "Game directory not found, skipping file removal." fi fi fi @@ -368,6 +370,9 @@ else dialogType="yad" fi +# Source dialog interface early for progress display +source .includes/dialog-interface.sh + # If display isn't set assume we are launching from console and an X environment is running using display :0 if [[ -z "$DISPLAY" ]]; then export DISPLAY=":0" @@ -388,8 +393,7 @@ fi # Update the cache for older versions of audiogame-manager if [[ -d "${configFile%/*}/cache" ]]; then { mv -v "${configFile%/*}/cache/"* "${cache}" - rmdir -v "${configFile%/*}/cache/"; } | dialog \ - --backtitle "Audiogame Manager" --progressbox "Updating cache, please wait..." -1 -1 + rmdir -v "${configFile%/*}/cache/"; } | agm_progressbox "Audiogame Manager" "Updating cache, please wait..." fi checkWinetricksUpdate="false" # Turn off debug messages @@ -420,7 +424,7 @@ export nvdaControllerClientDll="${ipfsGateway}/ipfs/QmWu7YdSbKMk1Qm5DKvEA5hk1YuA # Source helper functions source .includes/bottle.sh # Also sourced in functions that need it source .includes/desktop.sh -source .includes/dialog-interface.sh +# dialog-interface.sh already sourced earlier source .includes/functions.sh source .includes/help.sh source .includes/update.sh diff --git a/game-scripts/mist_world_account_creator.sh b/game-scripts/mist_world_account_creator.sh index 3fb1f99..370b5de 100755 --- a/game-scripts/mist_world_account_creator.sh +++ b/game-scripts/mist_world_account_creator.sh @@ -2,8 +2,17 @@ export DISPLAY="${DISPLAY:-:0}" -read -rp "Select create account from the menu, press enter to continue." continue -echo +# Source dialog interface for cross-platform compatibility +source "${0%/*}/../.includes/dialog-interface.sh" + +# Detect dialog interface type +if [[ -z "$DISPLAY" ]]; then + dialogType="dialog" +else + dialogType="yad" +fi + +agm_msgbox "Mist World Account Creator" "" "Select create account from the menu, then press OK to continue." # Read email address echo "Enter email address:" From 5adce756a19db5efa01b8c67a20e41675c429de7 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 01:44:56 -0400 Subject: [PATCH 18/77] Fixed an error in game removal. Fixed an error where it would try to launch an empty file name if escape were pressed to close the menu. --- audiogame-manager.sh | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index ce219d3..b66a870 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -96,13 +96,16 @@ game_removal() { open_url "https://2mb.games/product/2mb-patron/" exit 0 fi + # Parse game info before create_game_array overwrites $game + local selectedGame="$game" local winePath="${game#*|}" export winePath="${winePath%\\*.exe}" local wineExec="${game#*|}" wineExec="${wineExec%|*}" wineExec="${wineExec##*\\}" + # With shared bottles, always remove only the game files, never the entire bottle - create_game_array "$game" + create_game_array "$selectedGame" if [[ ${#game[@]} -gt 0 ]]; then # Set up wine environment for this game source .includes/bottle.sh @@ -126,9 +129,9 @@ game_removal() { fi fi fi - # remove the launcher - gawk -i inplace -vLine="${game//\\/\\\\}" '!index($0,Line)' "$configFile" - echo "The selected item has been deleted." + # remove the launcher using the original selected game info + gawk -i inplace -vLine="${selectedGame//\\/\\\\}" '!index($0,Line)' "$configFile" + agm_msgbox "Game Removal" "" "\"${game[2]}\" has been successfully removed." fi exit 0 } @@ -311,9 +314,15 @@ game_launcher() { if [[ $menuCode -eq 1 ]] || [[ $menuCode -eq 255 ]]; then exit 0 elif [[ $menuCode -eq 3 ]]; then - source .includes/help.sh # Make available in this function - documentation "$game" "$(echo "$game" | cut -d '|' -f2)" + source .includes/help.sh # Make available in this function + documentation "$game" "$(echo "$game" | cut -d '|' -f2)" fi + + # Safety check: don't proceed if game is empty + if [[ -z "$game" ]]; then + exit 0 + fi + create_game_array "$game" else create_game_array "$game" From 7ab2cdeb602edb5a29f834a4e82ffc6f96c7adab Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 01:49:21 -0400 Subject: [PATCH 19/77] Fixed inaccessible dialogues in yad for messages. All messages should now be readable with screen readers, not just the buttons. --- .includes/dialog-interface.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index 322e3b9..5721428 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -165,11 +165,11 @@ agm_msgbox() { local text="$3" if [[ "$dialogType" == "yad" ]]; then - yad --info \ + yad --form \ --title="$title" \ - --text="$text" \ + --field="$text:LBL" \ --selectable-labels \ - --show-cursor \ + --button="OK:0" \ --width=400 else dialog --backtitle "$backTitle" \ From eb9ad3e38da8e423a3e9ae1fef87155bbd0ef13e Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 01:56:35 -0400 Subject: [PATCH 20/77] Fix update messages so they are shown in both CLI and GUI modes. --- .includes/update.sh | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.includes/update.sh b/.includes/update.sh index 6af5e2a..5f9dd37 100644 --- a/.includes/update.sh +++ b/.includes/update.sh @@ -36,7 +36,17 @@ if [[ "$home" == "$remote" ]]; then return fi agm_yesno "Audiogame Manager" "Audiogame Manager" "Updates are available. Would you like to update now?" || return - { git pull - git log '@{1}..' --pretty=format:'%an: %s' | tac; } - exit $? + + # Capture update output for display + local updateOutput + updateOutput=$({ git pull 2>&1 + echo + echo "Recent changes:" + git log '@{1}..' --pretty=format:'%an: %s' | tac; } 2>&1) + local updateResult=$? + + # Show the update results + agm_msgbox "Update Complete" "Audiogame Manager" "$updateOutput" + + exit $updateResult } From 1b50ac66c1ada36421223203d70e9dbe022308b1 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 02:20:11 -0400 Subject: [PATCH 21/77] Because now everything is more centralized in only a couple wine bottles, make sure nvda2speechd dll files are downloaded and update them when AGM starts. This should prevent loss of speech after game updates. --- audiogame-manager.sh | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index b66a870..20155b3 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -281,11 +281,58 @@ create_game_array() { done } +# Update NVDA controller client DLLs in wine bottles +update_nvda_dlls() { + # Ensure we have the replacement DLLs + source .includes/functions.sh + download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" \ + "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" + + # Update wine64 bottle (most common) + if [[ -d "$HOME/.local/wine64" ]]; then + find "$HOME/.local/wine64" -type f \( -iname "nvdaControllerClient*.dll" \) -print0 | while IFS= read -r -d '' dllFile; do + local basename="${dllFile##*/}" + local replacement="" + + case "${basename,,}" in + "nvdacontrollerclient32.dll") + replacement="${cache}/nvda2speechd32.dll" + ;; + "nvdacontrollerclient64.dll") + replacement="${cache}/nvda2speechd64.dll" + ;; + "nvdacontrollerclient.dll") + # Use file command to detect architecture + if file "$dllFile" | grep -q "PE32+"; then + replacement="${cache}/nvda2speechd64.dll" + elif file "$dllFile" | grep -q "PE32"; then + replacement="${cache}/nvda2speechd32.dll" + fi + ;; + esac + + if [[ -n "$replacement" ]] && [[ -f "$replacement" ]]; then + echo "Updating $dllFile with nvda2speechd" + cp "$replacement" "$dllFile" + fi + done + fi + + # Also update wine32 bottle if it exists + if [[ -d "$HOME/.local/wine32" ]]; then + find "$HOME/.local/wine32" -type f \( -iname "nvdaControllerClient*.dll" \) -print0 | while IFS= read -r -d '' dllFile; do + echo "Updating $dllFile with nvda2speechd32" + cp "${cache}/nvda2speechd32.dll" "$dllFile" + done + fi +} + # launch games that are installed game_launcher() { # For use by update scripts that want to source functions in this file. [[ "$agmNoLaunch" == "true" ]] && return source .includes/bottle.sh + # Start nvda2speechd if available if [[ -x ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd ]]; then if command -v FEXLoader &> /dev/null ; then @@ -294,6 +341,9 @@ game_launcher() { ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd &> /dev/null & fi fi + + # Replace NVDA controller client DLLs in wine64 bottle + update_nvda_dlls mapfile -t lines < <(sed -e '/^$/d' -e '/^ *#/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then echo "Install some games first." From 19f54405bd66e48c60b0a1d2e62ab71319d8d3ed Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 02:27:01 -0400 Subject: [PATCH 22/77] Clean up redundant nvda2speechd startup and DLL replacement code --- audiogame-manager.sh | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 20155b3..77d7775 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -185,9 +185,7 @@ custom_launch_parameters() { popd exit 0 fi - if [[ "${game[0]}" == "executioner's-rage" ]]; then - find "${WINEPREFIX}/drive_c/Program Files" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; - fi + # executioner's-rage: DLL replacement now handled by update_nvda_dlls() if [[ "${game[0]}" == "laser-breakout" ]]; then "${0%/*}/speech/speak_window_title.sh" play.exe & fi @@ -202,11 +200,7 @@ custom_launch_parameters() { if [[ -r "${cache}/bk3-dict.dat" ]] && [[ ! -d "${dictPath}/dict" ]]; then cp "${cache}/bk3-dict.dat" "${dictPath}/dict.dat" fi - if [[ -d "${dictPath}/dict" ]]; then - if [[ ! -e "${dictPath}/data/nvdaControllerClient.dll" ]]; then - cp "${cache}/nvda2speechd32.dll" "${dictPath}/data/nvdaControllerClient.dll" - fi - fi + # DLL replacement now handled by update_nvda_dlls() if [[ ! -d "${dictPath}/dict" ]] && [[ ! -r "${cache}/bk3-dict.dat" ]]; then find "${WINEPREFIX}/drive_c/nyanchangame/bk3" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; "${0%/*}/speech/clipboard_translator.sh" play.exe bokurano-daibouken3 & @@ -225,9 +219,7 @@ custom_launch_parameters() { #find "${WINEPREFIX}/drive_c/" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; #"${0%/*}/speech/clipboard_translator.sh" play_sr.exe shadow-line & #fi - if [[ "${game[0]}" == "sketchbook" ]]; then - find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; - fi + # sketchbook: DLL replacement now handled by update_nvda_dlls() if [[ "${game[0]}" == "audiodisc" ]]; then wine "$winePath\\$wineExec" exit 0 @@ -469,15 +461,7 @@ unset version export ipfsGateway="${ipfsGateway:-https://ipfs.stormux.org}" export nvdaControllerClientDll="${ipfsGateway}/ipfs/QmWu7YdSbKMk1Qm5DKvEA5hk1YuAK8wVkwhDf2CsmPkmF1?filename=nvdaControllerClient32.dll" -# Start nvda2speechd server - pgrep -u "$USER" nvda2speechd &> /dev/null || { - if [[ ! -f "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" ]]; then - download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd" - cp "${cache}/nvda2speechd" "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" - chmod +x "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" - fi - "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" ; -} +# nvda2speechd server startup is now handled in game_launcher() # Source helper functions From e12bcadb2a9ae6e543259fe5ba2efd16c3ce4cac Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 03:11:37 -0400 Subject: [PATCH 23/77] Add progress bars to some more operations, e.g. installing games. This required a bulk edit to all installer scripts, thanks Claud for the assist. Oh and send downloads through a progressbar. --- .includes/bottle.sh | 12 ++++----- .includes/functions.sh | 34 +++++++++++++++++++++--- .install/A Hero's Call.sh | 3 +-- .install/Adventurers At C.sh | 4 +-- .install/Angel Gift.sh | 2 +- .install/AudioDisc.sh | 2 +- .install/AudioQuake.sh | 4 +-- .install/Balatro.sh | 5 +--- .install/Battle Zone.sh | 1 - .install/Battle of the Hunter.sh | 3 +-- .install/Battlefield 2D.sh | 4 +-- .install/Beatstar Pro.sh | 2 +- .install/Blind Drive.sh | 4 +-- .install/Bokurano Daibouken 2.sh | 3 +-- .install/Bokurano Daibouken 3.sh | 4 +-- .install/Bokurano Daibouken.sh | 3 +-- .install/Bombercats.sh | 3 +-- .install/Bop It Emulator.sh | 2 +- .install/Bounce Bounce.sh | 2 -- .install/Breed Memorial.sh | 3 +-- .install/Breu2 Shadow Hunt.sh | 4 +-- .install/Castaways 2.sh | 2 +- .install/Castaways.sh | 2 +- .install/Challenge of the Horse.sh | 3 +-- .install/Chillingham.sh | 2 +- .install/Christmas Chaos.sh | 2 +- .install/Clashes of the Sky.sh | 3 +-- .install/Code Dungeon.sh | 4 +-- .install/Coin Collector.sh | 2 -- .install/Conjury.sh | 3 --- .install/Constant Motion.sh | 4 +-- .install/Copter Mission.sh | 2 +- .install/Crazy Party.sh | 4 +-- .install/Crime Hunter.sh | 4 +-- .install/Danger on the Wheel.sh | 3 +-- .install/Daytona and the Book of Gold.sh | 2 +- .install/Death on the Road.sh | 2 +- .install/Dog Who Hates Toast.sh | 2 +- .install/Dragon Pong.sh | 2 +- .install/Endless Runner.sh | 3 +-- .install/Entombed.sh | 2 +- .install/Eurofly.sh | 2 +- .install/Executioner's Rage.sh | 4 +-- .install/Extant.sh | 2 +- .install/Fuck That Bird.sh | 2 +- .install/Galactic Strike.sh | 2 +- .install/Grizzly Gulch.sh | 2 +- .install/Hammer of Glory.sh | 3 +-- .install/Hunter.sh | 2 +- .install/Inquisitor's Heartbeat.sh | 2 +- .install/Insect Therapy.sh | 2 +- .install/Laser Breakout.sh | 4 +-- .install/Light Battles.sh | 4 +-- .install/Lost.sh | 3 +-- .install/Lunimals.sh | 2 +- .install/Marina Break.sh | 2 -- .install/Mist World.sh | 4 +-- .install/Oh Shit.sh | 5 +--- .install/Operation BlackSquare.sh | 2 +- .install/Paw Prints.sh | 2 +- .install/Penta Path.sh | 2 +- .install/Pipe 2 Blast Chamber.sh | 2 +- .install/Preludeamals.sh | 2 +- .install/Puzzle Divided.sh | 2 +- .install/RS Games.sh | 1 - .install/Rettou.sh | 2 +- .install/Revelation.sh | 2 +- .install/Rhythm Rage.sh | 3 +-- .install/Road to Rage Offline.sh | 3 +-- .install/Road to Rage.sh | 2 +- .install/Run For Your Life.sh | 2 +- .install/Sammy Center.sh | 1 - .install/Scramble!.sh | 4 +-- .install/Screaming Strike 2.sh | 1 - .install/Scrolling Battles.sh | 2 +- .install/Sequence Storm.sh | 2 +- .install/Shooter.sh | 4 +-- .install/Side Party.sh | 4 +-- .install/Simple Fighter.sh | 5 ++-- .install/Skateboarder Pro.sh | 4 +-- .install/Sketchbook.sh | 5 ++-- .install/Slender Lost Vision.sh | 10 +++---- .install/Smashathon.sh | 2 +- .install/Sonic Zoom.sh | 5 ++-- .install/Sonic the Hedgehog.sh | 2 +- .install/Super Deekout.sh | 2 +- .install/Super Mario Bros.sh | 2 +- .install/Swamp.sh | 2 +- .install/Tactical Battle.sh | 2 +- .install/Tarot Assistant.sh | 2 +- .install/Technoshock.sh | 4 +-- .install/The Blind Swordsman.sh | 2 +- .install/The Great Toy Robbery.sh | 2 -- .install/The Vale.sh | 2 +- .install/They'll Come from the Moon.sh | 4 +-- .install/Thief.sh | 2 +- .install/Three D velocity.sh | 5 +--- .install/Tomb Hunter.sh | 3 +-- .install/Toy Mania.sh | 3 +-- .install/Triple Triad.sh | 2 +- .install/Troopanum2.sh | 2 +- .install/Undead Assault.sh | 3 +-- .install/VIP Mud.sh | 3 --- .install/Villains From Beyond.sh | 3 +-- .install/Warsim.sh | 2 +- .install/Wave of the Undead.sh | 2 -- .install/World of War.sh | 2 +- .install/haunted Party.sh | 4 +-- audiogame-manager.sh | 16 +++++------ 109 files changed, 148 insertions(+), 210 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index a7ba5a7..07d2496 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -65,10 +65,10 @@ install_rhvoice() { fi local voiceFile="${RHVoice[${voiceName}]##*/}" download "${RHVoice[${voiceName}]}" - winetricks -q win8 + winetricks -q win8 | agm_progressbox "RHVoice Setup" "Preparing Windows environment for RHVoice..." echo "Installing RHVoice ${voiceName^}..." wine "${cache}/${voiceFile}" & - sleep 20 + sleep 20 | agm_progressbox "RHVoice Setup" "Installing RHVoice ${voiceName^} voice..." wineserver -k } @@ -109,9 +109,9 @@ install_wine_bottle() { fi echo -n "Using " wine --version - DISPLAY="" wineboot -u - wine msiexec /i z:"$monoPath" /quiet - wine msiexec /i z:"$geckoPath" /quiet + DISPLAY="" wineboot -u | agm_progressbox "Wine Setup" "Initializing wine bottle..." + 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..." if [[ "${*}" =~ (speechsdk|sapi) ]]; then install_rhvoice fi @@ -122,7 +122,7 @@ install_wine_bottle() { 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} + winetricks -q isolate_home "$@" "${winVer:-win7}" ${winetricksSettings} | agm_progressbox "Wine Setup" "Installing wine dependencies..." # Set default voice for speech-enabled games if [[ ${#defaultVoice} -ge 2 ]] && [[ "$*" =~ (speechsdk|sapi) ]]; then diff --git a/.includes/functions.sh b/.includes/functions.sh index a9d0d40..9db7d64 100644 --- a/.includes/functions.sh +++ b/.includes/functions.sh @@ -1,3 +1,5 @@ +#!/usr/bin/env bash + # Alerts, for when user needs to read something. alert() { play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t @@ -51,10 +53,10 @@ download() { fi # Skip if the item is in cache. [[ -e "${cache}/${dest}" ]] && continue - { if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" ; then - echo "Could not download \"$i\"..." + if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" 2>&1 | agm_progressbox "Audio Game Manager" "Downloading \"$dest\"..."; then + agm_infobox "Audio Game Manager" "Audio Game Manager" "Could not download \"$dest\". Installation cannot continue." exit 1 - fi; } | agm_progressbox "Audio Game Manager" "Downloading \"$dest\" from \"$i\"" + fi local downloadError=1 case "${dest##*.}" in "pk3"|"zip") @@ -173,3 +175,29 @@ unix2dos() { sed -i 's/\r\{0,\}$/\r/' "$file" done } + +# Progress wrapper for game installation operations +install_with_progress() { + local operation="$1" + local message="$2" + shift 2 + + case "$operation" in + "unzip") + unzip "$@" | agm_progressbox "Game Installation" "$message" + ;; + "7z") + 7z "$@" | agm_progressbox "Game Installation" "$message" + ;; + "cp"|"copy") + cp -v "$@" | agm_progressbox "Game Installation" "$message" + ;; + "find") + find "$@" | agm_progressbox "Game Installation" "$message" + ;; + *) + # Default: run command with progress box + "$operation" "$@" | agm_progressbox "Game Installation" "$message" + ;; + esac +} diff --git a/.install/A Hero's Call.sh b/.install/A Hero's Call.sh index 41aca8e..6529e17 100644 --- a/.install/A Hero's Call.sh +++ b/.install/A Hero's Call.sh @@ -5,6 +5,5 @@ install_wine_bottle speechsdk corefonts # Dotnet is evil. That is all. LC_ALL=C DISPLAY="" winetricks -q dotnet462 xna40 ${wine}server -k # Really! -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/a-heros-call-freeware.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/a-heros-call-freeware.zip" add_launcher "c:\Program Files\a-heros-call\A Hero's Call.exe" diff --git a/.install/Adventurers At C.sh b/.install/Adventurers At C.sh index 5ea7e8d..c0ef021 100644 --- a/.install/Adventurers At C.sh +++ b/.install/Adventurers At C.sh @@ -1,5 +1,5 @@ download "http://www.vgstorm.com/aac/aac.zip" "https://www.agarchive.net/games/vg/adventure%20at%20c%20stages.7z" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/aac" "${cache}/aac.zip" -7z x -o"$WINEPREFIX/drive_c/Program Files/aac/stages" "${cache}/adventure at c stages.7z" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/aac" "${cache}/aac.zip" +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/aac/stages" "${cache}/adventure at c stages.7z" add_launcher "c:\Program Files\aac\aac.exe" diff --git a/.install/Angel Gift.sh b/.install/Angel Gift.sh index 278334a..e4dfc59 100644 --- a/.install/Angel Gift.sh +++ b/.install/Angel Gift.sh @@ -1,4 +1,4 @@ download "https://erion.cf/files/ag_103.zip" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/Angel Gift" "$cache/ag_103.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Angel Gift" "$cache/ag_103.zip" add_launcher 'c:\Program Files\Angel Gift\ag.exe' diff --git a/.install/AudioDisc.sh b/.install/AudioDisc.sh index 4b4e4dd..4cb354a 100644 --- a/.install/AudioDisc.sh +++ b/.install/AudioDisc.sh @@ -1,4 +1,4 @@ download "https://agarchive.net/games/other/audiodisc.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/audiodisc.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/audiodisc.zip" add_launcher "c:\Program Files\audiodisc\disco.exe" diff --git a/.install/AudioQuake.sh b/.install/AudioQuake.sh index 7f4f84a..db772f0 100644 --- a/.install/AudioQuake.sh +++ b/.install/AudioQuake.sh @@ -1,8 +1,8 @@ download "https://github.com/matatk/agrip/releases/download/2020.0-beta1/AudioQuake+LDL_2020.0-beta1_Windows.zip" "https://stormgames.wolfe.casa/downloads/quake.zip" export winVer="win7" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/AudioQuake+LDL_2020.0-beta1_Windows.zip" -unzip -d "$WINEPREFIX/drive_c/Program Files/AudioQuake/id1" "${cache}/quake.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/AudioQuake+LDL_2020.0-beta1_Windows.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/AudioQuake/id1" "${cache}/quake.zip" add_launcher "c:\Program Files\AudioQuake\AudioQuake.exe" echo echo "After you launch the game, press tab then enter and it should begin speaking." diff --git a/.install/Balatro.sh b/.install/Balatro.sh index df0057b..e855bba 100644 --- a/.install/Balatro.sh +++ b/.install/Balatro.sh @@ -1,10 +1,9 @@ -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" "https://stormgames.wolfe.casa/downloads/Tolk.dll" "https://github.com/Aurelius7309/BlackHole/releases/download/0.3.1/BlackHole-Release.zip" export WINEARCH=win64 export winVer="win10" install_wine_bottle get_steam "2379780" "https://store.steampowered.com/app/2379780/Balatro/" mkdir -p "$WINEPREFIX/drive_c/users/$USER/AppData/Roaming/Balatro/Mods" -unzip -d "$WINEPREFIX/drive_c/users/$USER/AppData/Roaming/Balatro" "$cache/BlackHole-Release.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/users/$USER/AppData/Roaming/Balatro" "$cache/BlackHole-Release.zip" pushd "$WINEPREFIX/drive_c/users/$USER/AppData/Roaming/Balatro/Mods" (cat mod_urls.txt ; echo) | while read -r x ; do git clone "$x" @@ -12,7 +11,5 @@ done cp -v BlackHole/bin/*.dll "$WINEPREFIX/drive_c/Program Files/Balatro" cp -v "$cache/Tolk.dll" "$WINEPREFIX/drive_c/Program Files/Balatro/tolk.dll" cp -v "$cache/Tolk.dll" BlackHole/bin/tolk.dll -cp -v "$cache/nvda2speechd64.dll" "$WINEPREFIX/drive_c/Program Files/Balatro/nvdaControllerClient64.dll" -cp -v "$cache/nvda2speechd64.dll" BlackHole/bin/nvdaControllerClient64.dll cp -v ../version.dll "$WINEPREFIX/drive_c/Program Files/Balatro" add_launcher 'c:\Program Files\Balatro\Balatro.exe' 'export WINEDLLOVERRIDES=version=n,b' diff --git a/.install/Battle Zone.sh b/.install/Battle Zone.sh index 7a12769..14a5f29 100644 --- a/.install/Battle Zone.sh +++ b/.install/Battle Zone.sh @@ -2,5 +2,4 @@ download "https://www.agarchive.net/games/gameMadnessInteractive/battle%20zone%2 export winVer="win7" install_wine_bottle speechsdk wine "${cache}/battle zone 13.5 setup.exe" /silent -find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; add_launcher "c:\Program Files\Battle Zone\ss.exe" diff --git a/.install/Battle of the Hunter.sh b/.install/Battle of the Hunter.sh index e7d465a..3658407 100644 --- a/.install/Battle of the Hunter.sh +++ b/.install/Battle of the Hunter.sh @@ -2,6 +2,5 @@ download "http://files.tunmi13.com/projects_archive/bth.zip" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/$game" "${cache}/bth.zip" -find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/$game" "${cache}/bth.zip" add_launcher "c:\Program Files\\${game}\bth.exe" diff --git a/.install/Battlefield 2D.sh b/.install/Battlefield 2D.sh index b056b0f..0a69452 100644 --- a/.install/Battlefield 2D.sh +++ b/.install/Battlefield 2D.sh @@ -1,9 +1,7 @@ get_installer "bf.zip" "https://tunmi13.itch.io/battlefield-2d" -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" # Uses standard wine path based on architecture (win32/win64) install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/bf.zip" -find "${WINEPREFIX}/drive_c/Program Files/bf" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/bf.zip" add_launcher "c:\Program Files\bf\bf.exe" diff --git a/.install/Beatstar Pro.sh b/.install/Beatstar Pro.sh index 9edfe77..d3c3805 100644 --- a/.install/Beatstar Pro.sh +++ b/.install/Beatstar Pro.sh @@ -4,5 +4,5 @@ download "https://oriolgomez.com/games/beat_windows.zip" export WINEARCH=win64 export winVer="win7" install_wine_bottle mf -unzip -d "$WINEPREFIX/drive_c/Program Files/Beatstar Pro" "${cache}/beat_windows.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Beatstar Pro" "${cache}/beat_windows.zip" add_launcher "c:\Program Files\Beatstar Pro\beatstar.exe" diff --git a/.install/Blind Drive.sh b/.install/Blind Drive.sh index 4288450..e32c49e 100644 --- a/.install/Blind Drive.sh +++ b/.install/Blind Drive.sh @@ -1,11 +1,9 @@ get_installer "Blind Drive 1.1.112.00i-win64.zip" "https://lofipeople.itch.io/blind-drive" -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/blind-drive" "${cache}/Blind Drive 1.1.112.00i-win64.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/blind-drive" "${cache}/Blind Drive 1.1.112.00i-win64.zip" # Weird work around to get keyboard working. winetricks -q usetakefocus=y winetricks -q usetakefocus=n -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; add_launcher "c:\Program Files\blind-drive\Blind Drive.exe" diff --git a/.install/Bokurano Daibouken 2.sh b/.install/Bokurano Daibouken 2.sh index 2210988..210a102 100644 --- a/.install/Bokurano Daibouken 2.sh +++ b/.install/Bokurano Daibouken 2.sh @@ -2,6 +2,5 @@ download "https://www.nyanchangames.com/softs/nn2_setup.exe" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle -7z x -o"$WINEPREFIX/drive_c/nyanchangame/bk2" "${cache}/nn2_setup.exe" -find "${WINEPREFIX}/drive_c/nyanchangame/bk2/" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/bk2" "${cache}/nn2_setup.exe" add_launcher "c:\nyanchangame\bk2\play.exe" diff --git a/.install/Bokurano Daibouken 3.sh b/.install/Bokurano Daibouken 3.sh index ea40ee3..669ce58 100644 --- a/.install/Bokurano Daibouken 3.sh +++ b/.install/Bokurano Daibouken 3.sh @@ -14,12 +14,10 @@ done if [[ "${#dictFile}" -ge 3 ]] && [[ ! -r "${cache}/bk3-dict.dat" ]]; then agm_yesno "Bokurano Daibouken 3" "Bokurano Daibouken 3" "Possible English translation file found at $dictFile. Would you like to use it for BK3?" && cp -v "$dictFile" "${cache}/bk3-dict.dat" fi -download "https://www.nyanchangames.com/softs/nn3_setup.exe" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle cp "${cache}/nvda2speechd" "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" chmod +x "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" -7z x -o"$WINEPREFIX/drive_c/nyanchangame/bk3" "${cache}/nn3_setup.exe" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient.dll' -exec cp -v "${cache}/nvda2speechd32.dll" "{}" \; +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/bk3" "${cache}/nn3_setup.exe" add_launcher "c:\nyanchangame\bk3\play.exe" diff --git a/.install/Bokurano Daibouken.sh b/.install/Bokurano Daibouken.sh index 9fc8179..c5f0001 100644 --- a/.install/Bokurano Daibouken.sh +++ b/.install/Bokurano Daibouken.sh @@ -2,6 +2,5 @@ download "https://www.nyanchangames.com/softs/nn_setup.exe" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle -7z x -o"$WINEPREFIX/drive_c/nyanchangame/bk" "${cache}/nn_setup.exe" -find "${WINEPREFIX}/drive_c/nyanchangame/bk/" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/bk" "${cache}/nn_setup.exe" add_launcher "c:\nyanchangame\bk\play.exe" diff --git a/.install/Bombercats.sh b/.install/Bombercats.sh index 91e0744..5adb37f 100644 --- a/.install/Bombercats.sh +++ b/.install/Bombercats.sh @@ -2,6 +2,5 @@ download "http://oriolgomez.com/games/bombercats_en.zip" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/bomvercats" "${cache}/bombercats_en.zip" -find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/bomvercats" "${cache}/bombercats_en.zip" add_launcher "c:\Program Files\bomvercats\game.exe" diff --git a/.install/Bop It Emulator.sh b/.install/Bop It Emulator.sh index a11abf7..d867b5b 100644 --- a/.install/Bop It Emulator.sh +++ b/.install/Bop It Emulator.sh @@ -1,5 +1,5 @@ download "http://www.masonasons.me/softs/BopItEmulator3.1PasswordIsBopIt.7z" export winVer="win7" install_wine_bottle -7z x -o"$WINEPREFIX/drive_c/Program Files/Bop It" "${cache}/BopItEmulator3.1PasswordIsBopIt.7z" -pBopIt +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Bop It" "${cache}/BopItEmulator3.1PasswordIsBopIt.7z" -pBopIt add_launcher "c:\Program Files\Bop It\bop.exe" diff --git a/.install/Bounce Bounce.sh b/.install/Bounce Bounce.sh index 43f6b7c..6f588ae 100644 --- a/.install/Bounce Bounce.sh +++ b/.install/Bounce Bounce.sh @@ -1,7 +1,5 @@ export WINEARCH=win64 get_installer "bounce_bounce.rar" "https://kavyapriya.itch.io/bounce-bounce" -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" install_wine_bottle unrar x "${cache}/bounce_bounce.rar" -op"$WINEPREFIX/drive_c/Program Files" -find "${WINEPREFIX}/drive_c/Program Files/bounce_bounce" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; add_launcher "c:\Program Files\bounce_bounce\bounce.exe" diff --git a/.install/Breed Memorial.sh b/.install/Breed Memorial.sh index ef9c31a..5459864 100644 --- a/.install/Breed Memorial.sh +++ b/.install/Breed Memorial.sh @@ -2,6 +2,5 @@ download "https://hirotaka2014.sakura.ne.jp/mh0406/game/breed_memorial.zip" "${nvdaControllerClientDll}" export winVer="win7" install_wine_bottle cjkfonts speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/breed_memorial.zip" -#find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/breed_memorial.zip" add_launcher "c:\Program Files\Breed memorial\Breed memorial\breed memorial.exe" diff --git a/.install/Breu2 Shadow Hunt.sh b/.install/Breu2 Shadow Hunt.sh index 4b2c94d..6f11a0e 100644 --- a/.install/Breu2 Shadow Hunt.sh +++ b/.install/Breu2 Shadow Hunt.sh @@ -1,8 +1,6 @@ -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" get_installer "breu2.zip" "https://breu.itch.io/shadowhunt" export WINEARCH=win64 export winVer="win8" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/breu2.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/breu2.zip" add_launcher "c:\Program Files\breu2\breu2.exe" diff --git a/.install/Castaways 2.sh b/.install/Castaways 2.sh index 17e9f48..7e67396 100644 --- a/.install/Castaways 2.sh +++ b/.install/Castaways 2.sh @@ -2,6 +2,6 @@ download "http://www.kaldobsky.com/audiogames/castaways2beta.zip" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle vb6run dx8vb speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/castaways2" "${cache}/castaways2beta.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/castaways2" "${cache}/castaways2beta.zip" wine "c:\Program Files\castaways2\Checkup.exe" /verysilent add_launcher "c:\Program Files\castaways2\Castaways2.exe" diff --git a/.install/Castaways.sh b/.install/Castaways.sh index 48e2240..16de149 100644 --- a/.install/Castaways.sh +++ b/.install/Castaways.sh @@ -2,6 +2,6 @@ download "https://www.kaldobsky.com/audiogames/castaways.zip" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle vb6run dx8vb speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/castaways" "${cache}/castaways.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/castaways" "${cache}/castaways.zip" wine "c:\Program Files\castaways\Checkup.exe" /verysilent add_launcher "c:\Program Files\castaways\Castaways.exe" diff --git a/.install/Challenge of the Horse.sh b/.install/Challenge of the Horse.sh index a92f2c1..6d03672 100644 --- a/.install/Challenge of the Horse.sh +++ b/.install/Challenge of the Horse.sh @@ -2,6 +2,5 @@ download "http://files.tunmi13.com/projects_archive/coth.zip" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/$game" "${cache}/coth.zip" -find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/$game" "${cache}/coth.zip" add_launcher "c:\Program Files\\${game}\game.exe" diff --git a/.install/Chillingham.sh b/.install/Chillingham.sh index 7408129..992acad 100644 --- a/.install/Chillingham.sh +++ b/.install/Chillingham.sh @@ -1,4 +1,4 @@ download "https://stormgames.wolfe.casa/downloads/chillingham.zip" install_wine_bottle vb6run mfc42 -unzip -d "$WINEPREFIX/drive_c/Program Files" "$cache/chillingham.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "$cache/chillingham.zip" add_launcher "c:\Program Files\chillingham\Chillingham.exe" diff --git a/.install/Christmas Chaos.sh b/.install/Christmas Chaos.sh index b5a562f..d68c994 100644 --- a/.install/Christmas Chaos.sh +++ b/.install/Christmas Chaos.sh @@ -2,6 +2,6 @@ export WINEARCH=win64 export winVer="win7" download "${ipfsGateway}/ipfs/QmYx11vsMDBgjPd1coZPGHxMXf2qtf4icqmB3Q9iUazyQv?filename=ChristmasChaos.zip" "https://stormgames.wolfe.casa/downloads/Tolk.dll" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/ChristmasChaos.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/ChristmasChaos.zip" find "${WINEPREFIX}" -type f -name 'Tolk.dll' -exec cp -v "${cache}/Tolk.dll" "{}" \; add_launcher "c:\Program Files\ChristmasChaos\ChristmasChaos.exe" diff --git a/.install/Clashes of the Sky.sh b/.install/Clashes of the Sky.sh index 136a5a3..8875de7 100644 --- a/.install/Clashes of the Sky.sh +++ b/.install/Clashes of the Sky.sh @@ -2,6 +2,5 @@ get_installer "clashes_of_the_sky.zip" "https://tunmi13.itch.io/clashes-of-the-s # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/clashes_of_the_sky.zip" -find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/clashes_of_the_sky.zip" add_launcher 'c:\Program Files\clashes_of_the_sky\clash.exe' diff --git a/.install/Code Dungeon.sh b/.install/Code Dungeon.sh index cf1055f..1d97f17 100644 --- a/.install/Code Dungeon.sh +++ b/.install/Code Dungeon.sh @@ -1,11 +1,9 @@ get_installer "codedungeon-win-64.zip" "https://stealcase.itch.io/codedungeon" -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/code-dungeon" "${cache}/codedungeon-win-64.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/code-dungeon" "${cache}/codedungeon-win-64.zip" # Weird work around to get keyboard working. winetricks -q usetakefocus=y winetricks -q usetakefocus=n -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; add_launcher "c:\Program Files\code-dungeon\Code Dungeon.exe" diff --git a/.install/Coin Collector.sh b/.install/Coin Collector.sh index 666ecf1..0272545 100644 --- a/.install/Coin Collector.sh +++ b/.install/Coin Collector.sh @@ -1,7 +1,5 @@ export WINEARCH=win64 export winVer="win7" -download "https://www.dropbox.com/s/v55q7t9n84otmcd/coin%20collector.rar?dl=1" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" install_wine_bottle unrar x "$cache/coin collector.rar" -op"$WINEPREFIX/drive_c/Program Files" -find "$WINEPREFIX/drive_c/Program Files/coin collector" -type f -name "nvdaControllerClient64.dll" -exec cp -v "$cache/nvda2speechd64.dll" "{}" \; add_launcher "c:\Program Files\coin collector\game.exe" diff --git a/.install/Conjury.sh b/.install/Conjury.sh index 234fd43..46c00ef 100644 --- a/.install/Conjury.sh +++ b/.install/Conjury.sh @@ -1,8 +1,5 @@ -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" export WINEARCH=win64 export winVer="win8" install_wine_bottle get_steam 2684520 "https://store.steampowered.com/app/2684520/Conjury/" -find "$WINEPREFIX/drive_c/Program Files/Conjury" -type f -path '*/x86_64/nvdaControllerClient.dll' -exec cp -v "$cache/nvda2speechd64.dll" "{}" \; -find "$WINEPREFIX/drive_c/Program Files/Conjury" -type f -path '*/x86/nvdaControllerClient.dll' -exec cp -v "$cache/nvda2speechd32.dll" "{}" \; add_launcher 'c:\Program Files\Conjury\release\Conjury.exe' diff --git a/.install/Constant Motion.sh b/.install/Constant Motion.sh index bc72f38..bd572b3 100644 --- a/.install/Constant Motion.sh +++ b/.install/Constant Motion.sh @@ -1,7 +1,5 @@ export WINEARCH=win64 export winVer="win7" -download "https://samtupy.com/games/cm.zip" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/ConstantMotion" "$cache/cm.zip" -find "$WINEPREFIX/drive_c/Program Files/ConstantMotion" -name "nvdaControllerClient64.dll" -exec cp -v "$cache/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/ConstantMotion" "$cache/cm.zip" add_launcher 'c:\Program Files\ConstantMotion\cm.exe' diff --git a/.install/Copter Mission.sh b/.install/Copter Mission.sh index c92a7a0..909adad 100644 --- a/.install/Copter Mission.sh +++ b/.install/Copter Mission.sh @@ -2,5 +2,5 @@ export winVer="win7" download "http://oriolgomez.com/games/copter_en.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/copter mission" "${cache}/copter_en.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/copter mission" "${cache}/copter_en.zip" add_launcher "c:\Program Files\copter mission\game.exe" diff --git a/.install/Crazy Party.sh b/.install/Crazy Party.sh index 53abb00..001b629 100644 --- a/.install/Crazy Party.sh +++ b/.install/Crazy Party.sh @@ -1,8 +1,6 @@ export WINEARCH=win64 export winVer="win8" -download "http://pragmapragma.free.fr/crazy-party/Crazy-Party-beta82.zip" "https://stormgames.wolfe.casa/downloads/Tolk.dll" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/Crazy-Party-beta82.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/Crazy-Party-beta82.zip" find "${WINEPREFIX}" -type f -name 'Tolk.dll' -exec cp -v "${cache}/Tolk.dll" "{}" \; -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; add_launcher "c:\Program Files\Crazy-Party-beta82\Crazy Party.exe" diff --git a/.install/Crime Hunter.sh b/.install/Crime Hunter.sh index 3f9fa78..255c1f2 100644 --- a/.install/Crime Hunter.sh +++ b/.install/Crime Hunter.sh @@ -1,7 +1,5 @@ export WINEARCH=win64 export winVer="win7" -download "http://masonasons.me/softs/CH2.0Win.zip" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/crime-hunter" "${cache}/CH2.0Win.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/crime-hunter" "${cache}/CH2.0Win.zip" add_launcher "c:\Program Files\crime-hunter\ch.exe" diff --git a/.install/Danger on the Wheel.sh b/.install/Danger on the Wheel.sh index 05f21b4..b013391 100644 --- a/.install/Danger on the Wheel.sh +++ b/.install/Danger on the Wheel.sh @@ -2,6 +2,5 @@ download "http://oriolgomez.com/games/wheel_en.zip" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/danger on the wheel" "${cache}/wheel_en.zip" -find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/danger on the wheel" "${cache}/wheel_en.zip" add_launcher "c:\Program Files\danger on the wheel\game.exe" diff --git a/.install/Daytona and the Book of Gold.sh b/.install/Daytona and the Book of Gold.sh index a5fa3b7..f9bb131 100644 --- a/.install/Daytona and the Book of Gold.sh +++ b/.install/Daytona and the Book of Gold.sh @@ -3,6 +3,6 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://kaldobsky.com/audiogames/Daytona.zip" install_wine_bottle vb6run dx8vb quartz corefonts -unzip -d "$WINEPREFIX/drive_c/Program Files/daytona" "${cache}/Daytona.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/daytona" "${cache}/Daytona.zip" wine 'c:\Program Files\daytona\checkup.exe' /verysilent add_launcher "c:\Program Files\daytona\Daytona.exe" diff --git a/.install/Death on the Road.sh b/.install/Death on the Road.sh index 2573437..120156c 100644 --- a/.install/Death on the Road.sh +++ b/.install/Death on the Road.sh @@ -2,5 +2,5 @@ export winVer="win7" download "http://oriolgomez.com/games/road_en.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/death on the road" "${cache}/road_en.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/death on the road" "${cache}/road_en.zip" add_launcher "c:\Program Files\death on the road\game.exe" diff --git a/.install/Dog Who Hates Toast.sh b/.install/Dog Who Hates Toast.sh index 03d13ad..dd53b72 100644 --- a/.install/Dog Who Hates Toast.sh +++ b/.install/Dog Who Hates Toast.sh @@ -3,7 +3,7 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/dogwhohatestoast.zip" install_wine_bottle vb6run dx8vb quartz speechsdk corefonts -unzip -d "$WINEPREFIX/drive_c/Program Files/dogwhohatestoast" "${cache}/dogwhohatestoast.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/dogwhohatestoast" "${cache}/dogwhohatestoast.zip" wine 'c:\Program Files\dogwhohatestoast\checkup.exe' /verysilent add_launcher "c:\Program Files\dogwhohatestoast\DogwhoHatesToast.exe" echo "Note: Dog who Hates Toast installed. Once you start the game, you must press tab until you hear sapi on to get speech." >&2 diff --git a/.install/Dragon Pong.sh b/.install/Dragon Pong.sh index 2d84cae..901a26d 100644 --- a/.install/Dragon Pong.sh +++ b/.install/Dragon Pong.sh @@ -2,5 +2,5 @@ export winVer="win7" install_wine_bottle download "https://www.iamtalon.me/games/dragonpong.zip" -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/dragonpong.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/dragonpong.zip" add_launcher "c:\Program Files\dragonpong\DragonPong.exe" diff --git a/.install/Endless Runner.sh b/.install/Endless Runner.sh index 6558aa3..5dcc745 100644 --- a/.install/Endless Runner.sh +++ b/.install/Endless Runner.sh @@ -1,5 +1,4 @@ download "http://www.masonasons.me/softs/EndlessRunner.7z" install_wine_bottle speechsdk -7z x -y -o"$WINEPREFIX/drive_c/Program Files/Endless Runner" "${cache}/EndlessRunner.7z" -prunner -find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; +install_with_progress 7z "Extracting game files..." x -y -o"$WINEPREFIX/drive_c/Program Files/Endless Runner" "${cache}/EndlessRunner.7z" -prunner add_launcher "c:\Program Files\Endless Runner\runner.exe" diff --git a/.install/Entombed.sh b/.install/Entombed.sh index b3a3f73..4fb7c4a 100644 --- a/.install/Entombed.sh +++ b/.install/Entombed.sh @@ -7,7 +7,7 @@ LC_ALL=C DISPLAY="" winetricks -q dotnet40 xna40 ${wine}server -k # Sigh. mkdir -p "${WINEPREFIX}/drive_c/temp" pushd "${WINEPREFIX}/drive_c/temp" -7z x "${cache}/SSCERuntime-ENU.exe" +install_with_progress 7z "Extracting game files..." x "${cache}/SSCERuntime-ENU.exe" ${wine} msiexec /i "${WINEPREFIX}/drive_c/temp/SSCERuntime_x86-ENU.msi" /q rm * popd diff --git a/.install/Eurofly.sh b/.install/Eurofly.sh index b6b47a7..6073dcf 100644 --- a/.install/Eurofly.sh +++ b/.install/Eurofly.sh @@ -4,6 +4,6 @@ export winetricksSettings="vd=1024x768" download "https://www.stefankiss.sk/files/eurofly2/Launcher_1.2.zip" "https://www.stefankiss.sk/files/eurofly2/Eurofly_2_ful_setup.exe" install_wine_bottle speechsdk comctl32 wine "${cache}/Eurofly_2_ful_setup.exe" /silent -unzip -o -d "$WINEPREFIX/drive_c/Eurofly" "${cache}/Launcher_1.2.zip" +install_with_progress unzip "Extracting game files..." -o -d "$WINEPREFIX/drive_c/Eurofly" "${cache}/Launcher_1.2.zip" add_launcher "c:\Eurofly\launcher.exe" echo "Note: On first and sometimes later launch, Eurofly may take a very long time to download required files, please be patient..." diff --git a/.install/Executioner's Rage.sh b/.install/Executioner's Rage.sh index e078946..0aabd61 100644 --- a/.install/Executioner's Rage.sh +++ b/.install/Executioner's Rage.sh @@ -1,9 +1,7 @@ -download "https://dl.tweesecake.app/rage/rage1.5.0.zip" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win10" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/rage1.5.0.zip" -find "${WINEPREFIX}/drive_c/Program Files" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/rage1.5.0.zip" add_launcher "c:\Program Files\rage\rage.exe" url="https://techcake.games/games/executioners-rage/" echo "Before you can login, you need to create an account at:" diff --git a/.install/Extant.sh b/.install/Extant.sh index a93028d..ac5a4a7 100644 --- a/.install/Extant.sh +++ b/.install/Extant.sh @@ -1,4 +1,4 @@ download "https://agarchive.net/games/other/extant.zip" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/extant" "${cache}/extant.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/extant" "${cache}/extant.zip" add_launcher "c:\Program Files\extant\Extant.exe" diff --git a/.install/Fuck That Bird.sh b/.install/Fuck That Bird.sh index 0f1a15e..68d1fe8 100644 --- a/.install/Fuck That Bird.sh +++ b/.install/Fuck That Bird.sh @@ -2,5 +2,5 @@ export winVer="win7" download "http://oriolgomez.com/games/bird_en.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/fuck that bird" "${cache}/bird_en.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/fuck that bird" "${cache}/bird_en.zip" add_launcher "c:\Program Files\fuck that bird\game.exe" diff --git a/.install/Galactic Strike.sh b/.install/Galactic Strike.sh index db17486..98426cb 100644 --- a/.install/Galactic Strike.sh +++ b/.install/Galactic Strike.sh @@ -1,7 +1,7 @@ get_installer "Galactic Strike 1.2.zip" "https://fusion-forged-games.itch.io/galactic-strike" export winVer="win10" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/Galactic Strike" "${cache}/Galactic Strike 1.2.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Galactic Strike" "${cache}/Galactic Strike 1.2.zip" add_launcher "c:\Program Files\Galactic Strike\Galactic Strike.exe" echo "Use controls wasd to movi and navigate the menu." echo "Use m to fire and select items from the menu." diff --git a/.install/Grizzly Gulch.sh b/.install/Grizzly Gulch.sh index 834b374..998b1e1 100644 --- a/.install/Grizzly Gulch.sh +++ b/.install/Grizzly Gulch.sh @@ -1,6 +1,6 @@ download "https://stormgames.wolfe.casa/downloads/grizzly-gulch.zip" install_wine_bottle vb6run mfc42 -unzip -d "$WINEPREFIX/drive_c/Program Files" "$cache/grizzly-gulch.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "$cache/grizzly-gulch.zip" add_launcher "c:\Program Files\grizzly-gulch\Grizzly Gulch.exe" echo "If the combat sequences happen too slow for your tastes, while in the town square, you can use f12 to turn up the combat speed and f11 to lower it." alert diff --git a/.install/Hammer of Glory.sh b/.install/Hammer of Glory.sh index 645b328..f0bd826 100644 --- a/.install/Hammer of Glory.sh +++ b/.install/Hammer of Glory.sh @@ -2,6 +2,5 @@ export winVer="win7" download "http://oriolgomez.com/games/hammer_en.zip" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/hammer of glory" "${cache}/hammer_en.zip" -find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/hammer of glory" "${cache}/hammer_en.zip" add_launcher "c:\Program Files\hammer of glory\game.exe" diff --git a/.install/Hunter.sh b/.install/Hunter.sh index ced7ec7..66c2746 100644 --- a/.install/Hunter.sh +++ b/.install/Hunter.sh @@ -7,7 +7,7 @@ wine "${cache}/HunterSetup.exe" /silent & xdotool sleep 10 key --clearmodifiers alt+y 2> /dev/null sleep 30 && ${wine}server -k # Sometimes the installer finishes but the ${wine}server has more processes that don't exit, so we can't depend on ${wine}server -w. mkdir -p "$WINEPREFIX/drive_c/Program Files/bsc-key-generator" -7z x -o"$WINEPREFIX/drive_c/Program Files/bsc-key-generator" "${cache}/BSC unlock code generator.7z" +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/bsc-key-generator" "${cache}/BSC unlock code generator.7z" echo "$USER"$'\n'"$(hostname)"$'\n'"none"$'\n'"US" > "$WINEPREFIX/drive_c/Program Files/Hunter/config.dat" unix2dos "$WINEPREFIX/drive_c/Program Files/Hunter/config.dat" if command -v xclip &> /dev/null && command -v xdotool &> /dev/null ; then diff --git a/.install/Inquisitor's Heartbeat.sh b/.install/Inquisitor's Heartbeat.sh index cd45831..06c6c49 100644 --- a/.install/Inquisitor's Heartbeat.sh +++ b/.install/Inquisitor's Heartbeat.sh @@ -2,7 +2,7 @@ get_installer "Inquisitor_windows_ENG.zip" "https://www.audiogame.store/en/produ export WINEARCH=win64 export winVer="win8" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/Inquisitor_windows_ENG.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/Inquisitor_windows_ENG.zip" # Weird work around to get keyboard working. winetricks -q usetakefocus=y winetricks -q usetakefocus=n diff --git a/.install/Insect Therapy.sh b/.install/Insect Therapy.sh index 313aa0b..22316a5 100644 --- a/.install/Insect Therapy.sh +++ b/.install/Insect Therapy.sh @@ -2,5 +2,5 @@ export winVer="win7" download "http://oriolgomez.com/games/insect_en.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/insect therapy" "${cache}/insect_en.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/insect therapy" "${cache}/insect_en.zip" add_launcher "c:\Program Files\insect therapy\game.exe" diff --git a/.install/Laser Breakout.sh b/.install/Laser Breakout.sh index 8266a4d..161ccc0 100644 --- a/.install/Laser Breakout.sh +++ b/.install/Laser Breakout.sh @@ -1,9 +1,7 @@ # Currently only speaks in japanese, looking to see if we can find an english version. # Uses standard wine path based on architecture (win32/win64) export winVer="win7" -download "https://www.agarchive.net/games/nyanchan/laser%20breakout.7z" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" "https://stormgames.wolfe.casa/downloads/laser-breakout-options.dat" install_wine_bottle -7z x -o"$WINEPREFIX/drive_c/nyanchangame/" "$cache/laser breakout.7z" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient.dll' -exec cp -v "${cache}/nvda2speechd32.dll" "{}" \; +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/" "$cache/laser breakout.7z" cp -v "$cache/laser-breakout-options.dat" "$WINEPREFIX/drive_c/nyanchangame/laser breakout/options.dat" add_launcher "c:\nyanchangame\laser breakout\play.exe" diff --git a/.install/Light Battles.sh b/.install/Light Battles.sh index 2c6cbfc..77e077b 100644 --- a/.install/Light Battles.sh +++ b/.install/Light Battles.sh @@ -1,6 +1,4 @@ export winVer="win7" -download "https://prometheus-enterprises.com/games/CoL.exe" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" install_wine_bottle -7z x -o"$WINEPREFIX/drive_c/Program Files/Light Battles" "${cache}/CoL.exe" -find "${WINEPREFIX}" -type f -name "nvdaControllerClient.dll" -exec cp -v "$cache/nvda2speechd32.dll" "{}" \; +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Light Battles" "${cache}/CoL.exe" add_launcher "c:\Program Files\Light Battles\battles.exe" diff --git a/.install/Lost.sh b/.install/Lost.sh index 7a24330..1f54ccc 100644 --- a/.install/Lost.sh +++ b/.install/Lost.sh @@ -1,6 +1,5 @@ # Uses standard wine path based on architecture (win32/win64) download "https://agarchive.net/games/danZ/lost.zip" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/lost" "$cache/lost.zip" -find "$WINEPREFIX/drive_c/Program Files/lost" -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/lost" "$cache/lost.zip" add_launcher 'c:\Program Files\lost\lost.exe' diff --git a/.install/Lunimals.sh b/.install/Lunimals.sh index 901d25e..1aabfd9 100644 --- a/.install/Lunimals.sh +++ b/.install/Lunimals.sh @@ -3,7 +3,7 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://kaldobsky.com/audiogames/lunimals.zip" install_wine_bottle vb6run dx8vb quartz speechsdk corefonts -unzip -d "$WINEPREFIX/drive_c/Program Files/lunimals" "${cache}/lunimals.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/lunimals" "${cache}/lunimals.zip" wine 'c:\Program Files\lunimals\checkup.exe' /verysilent add_launcher "c:\Program Files\lunimals\Lunimals.exe" echo "Note: Lunimals installed. Once you start the game, you must press tab until you hear sapi on to get speech." >&2 diff --git a/.install/Marina Break.sh b/.install/Marina Break.sh index 6a46527..4e4bd28 100644 --- a/.install/Marina Break.sh +++ b/.install/Marina Break.sh @@ -1,10 +1,8 @@ # # Uses standard wine path based on architecture (win32/win64) export winVer="win7" -download "https://www.nyanchangames.com/softs/MbSetupE.exe" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" install_wine_bottle speechsdk wine "${cache}/MbSetupE.exe" & xdotool sleep 10 key Return ${wine}server -w -find "${WINEPREFIX}" -type f -name "nvdaControllerClient.dll" -exec cp -v "$cache/nvda2speechd32.dll" "{}" \; add_launcher "c:\nyanchangame\MarinaBreak\marinabreak.exe" diff --git a/.install/Mist World.sh b/.install/Mist World.sh index 82de3a3..6fda612 100644 --- a/.install/Mist World.sh +++ b/.install/Mist World.sh @@ -1,11 +1,9 @@ export winVer="win7" get_installer "Mist World_Setup.exe" "https://drive.google.com/uc?export=download&id=12YeUqorkkMT46ZSR5pcfWxSY8DHOLxZ-" -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" install_wine_bottle sapi -7z x -o"$WINEPREFIX/drive_c/Program Files/Mist World" "$cache/Mist World_Setup.exe" +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Mist World" "$cache/Mist World_Setup.exe" sed -i 's/1024m/768m/g' "$WINEPREFIX/drive_c/Program Files/Mist World/mw.exe.vmoptions" cp "$WINEPREFIX/drive_c/Program Files/Mist World/"{mw.exe.vmoptions,update.exe.vmoptions} -find "$WINEPREFIX/drive_c/Program Files/Mist World" -iname "nvdaControllerClient32.dll" -exec cp "$cache/nvda2speechd32.dll" "{}" \; mkdir "$WINEPREFIX/drive_c/Program Files/Mist World/"{user,users} add_launcher 'c:\Program Files\Mist World\mw.exe' echo diff --git a/.install/Oh Shit.sh b/.install/Oh Shit.sh index 89d2a2a..97b9373 100644 --- a/.install/Oh Shit.sh +++ b/.install/Oh Shit.sh @@ -1,8 +1,5 @@ export winVer="win7" export norh="true" # Requires sapi even though uses nvda -download "${ipfsGateway}/ipfs/QmQnAJJrt5uABFziQc7enXYrJ74J9GKQSMi8Ry8ebsxfPV?filename=OhShit.zip" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/OhShit.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvda2speechd32.dll" "{}" \; -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient.dll' -exec cp -v "${cache}/nvda2speechd32.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/OhShit.zip" add_launcher "c:\Program Files\oh_shit\OhShit.exe" diff --git a/.install/Operation BlackSquare.sh b/.install/Operation BlackSquare.sh index 35b6ef2..922e06d 100644 --- a/.install/Operation BlackSquare.sh +++ b/.install/Operation BlackSquare.sh @@ -1,5 +1,5 @@ export winVer="win7" download "https://www.iamtalon.me/games/blacksquare.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/blacksquare.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/blacksquare.zip" add_launcher "c:\Program Files\blacksquare\OperationBlackSquare.exe" diff --git a/.install/Paw Prints.sh b/.install/Paw Prints.sh index 60fb203..6378568 100644 --- a/.install/Paw Prints.sh +++ b/.install/Paw Prints.sh @@ -3,6 +3,6 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/pawprints.zip" install_wine_bottle vb6run dx8vb quartz speechsdk corefonts -unzip -d "$WINEPREFIX/drive_c/Program Files/pawprints" "${cache}/pawprints.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/pawprints" "${cache}/pawprints.zip" wine 'c:\Program Files\pawprints\checkup.exe' /verysilent add_launcher "c:\Program Files\pawprints\PawPrints.exe" diff --git a/.install/Penta Path.sh b/.install/Penta Path.sh index 50a243e..ad7a782 100644 --- a/.install/Penta Path.sh +++ b/.install/Penta Path.sh @@ -3,6 +3,6 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "http://www.kaldobsky.com/audiogames/pentapath.zip" install_wine_bottle vb6run dx8vb quartz speechsdk corefonts -unzip -d "$WINEPREFIX/drive_c/Program Files/pentapath" "${cache}/pentapath.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/pentapath" "${cache}/pentapath.zip" wine 'c:\Program Files\pentapath\checkup.exe' /verysilent add_launcher "c:\Program Files\pentapath\PentaPath.exe" diff --git a/.install/Pipe 2 Blast Chamber.sh b/.install/Pipe 2 Blast Chamber.sh index d3616ba..10c2b63 100644 --- a/.install/Pipe 2 Blast Chamber.sh +++ b/.install/Pipe 2 Blast Chamber.sh @@ -7,7 +7,7 @@ wine "${cache}/BlastChamberSetup.exe" /silent & xdotool sleep 10 key --clearmodifiers alt+y 2> /dev/null sleep 30 && ${wine}server -k # Sometimes the installer finishes but the ${wine}server has more processes that don't exit, so we can't depend on ${wine}server -w. mkdir -p "$WINEPREFIX/drive_c/Program Files/bsc-key-generator" -7z x -o"$WINEPREFIX/drive_c/Program Files/bsc-key-generator" "${cache}/BSC unlock code generator.7z" +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/bsc-key-generator" "${cache}/BSC unlock code generator.7z" echo "$USER"$'\n'"$(hostname)"$'\n'"none"$'\n'"US" > "$WINEPREFIX/drive_c/Program Files/Blast Chamber/config.dat" unix2dos "$WINEPREFIX/drive_c/Program Files/Blast Chamber/config.dat" if command -v xclip &> /dev/null && command -v xdotool &> /dev/null ; then diff --git a/.install/Preludeamals.sh b/.install/Preludeamals.sh index 72daa46..e50042b 100644 --- a/.install/Preludeamals.sh +++ b/.install/Preludeamals.sh @@ -3,6 +3,6 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/Preludeamals.zip" install_wine_bottle vb6run dx8vb quartz speechsdk corefonts -unzip -d "$WINEPREFIX/drive_c/Program Files/preludeamals" "${cache}/Preludeamals.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/preludeamals" "${cache}/Preludeamals.zip" wine 'c:\Program Files\preludeamals\checkup.exe' /verysilent add_launcher "c:\Program Files\preludeamals\Preludeamals.exe" diff --git a/.install/Puzzle Divided.sh b/.install/Puzzle Divided.sh index 3b43880..785c7ea 100644 --- a/.install/Puzzle Divided.sh +++ b/.install/Puzzle Divided.sh @@ -3,5 +3,5 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/puzzledivided.zip" install_wine_bottle vb6run dx8vb quartz corefonts -unzip -d "$WINEPREFIX/drive_c/Program Files/puzzledivided" "${cache}/puzzledivided.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/puzzledivided" "${cache}/puzzledivided.zip" add_launcher "c:\Program Files\puzzledivided\PuzzleDivided.exe" diff --git a/.install/RS Games.sh b/.install/RS Games.sh index c9e5fa4..e186a2d 100644 --- a/.install/RS Games.sh +++ b/.install/RS Games.sh @@ -1,5 +1,4 @@ download "http://rsgames.org/rsdownloads/rsgclient/rsgames-client-setup-2.01.exe" "${nvdaControllerClientDll}" install_wine_bottle speechsdk ${wine} "${cache}/rsgames-client-setup-2.01.exe" /silent -find "${WINEPREFIX}/drive_c/Program Files/RS Games Client" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; add_launcher "c:\Program Files\RS Games Client\rsg.exe" diff --git a/.install/Rettou.sh b/.install/Rettou.sh index 7a12391..a2ff952 100644 --- a/.install/Rettou.sh +++ b/.install/Rettou.sh @@ -3,5 +3,5 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "http://www.kaldobsky.com/audiogames/rettou.zip" install_wine_bottle vb6run dx8vb quartz speechsdk corefonts -unzip -d "$WINEPREFIX/drive_c/Program Files/rettou" "${cache}/rettou.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/rettou" "${cache}/rettou.zip" add_launcher "c:\Program Files\rettou\Rettou.exe" diff --git a/.install/Revelation.sh b/.install/Revelation.sh index 31a1aed..a68ac25 100644 --- a/.install/Revelation.sh +++ b/.install/Revelation.sh @@ -3,5 +3,5 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/revelation.zip" install_wine_bottle vb6run dx8vb quartz speechsdk corefonts -unzip -d "$WINEPREFIX/drive_c/Program Files/revelation" "${cache}/revelation.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/revelation" "${cache}/revelation.zip" add_launcher "c:\Program Files\revelation\Revelation.exe" diff --git a/.install/Rhythm Rage.sh b/.install/Rhythm Rage.sh index 0645465..eba00cb 100644 --- a/.install/Rhythm Rage.sh +++ b/.install/Rhythm Rage.sh @@ -2,6 +2,5 @@ export winVer="win7" download "http://oriolgomez.com/games/rr_en.zip" "${nvdaControllerClientDll}" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/rhythm rage" "${cache}/rr_en.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/rhythm rage" "${cache}/rr_en.zip" add_launcher "c:\Program Files\rhythm rage\game.exe" diff --git a/.install/Road to Rage Offline.sh b/.install/Road to Rage Offline.sh index 783432a..ac06de5 100644 --- a/.install/Road to Rage Offline.sh +++ b/.install/Road to Rage Offline.sh @@ -1,6 +1,5 @@ export winVer="win7" download "https://agarchive.net/games/talon/the%20road%20to%20rage%20offline.7z" install_wine_bottle speechsdk -7z x -o"$WINEPREFIX/drive_c/Program Files" "${cache}/the road to rage offline.7z" -find "${WINEPREFIX}" -type f -name "nvdaControllerClient.dll" -exec rm -fv "{}" \; +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files" "${cache}/the road to rage offline.7z" add_launcher "c:\Program Files\RTR Offline\rtr.exe" diff --git a/.install/Road to Rage.sh b/.install/Road to Rage.sh index 130aeea..a441cb4 100644 --- a/.install/Road to Rage.sh +++ b/.install/Road to Rage.sh @@ -2,5 +2,5 @@ export WINEARCH=win64 export winVer="win7" download "https://iamtalon.me/games/rtr_ultimate.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/rtr_ultimate.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/rtr_ultimate.zip" add_launcher "c:\Program Files\rtr_Ultimate\trtr.exe" diff --git a/.install/Run For Your Life.sh b/.install/Run For Your Life.sh index fa5cbd9..65724d4 100644 --- a/.install/Run For Your Life.sh +++ b/.install/Run For Your Life.sh @@ -2,5 +2,5 @@ export winVer="win7" download "http://oriolgomez.com/games/rfyl_en.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/run for your life" "${cache}/rfyl_en.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/run for your life" "${cache}/rfyl_en.zip" add_launcher "c:\Program Files\run for your life\game.exe" diff --git a/.install/Sammy Center.sh b/.install/Sammy Center.sh index ab3bcd0..72024dd 100644 --- a/.install/Sammy Center.sh +++ b/.install/Sammy Center.sh @@ -3,5 +3,4 @@ export winVer="win7" download "http://www.samtupy.com/games/SCSetup.exe" "${nvdaControllerClientDll}" install_wine_bottle speechsdk wine "${cache}/SCSetup.exe" /silent -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; add_launcher "c:\Program Files\Sam Tupy\SammyCenter\SammyCenter.exe" diff --git a/.install/Scramble!.sh b/.install/Scramble!.sh index 1e5533a..899af8a 100644 --- a/.install/Scramble!.sh +++ b/.install/Scramble!.sh @@ -1,9 +1,7 @@ winetricksSettings="vd=1024x768" export winVer="win7" -download "https://stevend.net/downloads/scramble_win32.zip" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/scramble_win32.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvda2speechd32.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/scramble_win32.zip" echo "Note: When you first start the game, it will say that tts initialization failed. Please answer that you do not want to attempt initialization of tts when the game starts to allow easy speech through speech dispatcher." alert add_launcher "c:\Program Files\scramble_win32\scramble.exe" diff --git a/.install/Screaming Strike 2.sh b/.install/Screaming Strike 2.sh index 969b845..52ab146 100644 --- a/.install/Screaming Strike 2.sh +++ b/.install/Screaming Strike 2.sh @@ -5,5 +5,4 @@ install_wine_bottle fakejapanese speechsdk wine "${cache}/screamingStrike2.exe" & xdotool sleep 10 key Return ${wine}server -w -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; add_launcher "c:\nyanchangame\Screaming Strike 2\play.exe" diff --git a/.install/Scrolling Battles.sh b/.install/Scrolling Battles.sh index 36ef1f3..85a1ab4 100644 --- a/.install/Scrolling Battles.sh +++ b/.install/Scrolling Battles.sh @@ -3,6 +3,6 @@ export winVer="win7" get_installer "sbrw-win.zip" "https://masonasons.itch.io/sbrw" download "https://stormgames.wolfe.casa/downloads/Tolk.dll" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/sbrw" "${cache}/sbrw-win.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/sbrw" "${cache}/sbrw-win.zip" find "${WINEPREFIX}" -type f -name 'Tolk.dll' -exec cp -v "${cache}/Tolk.dll" "{}" \; add_launcher "c:\Program Files\sbrw\sb.exe" diff --git a/.install/Sequence Storm.sh b/.install/Sequence Storm.sh index 08e74c2..18b2454 100644 --- a/.install/Sequence Storm.sh +++ b/.install/Sequence Storm.sh @@ -2,7 +2,7 @@ get_installer "sequence-storm-win64.zip" "https://special-magic-games-llc.itch.i export WINEARCH=win64 export winVer="win10" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/sequence-storm" "${cache}/sequence-storm-win64.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/sequence-storm" "${cache}/sequence-storm-win64.zip" write_sequence_storm_reader curl -L --output "$WINEPREFIX/drive_c/Program Files/sequence-storm/settings.json" "https://stormgames.wolfe.casa/downloads/sequencestorm-settings.json" add_launcher "c:\Program Files\sequence-storm\SequenceStorm.exe" diff --git a/.install/Shooter.sh b/.install/Shooter.sh index 691dc73..72802be 100644 --- a/.install/Shooter.sh +++ b/.install/Shooter.sh @@ -1,8 +1,6 @@ export WINEARCH=win64 export winVer="win7" get_installer "shooter-win.zip" "https://brynify.itch.io/shooter" -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/shooter" "${cache}/shooter-win.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/shooter" "${cache}/shooter-win.zip" add_launcher "c:\Program Files\shooter\shooter.exe" diff --git a/.install/Side Party.sh b/.install/Side Party.sh index 52036f8..7c861e9 100644 --- a/.install/Side Party.sh +++ b/.install/Side Party.sh @@ -4,11 +4,9 @@ source "${0%/*}/../.includes/dialog-interface.sh" export WINEARCH=win64 export winVer="win7" get_installer "sideparty-win.zip" "https://masonasons.itch.io/sideparty" -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" \ "https://stormgames.wolfe.casa/downloads/SidePartySettings.dat" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/Side Party" "${cache}/sideparty-win.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Side Party" "${cache}/sideparty-win.zip" add_launcher "c:\Program Files\Side Party\SideParty.exe" alert sidePartyUser="$(agm_inputbox "Side Party Installation" "Side Party Installation" "Please enter a user name for Side Party score board:" "")" diff --git a/.install/Simple Fighter.sh b/.install/Simple Fighter.sh index 1f08087..c9f6faa 100644 --- a/.install/Simple Fighter.sh +++ b/.install/Simple Fighter.sh @@ -6,7 +6,6 @@ if [[ ! -r "${cache}/simple-fighter-sounds.7z" ]] && [[ ! -r "${cache}/sounds.7z mv "${cache}/sounds.7z" "${cache}/simple-fighter-sounds.7z" fi install_wine_bottle -7z x -o"$WINEPREFIX/drive_c/Program Files/simple fighter" "${cache}/simple fighter.exe" -7z x -o"$WINEPREFIX/drive_c/Program Files/simple fighter/sounds" "${cache}/simple-fighter-sounds.7z" -find "${WINEPREFIX}/drive_c/Program Files/bf" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/simple fighter" "${cache}/simple fighter.exe" +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/simple fighter/sounds" "${cache}/simple-fighter-sounds.7z" add_launcher "c:\Program Files\simple fighter\game.exe" diff --git a/.install/Skateboarder Pro.sh b/.install/Skateboarder Pro.sh index e926253..41e4080 100644 --- a/.install/Skateboarder Pro.sh +++ b/.install/Skateboarder Pro.sh @@ -1,8 +1,6 @@ -download "https://tunmi13.com/projects/sb_pro_rw.zip" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" # No custom bottle - use standard wine64 path install_wine_bottle sapi -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/sb_pro_rw.zip" -find "${WINEPREFIX}/drive_c/Program Files/sb_pro_rw" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting Skateboarder Pro..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/sb_pro_rw.zip" add_launcher "c:\Program Files\sb_pro_rw\sb_pro.exe" diff --git a/.install/Sketchbook.sh b/.install/Sketchbook.sh index e5bf662..8d7b7cd 100644 --- a/.install/Sketchbook.sh +++ b/.install/Sketchbook.sh @@ -2,7 +2,6 @@ export winVer="win7" download "http://sbyw.games/SBYW/SBYW.zip" "http://sbyw.games/SBYW/sounds.zip" "${nvdaControllerClientDll}" install_wine_bottle speechsdk mv -v "${cache}/sounds.zip" "${cache}/SBYW-sounds.zip" -unzip -d "$WINEPREFIX/drive_c/Program Files/sketchbook" "${cache}/SBYW.zip" -unzip -d "$WINEPREFIX/drive_c/Program Files/sketchbook" "${cache}/SBYW-sounds.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/sketchbook" "${cache}/SBYW.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/sketchbook" "${cache}/SBYW-sounds.zip" add_launcher "c:\Program Files\sketchbook\SBYW.exe" diff --git a/.install/Slender Lost Vision.sh b/.install/Slender Lost Vision.sh index 2b4fcd5..51b72f3 100644 --- a/.install/Slender Lost Vision.sh +++ b/.install/Slender Lost Vision.sh @@ -1,23 +1,19 @@ export winVer="win7" download "https://www.iamtalon.me/games/slender.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/slender.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/slender.zip" add_launcher "c:\Program Files\slender\slender.exe" "Shooter") export WINEARCH=win64 export winVer="win7" get_installer "shooter-win.zip" "https://brynify.itch.io/shooter" -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/shooter" "${cache}/shooter-win.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/shooter" "${cache}/shooter-win.zip" add_launcher "c:\Program Files\shooter\shooter.exe" "Skateboarder Pro") -download "https://tunmi13.com/projects/sb_pro_rw.zip" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" # Uses standard wine path based on architecture (win32/win64) install_wine_bottle sapi -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/sb_pro_rw.zip" -find "${WINEPREFIX}/drive_c/Program Files/sb_pro_rw" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/sb_pro_rw.zip" add_launcher "c:\Program Files\sb_pro_rw\sb_pro.exe" diff --git a/.install/Smashathon.sh b/.install/Smashathon.sh index 3048b6c..fa97345 100644 --- a/.install/Smashathon.sh +++ b/.install/Smashathon.sh @@ -1,5 +1,5 @@ # Uses standard wine path based on architecture (win32/win64) download "https://agarchive.net/games/lworks/Smashathon0.02.zip" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files" "$cache/Smashathon0.02.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "$cache/Smashathon0.02.zip" add_launcher 'c:\Program Files\Smashathon0.02\smashathon.exe' diff --git a/.install/Sonic Zoom.sh b/.install/Sonic Zoom.sh index e78f2cc..d853b2a 100644 --- a/.install/Sonic Zoom.sh +++ b/.install/Sonic Zoom.sh @@ -1,15 +1,14 @@ export winVer="win7" download "http://wwwx.cs.unc.edu/Research/assist/et/projects/SonicZoom/soniczoom11.zip" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/soniczoom11.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/soniczoom11.zip" add_launcher "c:\Program Files\Sonic Zoom\SonicZoom.exe" "Space Defender") export WINEARCH="win64" export winVer="win7" download "http://tunmi13.ddns.net/projects/space_defender.zip" "https://stormgames.wolfe.casa/downloads/nvdaControllerClient64.dll" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/space_defender.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvdaControllerClient64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/space_defender.zip" add_launcher "c:\Program Files\space_defender\sdefender.exe" "Star Treck Final Conflict") download "https://agarchive.net/games/USA/star%20trek%20final%20conflict%20Setup.exe" diff --git a/.install/Sonic the Hedgehog.sh b/.install/Sonic the Hedgehog.sh index 5c041aa..3beb8c8 100644 --- a/.install/Sonic the Hedgehog.sh +++ b/.install/Sonic the Hedgehog.sh @@ -1,5 +1,5 @@ export winVer="win7" download "https://www.agarchive.net/games/jeqoconGames/sonic%20the%20hedgehog.7z" install_wine_bottle speechsdk -7z x -o"$WINEPREFIX/drive_c/Program Files/Sonic the Hedgehog" "${cache}/sonic the hedgehog.7z" +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Sonic the Hedgehog" "${cache}/sonic the hedgehog.7z" add_launcher "c:\Program Files\Sonic the Hedgehog\sth.exe" diff --git a/.install/Super Deekout.sh b/.install/Super Deekout.sh index dd5b1f8..8a1c46c 100644 --- a/.install/Super Deekout.sh +++ b/.install/Super Deekout.sh @@ -13,7 +13,7 @@ xdotool key --delay 250 alt+i 2> /dev/null xdotool sleep 15 key --delay 250 alt+f 2> /dev/null xdotool sleep 3 key --delay 250 n 2> /dev/null ${wine}server -k -7z x -y -o"$WINEPREFIX/drive_c/Program Files/Super Deekout" "${cache}/sd_full.exe" +install_with_progress 7z "Extracting game files..." x -y -o"$WINEPREFIX/drive_c/Program Files/Super Deekout" "${cache}/sd_full.exe" echo "Super Deekout needs some information before it will run:" alert read -erp "Please enter your first name: " fname diff --git a/.install/Super Mario Bros.sh b/.install/Super Mario Bros.sh index baccca8..413a275 100644 --- a/.install/Super Mario Bros.sh +++ b/.install/Super Mario Bros.sh @@ -1,5 +1,5 @@ export winVer="win7" download "https://www.agarchive.net/games/jeqoconGames/super%20mario%20bros.7z" install_wine_bottle speechsdk -7z x -o"$WINEPREFIX/drive_c/Program Files/Super Mario Bros" "${cache}/super mario bros.7z" +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Super Mario Bros" "${cache}/super mario bros.7z" add_launcher "c:\Program Files\Super Mario Bros\Mario.exe" diff --git a/.install/Swamp.sh b/.install/Swamp.sh index ca5e96c..4c43942 100644 --- a/.install/Swamp.sh +++ b/.install/Swamp.sh @@ -8,7 +8,7 @@ agm_yesno "Swamp Installation" "Swamp Installation" "If you do not have a full 3 deleteMusic=$? download "https://www.kaldobsky.com/audiogames/Swamp.zip" install_wine_bottle dx8vb quartz corefonts vb6run speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/Swamp.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/Swamp.zip" # make sure the latest version is installed. if curl -L --output "${cache}/SwampPatch.zip" "https://www.kaldobsky.com/audiogames/SwampPatch.zip" ; then unzip -o -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/SwampPatch.zip" diff --git a/.install/Tactical Battle.sh b/.install/Tactical Battle.sh index 14290ba..53fb68c 100644 --- a/.install/Tactical Battle.sh +++ b/.install/Tactical Battle.sh @@ -2,5 +2,5 @@ download "https://blindgamers.com/downloads/Tactical%20Battle%20Dev.zip" install_wine_bottle speechsdk LC_ALL=C DISPLAY="" winetricks -q dotnet462 ${wine}server -k -unzip -d "$WINEPREFIX/drive_c/Program Files/Tactical Battle" "${cache}/Tactical Battle Dev.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Tactical Battle" "${cache}/Tactical Battle Dev.zip" add_launcher "c:\Program Files\Tactical Battle\Tactical Battle.exe" diff --git a/.install/Tarot Assistant.sh b/.install/Tarot Assistant.sh index 12637f7..e19a5f4 100644 --- a/.install/Tarot Assistant.sh +++ b/.install/Tarot Assistant.sh @@ -2,6 +2,6 @@ export winVer="win7" download "https://www.kaldobsky.com/audiogames/tarot.zip" install_wine_bottle vb6run dx8vb speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/Tarot Assistant" "${cache}/tarot.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Tarot Assistant" "${cache}/tarot.zip" wine "c:\Program Files\Tarot Assistant\Checkup.exe" /verysilent add_launcher "c:\Program Files\Tarot Assistant\TarotAssistant.exe" diff --git a/.install/Technoshock.sh b/.install/Technoshock.sh index 0b239c3..f9fcfe7 100644 --- a/.install/Technoshock.sh +++ b/.install/Technoshock.sh @@ -1,7 +1,7 @@ download "http://tiflocomp.ru/download/games/technoshock_140b_en.zip" "http://tiflocomp.ru/download/games/technoshock140b_en_update.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/technoshock_140b_en.zip" -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/technoshock_140b_en_update.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/technoshock_140b_en.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/technoshock_140b_en_update.zip" wine "$WINEPREFIX/drive_c/Program Files/setup_eng.exe" /silent ${wine}server -w wine "$WINEPREFIX/drive_c/Program Files/setup_eng_update_pack.exe" /silent diff --git a/.install/The Blind Swordsman.sh b/.install/The Blind Swordsman.sh index a6fc2bc..bb9d720 100644 --- a/.install/The Blind Swordsman.sh +++ b/.install/The Blind Swordsman.sh @@ -1,4 +1,4 @@ download "https://www.agarchive.net/games/other/the%20blind%20swordsmanPC.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/the blind swordsmanPC.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/the blind swordsmanPC.zip" add_launcher "c:\Program Files\TheBlindSwordsman.exe" diff --git a/.install/The Great Toy Robbery.sh b/.install/The Great Toy Robbery.sh index d8b56f2..1aa381e 100644 --- a/.install/The Great Toy Robbery.sh +++ b/.install/The Great Toy Robbery.sh @@ -1,7 +1,5 @@ # Uses standard wine path based on architecture (win32/win64) export winVer="win7" -download "http://files.l-works.net/tgtrsetup_2.04.exe" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" install_wine_bottle dsound directmusic wine "${cache}/tgtrsetup_2.04.exe" /silent -find "${WINEPREFIX}/drive_c/Program Files/Lworks/The Great Toy Robbery" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvda2speechd32.dll" "{}" \; add_launcher "c:\Program Files\Lworks\The Great Toy Robbery\tgtr.exe" diff --git a/.install/The Vale.sh b/.install/The Vale.sh index 212707c..039379a 100644 --- a/.install/The Vale.sh +++ b/.install/The Vale.sh @@ -2,7 +2,7 @@ get_installer "the-vale-win.zip" "https://falling-squirrel.itch.io/the-vale" export WINEARCH=win64 export winVer="win8" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/the-vale" "${cache}/the-vale-win.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/the-vale" "${cache}/the-vale-win.zip" # Weird work around to get keyboard working. winetricks -q usetakefocus=y winetricks -q usetakefocus=n diff --git a/.install/They'll Come from the Moon.sh b/.install/They'll Come from the Moon.sh index c339615..1fc466d 100644 --- a/.install/They'll Come from the Moon.sh +++ b/.install/They'll Come from the Moon.sh @@ -1,13 +1,11 @@ get_installer "theyll-come-from-the-moon-windows.zip" "https://soundrascal.itch.io/theyll-come-from-the-moon" -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/tcftm" "${cache}/theyll-come-from-the-moon-windows.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/tcftm" "${cache}/theyll-come-from-the-moon-windows.zip" # Weird work around to get keyboard working. winetricks -q usetakefocus=y winetricks -q usetakefocus=n -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; add_launcher "c:\Program Files\tcftm\They'll Come from the Moon!.exe" echo "When the game launches, press the enter key to load the game which will begin to speak." alert diff --git a/.install/Thief.sh b/.install/Thief.sh index 1ced42a..c85bec1 100644 --- a/.install/Thief.sh +++ b/.install/Thief.sh @@ -2,5 +2,5 @@ export winVer="win7" download "http://oriolgomez.com/games/thief_en.zip" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/thief" "${cache}/thief_en.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/thief" "${cache}/thief_en.zip" add_launcher "c:\Program Files\thief\game.exe" diff --git a/.install/Three D velocity.sh b/.install/Three D velocity.sh index 6a33f34..ba493e7 100644 --- a/.install/Three D velocity.sh +++ b/.install/Three D velocity.sh @@ -1,12 +1,9 @@ export winVer="win10" export WINEARCH=win64 export norh=false # Must install a voice, and rhvoice works easily with 64 bit. -download "https://github.com/munawarb/Three-D-Velocity-Binaries/archive/master.zip" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" install_wine_bottle sapi vcrun2008 gdiplus xact dotnet48 xna40 # Dotnet is evil. That is all. # LC_ALL=C winetricks -q dotnet48 # ${wine}server -k # Ha ha ha. -unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/master.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvda2speechd32.dll" "{}" \; -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/master.zip" add_launcher "c:\Program Files\Three-D-Velocity-Binaries-master\tdv.exe" diff --git a/.install/Tomb Hunter.sh b/.install/Tomb Hunter.sh index f36e363..4826c5d 100644 --- a/.install/Tomb Hunter.sh +++ b/.install/Tomb Hunter.sh @@ -1,5 +1,4 @@ download "http://masonasons.me/softs/th_freeware_password_is_tombhunter.7z" install_wine_bottle speechsdk -7z x -o"$WINEPREFIX/drive_c/Program Files/Tomb Hunter" "${cache}/th_freeware_password_is_tombhunter.7z" -ptombhunter -find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Tomb Hunter" "${cache}/th_freeware_password_is_tombhunter.7z" -ptombhunter add_launcher "c:\Program Files\Tomb Hunter\th.exe" diff --git a/.install/Toy Mania.sh b/.install/Toy Mania.sh index 98cf068..623d1b9 100644 --- a/.install/Toy Mania.sh +++ b/.install/Toy Mania.sh @@ -2,6 +2,5 @@ export WINEARCH=win64 export winVer="win7" get_installer "ToyMania_windows_portable_password_is_GrateCollector.7z" "https://tsatria03.itch.io/toymania" install_wine_bottle -7z x -o"$WINEPREFIX/drive_c/Program Files/ToyMania" "${cache}/ToyMania_windows_portable_password_is_GrateCollector.7z" -pGrateCollector -find "${WINEPREFIX}/drive_c/Program Files/ToyMania" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/ToyMania" "${cache}/ToyMania_windows_portable_password_is_GrateCollector.7z" -pGrateCollector add_launcher "c:\Program Files\ToyMania\tm.exe" diff --git a/.install/Triple Triad.sh b/.install/Triple Triad.sh index d0658ab..9fc3a6a 100644 --- a/.install/Triple Triad.sh +++ b/.install/Triple Triad.sh @@ -2,6 +2,6 @@ export winVer="win7" download "https://www.kaldobsky.com/audiogames/tripletriad.zip" install_wine_bottle vb6run dx8vb speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/Triple Triad" "${cache}/tripletriad.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Triple Triad" "${cache}/tripletriad.zip" wine "c:\Program Files\Triple Triad\Checkup.exe" /verysilent add_launcher "c:\Program Files\Triple Triad\TripleTriad.exe" diff --git a/.install/Troopanum2.sh b/.install/Troopanum2.sh index 07db0e3..262dce8 100644 --- a/.install/Troopanum2.sh +++ b/.install/Troopanum2.sh @@ -7,7 +7,7 @@ wine "${cache}/Troopanum2Setup.exe" /silent & xdotool sleep 10 key --clearmodifiers alt+y 2> /dev/null sleep 30 && ${wine}server -k # Sometimes the installer finishes but the ${wine}server has more processes that don't exit, so we can't depend on ${wine}server -w. mkdir -p "$WINEPREFIX/drive_c/Program Files/bsc-key-generator" -7z x -o"$WINEPREFIX/drive_c/Program Files/bsc-key-generator" "${cache}/BSC unlock code generator.7z" +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/bsc-key-generator" "${cache}/BSC unlock code generator.7z" echo "$USER"$'\n'"$(hostname)"$'\n'"none"$'\n'"US" > "$WINEPREFIX/drive_c/Program Files/Troopanum 2.0/config.dat" unix2dos "$WINEPREFIX/drive_c/Program Files/Troopanum 2.0/config.dat" if command -v xclip &> /dev/null && command -v xdotool &> /dev/null ; then diff --git a/.install/Undead Assault.sh b/.install/Undead Assault.sh index f479af0..3025d50 100644 --- a/.install/Undead Assault.sh +++ b/.install/Undead Assault.sh @@ -1,6 +1,5 @@ export winVer="win7" download "http://undead-assault.com/static/files/public/undead_assault.zip" "${nvdaControllerClientDll}" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/undead_assault" "${cache}/undead_assault.zip" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/undead_assault" "${cache}/undead_assault.zip" add_launcher "c:\Program Files\undead_assault\Undead Assault.exe" diff --git a/.install/VIP Mud.sh b/.install/VIP Mud.sh index 380a7a0..27385c9 100644 --- a/.install/VIP Mud.sh +++ b/.install/VIP Mud.sh @@ -1,10 +1,7 @@ -download "http://gmagames.com/vipmud20016.exe" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" export winVer="win7" install_wine_bottle vb6run dx8vb speechsdk wine "${cache}/vipmud20016.exe" /silent mkdir -p "${HOME}/.local/wine/vip-mud/drive_c/users/${USER}/Documents/VIP Mud" -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient.dll' -exec cp -v "${cache}/nvda2speechd32.dll" "{}" \; -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvda2speechd32.dll" "{}" \; add_launcher "c:\Program Files\VIPMud 2.0\vipmud2.exe" echo echo "When you first launch VIP Mud You will be presented with several inaccessible dialogs." diff --git a/.install/Villains From Beyond.sh b/.install/Villains From Beyond.sh index ebe6043..2cdc4c7 100644 --- a/.install/Villains From Beyond.sh +++ b/.install/Villains From Beyond.sh @@ -2,6 +2,5 @@ export winVer="win7" download "${ipfsGateway}/ipfs/QmWx271xuk3Mv9XTBoVu5BDJvXFZdasawC2nhtV21WAaUU?filename=villains_en.zip" install_wine_bottle speechsdk -unzip -d "$WINEPREFIX/drive_c/Program Files/villains from beyond" "${cache}/villains_en.zip" -find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/villains from beyond" "${cache}/villains_en.zip" add_launcher "c:\Program Files\villains from beyond\game.exe" diff --git a/.install/Warsim.sh b/.install/Warsim.sh index 2fd7957..26cd8ba 100644 --- a/.install/Warsim.sh +++ b/.install/Warsim.sh @@ -2,5 +2,5 @@ get_installer "Warsim Full Game.zip" "https://huw2k8.itch.io/warsim" export WINEARCH=win64 export winVer="win7" install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/Warsim/" "${cache}/Warsim Full Game.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Warsim/" "${cache}/Warsim Full Game.zip" add_launcher "c:\Program Files\Warsim\Warsim.exe" diff --git a/.install/Wave of the Undead.sh b/.install/Wave of the Undead.sh index cedfc3b..d31b696 100644 --- a/.install/Wave of the Undead.sh +++ b/.install/Wave of the Undead.sh @@ -1,6 +1,5 @@ export WINEARCH=win64 export winVer="win7" -download "https://dl.dropbox.com/scl/fi/ukvou0y4gwg21nhhdpj40/Wave-of-the-Undead-Setup.exe?rlkey=4xnuwicpmbkx6w2jo2i56mijg" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" install_wine_bottle wine "${cache}/Wave-of-the-Undead-Setup.exe" & xdotool sleep 20 key Alt+n sleep 2 key Alt+n sleep 2 key Alt+n @@ -9,5 +8,4 @@ wine "${cache}/Wave-of-the-Undead-Setup.exe" & xdotool sleep 2 key space xdotool sleep 2 key Alt+f ${wine}server -w -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; add_launcher "c:\Program Files (x86)\Wave Of The Undead\wave_of_the_undead.exe" diff --git a/.install/World of War.sh b/.install/World of War.sh index 45d1fe5..0004f6b 100644 --- a/.install/World of War.sh +++ b/.install/World of War.sh @@ -2,5 +2,5 @@ export winVer="win7" download "https://www.agarchive.net/games/nyanchan/world%20of%20war%20English.7z" install_wine_bottle -7z x -o"$WINEPREFIX/drive_c/nyanchangame" "${cache}/world of war English.7z" +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame" "${cache}/world of war English.7z" add_launcher "c:\nyanchangame\world of war English\world of war.exe" diff --git a/.install/haunted Party.sh b/.install/haunted Party.sh index e0fd811..e5c08ca 100644 --- a/.install/haunted Party.sh +++ b/.install/haunted Party.sh @@ -1,9 +1,7 @@ get_installer "hp.zip" "https://tunmi13.itch.io/haunted-party" -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" export WINEARCH=win64 export winVer="win8" # Uses standard wine path based on architecture (win32/win64) install_wine_bottle -unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/hp.zip" -find "${WINEPREFIX}/drive_c/Program Files/hp" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/hp.zip" add_launcher "c:\Program Files\hp\hp.exe" diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 77d7775..6929297 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -33,7 +33,7 @@ game_installer() { done # If all games are installed, exit if [[ ${#menuList[@]} -eq 0 ]]; then - echo "All games are already installed." + agm_msgbox "Audio Game Installer" "" "All games are already installed." exit 0 fi menuList+=("Donate" "Donate") @@ -74,7 +74,7 @@ game_removal() { # Modern wine is unified - no architecture-specific wine executables needed mapfile -t lines < <(sed -e '/^$/d' -e '/^[[:space:]]*#/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then - echo "No games found." + agm_msgbox "Audio Game Removal" "" "No games found." exit 0 fi # Create the menu of installed games @@ -112,7 +112,7 @@ game_removal() { get_bottle "${game[0]}" if ! agm_yesno "Confirm Removal" "Audio Game Removal" "Are you sure you want to remove \"${game[2]}\"?"; then - echo "Removal cancelled." + agm_msgbox "Audio Game Removal" "" "Removal cancelled." exit 0 fi @@ -142,7 +142,7 @@ kill_game() { # Modern wine is unified - no architecture-specific wine executables needed mapfile -t lines < <(sed '/^$/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then - echo "No games found." + agm_msgbox "Audio Game Killer" "" "No games found." exit 0 fi # Create the menu of installed games @@ -171,7 +171,7 @@ kill_game() { # kill the wine server. get_bottle "${game%|*}" wineserver -k - echo "The selected game has been stopped." + agm_msgbox "Audio Game Killer" "" "The selected game has been stopped." fi exit 0 } @@ -338,7 +338,7 @@ game_launcher() { update_nvda_dlls mapfile -t lines < <(sed -e '/^$/d' -e '/^ *#/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then - echo "Install some games first." + agm_msgbox "Audio Game Launcher" "" "Install some games first." exit 0 fi if [[ $# -eq 0 ]]; then @@ -369,7 +369,7 @@ game_launcher() { else create_game_array "$game" if [[ -z "$game" ]]; then - echo "Game $1 not found." + agm_msgbox "Audio Game Launcher" "" "Game $1 not found." exit 1 fi fi @@ -558,6 +558,6 @@ if [[ -f ".install/${game}.sh" ]]; then export LANG="en_US.UTF-8" . ".install/${game}.sh" else - echo "Error: Game '${game}' not found in .install directory" + agm_msgbox "Audio Game Installer" "" "Error: Game '${game}' not found in .install directory" exit 1 fi From 8e24b7372086f37c01a088e9fba3c8c1cbce1529 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 03:29:50 -0400 Subject: [PATCH 24/77] Fixed some game installers that got broken in the massive update for progress bars. --- .install/Bokurano Daibouken 3.sh | 3 +-- .install/Constant Motion.sh | 1 + .install/Crazy Party.sh | 1 + .install/Crime Hunter.sh | 1 + .install/Executioner's Rage.sh | 1 + .install/Laser Breakout.sh | 1 + .install/Light Battles.sh | 1 + .install/Oh Shit.sh | 1 + .install/Scramble!.sh | 1 + .install/Skateboarder Pro.sh | 1 + .install/Three D velocity.sh | 1 + 11 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.install/Bokurano Daibouken 3.sh b/.install/Bokurano Daibouken 3.sh index 669ce58..68c68c4 100644 --- a/.install/Bokurano Daibouken 3.sh +++ b/.install/Bokurano Daibouken 3.sh @@ -14,10 +14,9 @@ done if [[ "${#dictFile}" -ge 3 ]] && [[ ! -r "${cache}/bk3-dict.dat" ]]; then agm_yesno "Bokurano Daibouken 3" "Bokurano Daibouken 3" "Possible English translation file found at $dictFile. Would you like to use it for BK3?" && cp -v "$dictFile" "${cache}/bk3-dict.dat" fi +download "https://www.nyanchangames.com/softs/nn3_setup.exe" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle -cp "${cache}/nvda2speechd" "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" -chmod +x "${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd" install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/bk3" "${cache}/nn3_setup.exe" add_launcher "c:\nyanchangame\bk3\play.exe" diff --git a/.install/Constant Motion.sh b/.install/Constant Motion.sh index bd572b3..f8e39ad 100644 --- a/.install/Constant Motion.sh +++ b/.install/Constant Motion.sh @@ -1,5 +1,6 @@ export WINEARCH=win64 export winVer="win7" +download "https://samtupy.com/games/cm.zip" install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/ConstantMotion" "$cache/cm.zip" add_launcher 'c:\Program Files\ConstantMotion\cm.exe' diff --git a/.install/Crazy Party.sh b/.install/Crazy Party.sh index 001b629..94ab870 100644 --- a/.install/Crazy Party.sh +++ b/.install/Crazy Party.sh @@ -1,3 +1,4 @@ +download "http://pragmapragma.free.fr/crazy-party/Crazy-Party-beta82.zip" "https://stormgames.wolfe.casa/downloads/Tolk.dll" export WINEARCH=win64 export winVer="win8" install_wine_bottle diff --git a/.install/Crime Hunter.sh b/.install/Crime Hunter.sh index 255c1f2..9de71d2 100644 --- a/.install/Crime Hunter.sh +++ b/.install/Crime Hunter.sh @@ -1,5 +1,6 @@ export WINEARCH=win64 export winVer="win7" +download "http://masonasons.me/softs/CH2.0Win.zip" install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/crime-hunter" "${cache}/CH2.0Win.zip" add_launcher "c:\Program Files\crime-hunter\ch.exe" diff --git a/.install/Executioner's Rage.sh b/.install/Executioner's Rage.sh index 0aabd61..5fec7af 100644 --- a/.install/Executioner's Rage.sh +++ b/.install/Executioner's Rage.sh @@ -1,3 +1,4 @@ +download "https://dl.tweesecake.app/rage/rage1.5.0.zip" export WINEARCH=win64 export winVer="win10" install_wine_bottle diff --git a/.install/Laser Breakout.sh b/.install/Laser Breakout.sh index 161ccc0..0df9c46 100644 --- a/.install/Laser Breakout.sh +++ b/.install/Laser Breakout.sh @@ -1,6 +1,7 @@ # Currently only speaks in japanese, looking to see if we can find an english version. # Uses standard wine path based on architecture (win32/win64) export winVer="win7" +download "https://www.agarchive.net/games/nyanchan/laser%20breakout.7z" "https://stormgames.wolfe.casa/downloads/laser-breakout-options.dat" install_wine_bottle install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/" "$cache/laser breakout.7z" cp -v "$cache/laser-breakout-options.dat" "$WINEPREFIX/drive_c/nyanchangame/laser breakout/options.dat" diff --git a/.install/Light Battles.sh b/.install/Light Battles.sh index 77e077b..3608feb 100644 --- a/.install/Light Battles.sh +++ b/.install/Light Battles.sh @@ -1,4 +1,5 @@ export winVer="win7" +download "https://prometheus-enterprises.com/games/CoL.exe" install_wine_bottle install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Light Battles" "${cache}/CoL.exe" add_launcher "c:\Program Files\Light Battles\battles.exe" diff --git a/.install/Oh Shit.sh b/.install/Oh Shit.sh index 97b9373..62aa2d5 100644 --- a/.install/Oh Shit.sh +++ b/.install/Oh Shit.sh @@ -1,5 +1,6 @@ export winVer="win7" export norh="true" # Requires sapi even though uses nvda +download "${ipfsGateway}/ipfs/QmQnAJJrt5uABFziQc7enXYrJ74J9GKQSMi8Ry8ebsxfPV?filename=OhShit.zip" install_wine_bottle speechsdk install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/OhShit.zip" add_launcher "c:\Program Files\oh_shit\OhShit.exe" diff --git a/.install/Scramble!.sh b/.install/Scramble!.sh index 899af8a..f5cfdf2 100644 --- a/.install/Scramble!.sh +++ b/.install/Scramble!.sh @@ -1,5 +1,6 @@ winetricksSettings="vd=1024x768" export winVer="win7" +download "https://stevend.net/downloads/scramble_win32.zip" install_wine_bottle speechsdk install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/scramble_win32.zip" echo "Note: When you first start the game, it will say that tts initialization failed. Please answer that you do not want to attempt initialization of tts when the game starts to allow easy speech through speech dispatcher." diff --git a/.install/Skateboarder Pro.sh b/.install/Skateboarder Pro.sh index 41e4080..6dec0e7 100644 --- a/.install/Skateboarder Pro.sh +++ b/.install/Skateboarder Pro.sh @@ -1,3 +1,4 @@ +download "https://tunmi13.com/projects/sb_pro_rw.zip" export WINEARCH=win64 export winVer="win8" # No custom bottle - use standard wine64 path diff --git a/.install/Three D velocity.sh b/.install/Three D velocity.sh index ba493e7..2842406 100644 --- a/.install/Three D velocity.sh +++ b/.install/Three D velocity.sh @@ -1,6 +1,7 @@ export winVer="win10" export WINEARCH=win64 export norh=false # Must install a voice, and rhvoice works easily with 64 bit. +download "https://github.com/munawarb/Three-D-Velocity-Binaries/archive/master.zip" install_wine_bottle sapi vcrun2008 gdiplus xact dotnet48 xna40 # Dotnet is evil. That is all. # LC_ALL=C winetricks -q dotnet48 From 6317b2098b741acb6acc2a244a1eea7e56c49444 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 03:36:34 -0400 Subject: [PATCH 25/77] Hopefully improve progressbars and update messages with yad. --- .includes/dialog-interface.sh | 55 ++++++++++++++++++++++++++++++++--- .includes/functions.sh | 16 ++++++++-- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index 5721428..d5d9b4d 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -226,20 +226,67 @@ agm_progressbox() { local text="$2" if [[ "$dialogType" == "yad" ]]; then + # More accessible approach: Use a log window instead of pulsating progress + # This shows actual command output which is more informative for screen readers yad --progress \ --title="$title" \ --text="$text" \ - --pulsate \ + --enable-log="Operation Details" \ + --log-expanded \ --auto-close \ - --no-buttons \ - --show-cursor \ - --width=400 + --width=500 \ + --height=300 else dialog --title "$title" \ --progressbox "$text" 20 70 fi } +# Alternative status box for simple operations without meaningful progress +# Usage: agm_statusbox "title" "text" & statusPid=$!; command; kill $statusPid 2>/dev/null +agm_statusbox() { + local title="$1" + local text="$2" + + if [[ "$dialogType" == "yad" ]]; then + # Show a simple status message that screen readers can access + yad --form \ + --title="$title" \ + --field="$text:LBL" \ + --selectable-labels \ + --no-buttons \ + --timeout=0 \ + --width=400 \ + --height=100 + else + # Use infobox for console + dialog --title "$title" \ + --infobox "$text" 5 50 + fi +} + +# Real progress bar with percentage updates (for operations that can report progress) +# Usage: agm_progress_with_percent "title" "text" +# Then send "percentage" or "#status text" to the returned file descriptor +agm_progress_with_percent() { + local title="$1" + local text="$2" + + if [[ "$dialogType" == "yad" ]]; then + # Create a true progress dialog that accepts percentage updates + yad --progress \ + --title="$title" \ + --text="$text" \ + --auto-close \ + --width=400 \ + --height=150 + else + # For dialog, we'll simulate with a gauge + dialog --title "$title" \ + --gauge "$text" 6 50 0 + fi +} + # Wrapper function for file selection # Usage: agm_fselect "title" "backtitle" "default_path" agm_fselect() { diff --git a/.includes/functions.sh b/.includes/functions.sh index 9db7d64..fcfa3e7 100644 --- a/.includes/functions.sh +++ b/.includes/functions.sh @@ -53,9 +53,19 @@ download() { fi # Skip if the item is in cache. [[ -e "${cache}/${dest}" ]] && continue - if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" 2>&1 | agm_progressbox "Audio Game Manager" "Downloading \"$dest\"..."; then - agm_infobox "Audio Game Manager" "Audio Game Manager" "Could not download \"$dest\". Installation cannot continue." - exit 1 + if [[ "$dialogType" == "yad" ]]; then + # Use curl's progress bar with better accessibility for yad + if ! curl -L4 -C - --retry 10 --progress-bar --output "${cache}/${dest}" "${i}" 2>&1 | \ + sed -u 's/.*\r\([0-9]*\)%.*/\1/' | agm_progress_with_percent "Audio Game Manager" "Downloading \"$dest\"..."; then + agm_infobox "Audio Game Manager" "Audio Game Manager" "Could not download \"$dest\". Installation cannot continue." + exit 1 + fi + else + # Use the original method for dialog (console) + if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" 2>&1 | agm_progressbox "Audio Game Manager" "Downloading \"$dest\"..."; then + agm_infobox "Audio Game Manager" "Audio Game Manager" "Could not download \"$dest\". Installation cannot continue." + exit 1 + fi fi local downloadError=1 case "${dest##*.}" in From bb1883ccd78017b36925f111c4dd71d11ea32537 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 03:42:02 -0400 Subject: [PATCH 26/77] More fixes to installer scripts. --- .includes/functions.sh | 9 ++++++--- .install/Alien Outback.sh | 2 +- .install/Balatro.sh | 8 ++++---- .install/Bokurano Daibouken 3.sh | 2 +- .install/Change Reaction.sh | 2 +- .install/Christmas Chaos.sh | 2 +- .install/Crazy Party.sh | 2 +- .install/DynaMan.sh | 2 +- .install/ESP Pinball Classic.sh | 2 +- .install/ESP Pinball Extreme.sh | 2 +- .install/ESP Pinball Party Pack.sh | 2 +- .install/Eurofly.sh | 2 +- .install/Laser Breakout.sh | 2 +- .install/Monkey Business.sh | 2 +- .install/Scrolling Battles.sh | 2 +- .install/Side Party.sh | 2 +- .install/Silver Dollar.sh | 2 +- .install/Swamp.sh | 2 +- .install/Ten Pin Alley.sh | 2 +- .install/Ultimate SounDoku.sh | 2 +- 20 files changed, 28 insertions(+), 25 deletions(-) diff --git a/.includes/functions.sh b/.includes/functions.sh index fcfa3e7..8db8e0d 100644 --- a/.includes/functions.sh +++ b/.includes/functions.sh @@ -194,13 +194,16 @@ install_with_progress() { case "$operation" in "unzip") - unzip "$@" | agm_progressbox "Game Installation" "$message" + # Always overwrite without prompting to prevent invisible terminal prompts + unzip -o "$@" | agm_progressbox "Game Installation" "$message" ;; "7z") - 7z "$@" | agm_progressbox "Game Installation" "$message" + # Always overwrite without prompting for 7z as well + 7z -y "$@" | agm_progressbox "Game Installation" "$message" ;; "cp"|"copy") - cp -v "$@" | agm_progressbox "Game Installation" "$message" + # Always force overwrite to prevent invisible prompts in GUI mode + cp -fv "$@" | agm_progressbox "Game Installation" "$message" ;; "find") find "$@" | agm_progressbox "Game Installation" "$message" diff --git a/.install/Alien Outback.sh b/.install/Alien Outback.sh index 70e0b6f..44e0691 100644 --- a/.install/Alien Outback.sh +++ b/.install/Alien Outback.sh @@ -2,7 +2,7 @@ download "http://download.dracoent.com/Windows/classic/AOSetup.exe" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle vb6run dx8vb speechsdk quartz -cp -v "${cache}/AOSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" +cp -fv "${cache}/AOSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/AOSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/AOSetup.exe" # warning warning warning: Do not change location, or installer will not function. diff --git a/.install/Balatro.sh b/.install/Balatro.sh index e855bba..3318572 100644 --- a/.install/Balatro.sh +++ b/.install/Balatro.sh @@ -8,8 +8,8 @@ pushd "$WINEPREFIX/drive_c/users/$USER/AppData/Roaming/Balatro/Mods" (cat mod_urls.txt ; echo) | while read -r x ; do git clone "$x" done -cp -v BlackHole/bin/*.dll "$WINEPREFIX/drive_c/Program Files/Balatro" -cp -v "$cache/Tolk.dll" "$WINEPREFIX/drive_c/Program Files/Balatro/tolk.dll" -cp -v "$cache/Tolk.dll" BlackHole/bin/tolk.dll -cp -v ../version.dll "$WINEPREFIX/drive_c/Program Files/Balatro" +cp -fv BlackHole/bin/*.dll "$WINEPREFIX/drive_c/Program Files/Balatro" +cp -fv "$cache/Tolk.dll" "$WINEPREFIX/drive_c/Program Files/Balatro/tolk.dll" +cp -fv "$cache/Tolk.dll" BlackHole/bin/tolk.dll +cp -fv ../version.dll "$WINEPREFIX/drive_c/Program Files/Balatro" add_launcher 'c:\Program Files\Balatro\Balatro.exe' 'export WINEDLLOVERRIDES=version=n,b' diff --git a/.install/Bokurano Daibouken 3.sh b/.install/Bokurano Daibouken 3.sh index 68c68c4..cb5edec 100644 --- a/.install/Bokurano Daibouken 3.sh +++ b/.install/Bokurano Daibouken 3.sh @@ -12,7 +12,7 @@ for i in "${HOME}/Downloads/dict.dat" "${HOME}/Desktop/dict.dat" ; do fi done if [[ "${#dictFile}" -ge 3 ]] && [[ ! -r "${cache}/bk3-dict.dat" ]]; then - agm_yesno "Bokurano Daibouken 3" "Bokurano Daibouken 3" "Possible English translation file found at $dictFile. Would you like to use it for BK3?" && cp -v "$dictFile" "${cache}/bk3-dict.dat" + agm_yesno "Bokurano Daibouken 3" "Bokurano Daibouken 3" "Possible English translation file found at $dictFile. Would you like to use it for BK3?" && cp -fv "$dictFile" "${cache}/bk3-dict.dat" fi download "https://www.nyanchangames.com/softs/nn3_setup.exe" # Uses standard wine path based on architecture (win32/win64) diff --git a/.install/Change Reaction.sh b/.install/Change Reaction.sh index 5ae499e..77d9339 100644 --- a/.install/Change Reaction.sh +++ b/.install/Change Reaction.sh @@ -2,7 +2,7 @@ download "https://download.dracoent.com/Windows/ChangeReactionSetup.exe" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" install_wine_bottle vb6run dx8vb speechsdk quartz -cp -v "${cache}/ChangeReactionSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" +cp -fv "${cache}/ChangeReactionSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/ChangeReactionSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/ChangeReactionSetup.exe" # warning warning warning: Do not change location, or installer will not function. diff --git a/.install/Christmas Chaos.sh b/.install/Christmas Chaos.sh index d68c994..e6005a7 100644 --- a/.install/Christmas Chaos.sh +++ b/.install/Christmas Chaos.sh @@ -3,5 +3,5 @@ export winVer="win7" download "${ipfsGateway}/ipfs/QmYx11vsMDBgjPd1coZPGHxMXf2qtf4icqmB3Q9iUazyQv?filename=ChristmasChaos.zip" "https://stormgames.wolfe.casa/downloads/Tolk.dll" install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/ChristmasChaos.zip" -find "${WINEPREFIX}" -type f -name 'Tolk.dll' -exec cp -v "${cache}/Tolk.dll" "{}" \; +find "${WINEPREFIX}" -type f -name 'Tolk.dll' -exec cp -fv "${cache}/Tolk.dll" "{}" \; add_launcher "c:\Program Files\ChristmasChaos\ChristmasChaos.exe" diff --git a/.install/Crazy Party.sh b/.install/Crazy Party.sh index 94ab870..156f6a6 100644 --- a/.install/Crazy Party.sh +++ b/.install/Crazy Party.sh @@ -3,5 +3,5 @@ export WINEARCH=win64 export winVer="win8" install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/Crazy-Party-beta82.zip" -find "${WINEPREFIX}" -type f -name 'Tolk.dll' -exec cp -v "${cache}/Tolk.dll" "{}" \; +find "${WINEPREFIX}" -type f -name 'Tolk.dll' -exec cp -fv "${cache}/Tolk.dll" "{}" \; add_launcher "c:\Program Files\Crazy-Party-beta82\Crazy Party.exe" diff --git a/.install/DynaMan.sh b/.install/DynaMan.sh index ef6e1df..99c588c 100644 --- a/.install/DynaMan.sh +++ b/.install/DynaMan.sh @@ -2,7 +2,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/DMSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz -cp -v "${cache}/DMSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" +cp -fv "${cache}/DMSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/DMSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/DMSetup.exe" # warning warning warning: Do not change location, or installer will not function. diff --git a/.install/ESP Pinball Classic.sh b/.install/ESP Pinball Classic.sh index 5c4f4bb..cde9d11 100644 --- a/.install/ESP Pinball Classic.sh +++ b/.install/ESP Pinball Classic.sh @@ -2,7 +2,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/PBCSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz -cp -v "${cache}/PBCSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" +cp -fv "${cache}/PBCSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/PBCSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/PBCSetup.exe" # warning warning warning: Do not change location, or installer will not function. diff --git a/.install/ESP Pinball Extreme.sh b/.install/ESP Pinball Extreme.sh index 8e290c7..9366a0b 100644 --- a/.install/ESP Pinball Extreme.sh +++ b/.install/ESP Pinball Extreme.sh @@ -2,7 +2,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/PBXSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz -cp -v "${cache}/PBXSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" +cp -fv "${cache}/PBXSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/PBXSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/PBXSetup.exe" # warning warning warning: Do not change location, or installer will not function. diff --git a/.install/ESP Pinball Party Pack.sh b/.install/ESP Pinball Party Pack.sh index 109ba61..a758cc6 100644 --- a/.install/ESP Pinball Party Pack.sh +++ b/.install/ESP Pinball Party Pack.sh @@ -7,7 +7,7 @@ if ! [ -f "$HOME/.local/wine/$bottle/drive_c/Program Files/Draconis Entertainmen exit 1 fi download "http://download.dracoent.com/Windows/classic/PP1Setup.exe" -cp -v "${cache}/PP1Setup.exe" "$WINEPREFIX/drive_c/windows/temp/" +cp -fv "${cache}/PP1Setup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/PP1Setup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/PP1Setup.exe" add_launcher "c:\Program Files\Draconis Entertainment\ESP Pinball Xtreme\pbx.exe" diff --git a/.install/Eurofly.sh b/.install/Eurofly.sh index 6073dcf..418328c 100644 --- a/.install/Eurofly.sh +++ b/.install/Eurofly.sh @@ -4,6 +4,6 @@ export winetricksSettings="vd=1024x768" download "https://www.stefankiss.sk/files/eurofly2/Launcher_1.2.zip" "https://www.stefankiss.sk/files/eurofly2/Eurofly_2_ful_setup.exe" install_wine_bottle speechsdk comctl32 wine "${cache}/Eurofly_2_ful_setup.exe" /silent -install_with_progress unzip "Extracting game files..." -o -d "$WINEPREFIX/drive_c/Eurofly" "${cache}/Launcher_1.2.zip" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Eurofly" "${cache}/Launcher_1.2.zip" add_launcher "c:\Eurofly\launcher.exe" echo "Note: On first and sometimes later launch, Eurofly may take a very long time to download required files, please be patient..." diff --git a/.install/Laser Breakout.sh b/.install/Laser Breakout.sh index 0df9c46..ea843cc 100644 --- a/.install/Laser Breakout.sh +++ b/.install/Laser Breakout.sh @@ -4,5 +4,5 @@ export winVer="win7" download "https://www.agarchive.net/games/nyanchan/laser%20breakout.7z" "https://stormgames.wolfe.casa/downloads/laser-breakout-options.dat" install_wine_bottle install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/" "$cache/laser breakout.7z" -cp -v "$cache/laser-breakout-options.dat" "$WINEPREFIX/drive_c/nyanchangame/laser breakout/options.dat" +cp -fv "$cache/laser-breakout-options.dat" "$WINEPREFIX/drive_c/nyanchangame/laser breakout/options.dat" add_launcher "c:\nyanchangame\laser breakout\play.exe" diff --git a/.install/Monkey Business.sh b/.install/Monkey Business.sh index bba69b6..0cbfa9a 100644 --- a/.install/Monkey Business.sh +++ b/.install/Monkey Business.sh @@ -2,7 +2,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/MBSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz -cp -v "${cache}/MBSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" +cp -fv "${cache}/MBSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/MBSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/MBSetup.exe" # warning warning warning: Do not change location, or installer will not function. diff --git a/.install/Scrolling Battles.sh b/.install/Scrolling Battles.sh index 85a1ab4..fcc5ebb 100644 --- a/.install/Scrolling Battles.sh +++ b/.install/Scrolling Battles.sh @@ -4,5 +4,5 @@ get_installer "sbrw-win.zip" "https://masonasons.itch.io/sbrw" download "https://stormgames.wolfe.casa/downloads/Tolk.dll" install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/sbrw" "${cache}/sbrw-win.zip" -find "${WINEPREFIX}" -type f -name 'Tolk.dll' -exec cp -v "${cache}/Tolk.dll" "{}" \; +find "${WINEPREFIX}" -type f -name 'Tolk.dll' -exec cp -fv "${cache}/Tolk.dll" "{}" \; add_launcher "c:\Program Files\sbrw\sb.exe" diff --git a/.install/Side Party.sh b/.install/Side Party.sh index 7c861e9..a517d72 100644 --- a/.install/Side Party.sh +++ b/.install/Side Party.sh @@ -11,7 +11,7 @@ add_launcher "c:\Program Files\Side Party\SideParty.exe" alert sidePartyUser="$(agm_inputbox "Side Party Installation" "Side Party Installation" "Please enter a user name for Side Party score board:" "")" mkdir -p "$WINEPREFIX/drive_c/Program Files/Side Party/masonasons.me/SideParty" -cp -v "${cache}/SidePartySettings.dat" "$WINEPREFIX/drive_c/Program Files/Side Party/masonasons.me/SideParty/settings.dat" +cp -fv "${cache}/SidePartySettings.dat" "$WINEPREFIX/drive_c/Program Files/Side Party/masonasons.me/SideParty/settings.dat" if [[ ${#sidePartyUser} -gt 3 ]]; then sed -i "s/Anonymous/${sidePartyUser}/" "$WINEPREFIX/drive_c/Program Files/Side Party/masonasons.me/SideParty/settings.dat" fi diff --git a/.install/Silver Dollar.sh b/.install/Silver Dollar.sh index e5e3ce2..2016dd0 100644 --- a/.install/Silver Dollar.sh +++ b/.install/Silver Dollar.sh @@ -2,7 +2,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/SilverDollarSetup.exe" install_wine_bottle speechsdk -cp -v "${cache}/SilverDollarSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" +cp -fv "${cache}/SilverDollarSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/SilverDollarSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/SilverDollarSetup.exe" # warning warning warning: Do not change location, or installer will not function. diff --git a/.install/Swamp.sh b/.install/Swamp.sh index 4c43942..a6567d4 100644 --- a/.install/Swamp.sh +++ b/.install/Swamp.sh @@ -11,7 +11,7 @@ install_wine_bottle dx8vb quartz corefonts vb6run speechsdk install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/Swamp.zip" # make sure the latest version is installed. if curl -L --output "${cache}/SwampPatch.zip" "https://www.kaldobsky.com/audiogames/SwampPatch.zip" ; then - unzip -o -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/SwampPatch.zip" + install_with_progress unzip "Installing Swamp patch..." -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/SwampPatch.zip" fi $wine 'c:\Program Files\swamp\checkup.exe' /verysilent #$wine cmd.exe /c 'cd /d c:\Program Files\swamp && Windows32bit.bat' diff --git a/.install/Ten Pin Alley.sh b/.install/Ten Pin Alley.sh index 799c19c..f61b46e 100644 --- a/.install/Ten Pin Alley.sh +++ b/.install/Ten Pin Alley.sh @@ -2,7 +2,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/TPAXPSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz -cp -v "${cache}/TPAXPSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" +cp -fv "${cache}/TPAXPSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/TPAXPSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/TPAXPSetup.exe" #winetricks -q msdxmocx # I think having this installed first breaks things. diff --git a/.install/Ultimate SounDoku.sh b/.install/Ultimate SounDoku.sh index e69af1c..17d2165 100644 --- a/.install/Ultimate SounDoku.sh +++ b/.install/Ultimate SounDoku.sh @@ -2,7 +2,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/USSetup.exe" install_wine_bottle vb6run dx8vb speechsdk quartz -cp -v "${cache}/USSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" +cp -fv "${cache}/USSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/USSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/USSetup.exe" # warning warning warning: Do not change location, or installer will not function. From c3e9d1e4a12956a2c64238aae114dc33289090b5 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 03:47:25 -0400 Subject: [PATCH 27/77] Another attempt with progressbars in yad and details of what's happening. --- .includes/dialog-interface.sh | 41 ++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index d5d9b4d..5bd7ee5 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -226,16 +226,45 @@ agm_progressbox() { local text="$2" if [[ "$dialogType" == "yad" ]]; then - # More accessible approach: Use a log window instead of pulsating progress - # This shows actual command output which is more informative for screen readers + # Use a text-info dialog that auto-closes when command finishes + # This is more accessible than progress bars for screen readers + { + cat + echo "=== Operation completed ===" + } | yad --text-info \ + --title="$title" \ + --text="$text" \ + --width=600 \ + --height=400 \ + --timeout=1 \ + --timeout-indicator=bottom \ + --button="Close:0" \ + --tail + else + dialog --title "$title" \ + --progressbox "$text" 20 70 + fi +} + +# Simple progress box that just shows the operation is running (no command output) +# Usage: command | agm_simple_progressbox "title" "text" +agm_simple_progressbox() { + local title="$1" + local text="$2" + + if [[ "$dialogType" == "yad" ]]; then + # Just show a simple status with no pulsating - more accessible yad --progress \ --title="$title" \ --text="$text" \ - --enable-log="Operation Details" \ - --log-expanded \ --auto-close \ - --width=500 \ - --height=300 + --width=400 \ + --height=100 & + local yadPid=$! + # Read from stdin and discard, but keep yad window open until command finishes + cat > /dev/null + # Close the progress dialog + kill $yadPid 2>/dev/null else dialog --title "$title" \ --progressbox "$text" 20 70 From 88a815c76fc8f2750f90bc518b0a56765bdd5fbf Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 03:57:20 -0400 Subject: [PATCH 28/77] Confirmation message after game installs, so window doesn't just vanish any more. --- audiogame-manager.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 6929297..9a351b6 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -59,6 +59,8 @@ game_installer() { if [[ -f "$installScript" ]]; then # Source and execute the install script source "$installScript" + # Show success message + agm_msgbox "Installation Complete" "Audio Game Installer" "Game \"${game}\" has been successfully installed." else agm_msgbox "Audio Game Installer" "Audio Game Installer" "Installation script not found for ${game}" exit 1 @@ -557,6 +559,8 @@ done if [[ -f ".install/${game}.sh" ]]; then export LANG="en_US.UTF-8" . ".install/${game}.sh" + # Show success message + agm_msgbox "Installation Complete" "Audio Game Installer" "Game \"${game}\" has been successfully installed." else agm_msgbox "Audio Game Installer" "" "Error: Game '${game}' not found in .install directory" exit 1 From cf485ed4b0659a427d55b95c64f5288f5dd4a324 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 04:10:56 -0400 Subject: [PATCH 29/77] More fixes to install scripts that got messed up in bulk edit. --- .install/Slender Lost Vision.sh | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/.install/Slender Lost Vision.sh b/.install/Slender Lost Vision.sh index 51b72f3..4ccd531 100644 --- a/.install/Slender Lost Vision.sh +++ b/.install/Slender Lost Vision.sh @@ -2,18 +2,4 @@ export winVer="win7" download "https://www.iamtalon.me/games/slender.zip" install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/slender.zip" -add_launcher "c:\Program Files\slender\slender.exe" - "Shooter") -export WINEARCH=win64 -export winVer="win7" -get_installer "shooter-win.zip" "https://brynify.itch.io/shooter" -install_wine_bottle -install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/shooter" "${cache}/shooter-win.zip" -add_launcher "c:\Program Files\shooter\shooter.exe" - "Skateboarder Pro") -export WINEARCH=win64 -export winVer="win8" -# Uses standard wine path based on architecture (win32/win64) -install_wine_bottle sapi -install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/sb_pro_rw.zip" -add_launcher "c:\Program Files\sb_pro_rw\sb_pro.exe" +add_launcher "c:\Program Files\slender\slender.exe" \ No newline at end of file From e5e7ef49ed0266db8cb0197faf25e05481a22097 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 04:26:18 -0400 Subject: [PATCH 30/77] Fixed even more installer scripts. Am I really going to have to go through all 208 of these? --- .install/Dreamland.sh | 9 ++------- .install/Duck Hunt.sh | 3 +-- .install/Sonic Zoom.sh | 14 +------------- .install/Space Defender.sh | 6 ++++++ .install/Star Trek Final Conflict.sh | 4 ++++ 5 files changed, 14 insertions(+), 22 deletions(-) create mode 100644 .install/Space Defender.sh create mode 100644 .install/Star Trek Final Conflict.sh diff --git a/.install/Dreamland.sh b/.install/Dreamland.sh index 9ca90e4..d8cde22 100644 --- a/.install/Dreamland.sh +++ b/.install/Dreamland.sh @@ -1,9 +1,4 @@ download https://scwl-1251129685.cos.ap-shanghai.myqcloud.com/dreamland/Win/DreamLandSetup.exe install_wine_bottle speechsdk ole32 -$wine "${cache}/DreamLandSetup.exe" /silent - "Duck Hunt") -# Uses standard wine path based on architecture (win32/win64) -download "http://files.l-works.net/dhsetup.exe" -install_wine_bottle vb6run dx8vb speechsdk -wine "${cache}/dhsetup.exe" /silent -add_launcher "c:\Program Files\Lworks\Duck Hunt\duckhunt.exe" +wine "${cache}/DreamLandSetup.exe" /silent +add_launcher "c:\Program Files\DreamLand\DreamLand.exe" \ No newline at end of file diff --git a/.install/Duck Hunt.sh b/.install/Duck Hunt.sh index 49a98ea..1d3c55a 100644 --- a/.install/Duck Hunt.sh +++ b/.install/Duck Hunt.sh @@ -1,6 +1,5 @@ -"Duck Hunt") # Uses standard wine path based on architecture (win32/win64) download "http://files.l-works.net/dhsetup.exe" install_wine_bottle vb6run dx8vb speechsdk wine "${cache}/dhsetup.exe" /silent -add_launcher "c:\Program Files\Lworks\Duck Hunt\duckhunt.exe" +add_launcher "c:\Program Files\Lworks\Duck Hunt\duckhunt.exe" \ No newline at end of file diff --git a/.install/Sonic Zoom.sh b/.install/Sonic Zoom.sh index d853b2a..c88d4dd 100644 --- a/.install/Sonic Zoom.sh +++ b/.install/Sonic Zoom.sh @@ -2,16 +2,4 @@ export winVer="win7" download "http://wwwx.cs.unc.edu/Research/assist/et/projects/SonicZoom/soniczoom11.zip" install_wine_bottle speechsdk install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/soniczoom11.zip" -add_launcher "c:\Program Files\Sonic Zoom\SonicZoom.exe" - "Space Defender") -export WINEARCH="win64" -export winVer="win7" -download "http://tunmi13.ddns.net/projects/space_defender.zip" "https://stormgames.wolfe.casa/downloads/nvdaControllerClient64.dll" -install_wine_bottle -install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/space_defender.zip" -add_launcher "c:\Program Files\space_defender\sdefender.exe" - "Star Treck Final Conflict") -download "https://agarchive.net/games/USA/star%20trek%20final%20conflict%20Setup.exe" -install_wine_bottle speechsdk -wine "${cache}/star trek final conflict Setup.exe" /silent -add_launcher "c:\Program Files\USA Games\Final Conflict\stfc.exe" +add_launcher "c:\Program Files\Sonic Zoom\SonicZoom.exe" \ No newline at end of file diff --git a/.install/Space Defender.sh b/.install/Space Defender.sh new file mode 100644 index 0000000..6a45abb --- /dev/null +++ b/.install/Space Defender.sh @@ -0,0 +1,6 @@ +export WINEARCH="win64" +export winVer="win7" +download "http://tunmi13.ddns.net/projects/space_defender.zip" +install_wine_bottle +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/space_defender.zip" +add_launcher "c:\Program Files\space_defender\sdefender.exe" \ No newline at end of file diff --git a/.install/Star Trek Final Conflict.sh b/.install/Star Trek Final Conflict.sh new file mode 100644 index 0000000..9a57d57 --- /dev/null +++ b/.install/Star Trek Final Conflict.sh @@ -0,0 +1,4 @@ +download "https://agarchive.net/games/USA/star%20trek%20final%20conflict%20Setup.exe" +install_wine_bottle speechsdk +wine "${cache}/star trek final conflict Setup.exe" /silent +add_launcher "c:\Program Files\USA Games\Final Conflict\stfc.exe" \ No newline at end of file From 35fabf8ecddeb19d470a72035fd89312273a24bc Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 04:31:39 -0400 Subject: [PATCH 31/77] Cut down on repeating tasks for existing wine bottles. --- .includes/bottle.sh | 68 +++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index 07d2496..20293a0 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -95,8 +95,21 @@ install_wine_bottle() { # Modern wine is unified - no separate wine32/wine64 executables export WINE="wine" export WINESERVER="wineserver" - # Arguments to the function are dependancies to be installed. - # Get location of mono and gecko. + + # 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="" 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 @@ -107,28 +120,35 @@ install_wine_bottle() { 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="" wineboot -u | agm_progressbox "Wine Setup" "Initializing wine bottle..." - 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..." - 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} | agm_progressbox "Wine Setup" "Installing wine dependencies..." - - # Set default voice for speech-enabled games - 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 + 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() { From a37bdfd32b0a365ab1a3c140b3c3034bb083028a Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 04:45:50 -0400 Subject: [PATCH 32/77] Yet more install script fixes. --- .install/RS Games.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.install/RS Games.sh b/.install/RS Games.sh index e186a2d..602b089 100644 --- a/.install/RS Games.sh +++ b/.install/RS Games.sh @@ -1,4 +1,6 @@ -download "http://rsgames.org/rsdownloads/rsgclient/rsgames-client-setup-2.01.exe" "${nvdaControllerClientDll}" -install_wine_bottle speechsdk -${wine} "${cache}/rsgames-client-setup-2.01.exe" /silent +download "http://rsgames.org/rsdownloads/rsgclient/rsgames-client-setup-2.01.exe" +export WINEARCH=win64 +export winVer="win7" +install_wine_bottle +wine "${cache}/rsgames-client-setup-2.01.exe" /silent add_launcher "c:\Program Files\RS Games Client\rsg.exe" From 9b172482221268fd79831ad2629adcfe41534669 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Aug 2025 13:17:13 -0400 Subject: [PATCH 33/77] =?UTF-8?q?Even=20more=20install=20script=20fixes.?= =?UTF-8?q?=20=F0=9F=98=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .install/A Hero's Call.sh | 2 +- .install/Alien Outback.sh | 2 +- .install/Change Reaction.sh | 2 +- .install/Chopper Challenge.sh | 2 +- .install/Danger City.sh | 2 +- .install/DynaMan.sh | 2 +- .install/ESP Pinball Classic.sh | 2 +- .install/ESP Pinball Extreme.sh | 2 +- .install/Entombed.sh | 10 +++++----- .install/GMA Tank Commander.sh | 2 +- .install/Hunter.sh | 10 +++++----- .install/Light Cars.sh | 2 +- .install/Lone Wolf.sh | 2 +- .install/Marina Break.sh | 2 +- .install/Maze Craze.sh | 4 ++-- .install/Monkey Business.sh | 2 +- .install/MudSplat English.sh | 13 +++++++++---- .install/Park Boss.sh | 2 +- .install/Pipe 2 Blast Chamber.sh | 10 +++++----- .install/River Raiders.sh | 2 +- .install/Screaming Strike 2.sh | 2 +- .install/Shadow Line.sh | 2 +- .install/Silver Dollar.sh | 2 +- .install/Super Deekout.sh | 8 ++++---- .install/Tactical Battle.sh | 2 +- .install/Technoshock.sh | 2 +- .install/Ten Pin Alley.sh | 2 +- .install/Three D velocity.sh | 2 +- .install/Troopanum2.sh | 10 +++++----- .install/Tube Sim.sh | 2 +- .install/Ultimate SounDoku.sh | 2 +- .install/Wave of the Undead.sh | 2 +- 32 files changed, 60 insertions(+), 55 deletions(-) diff --git a/.install/A Hero's Call.sh b/.install/A Hero's Call.sh index 6529e17..1b8cb43 100644 --- a/.install/A Hero's Call.sh +++ b/.install/A Hero's Call.sh @@ -4,6 +4,6 @@ export winetricksSettings="vd=1024x768" install_wine_bottle speechsdk corefonts # Dotnet is evil. That is all. LC_ALL=C DISPLAY="" winetricks -q dotnet462 xna40 -${wine}server -k # Really! +wineserver -k # Really! install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/a-heros-call-freeware.zip" add_launcher "c:\Program Files\a-heros-call\A Hero's Call.exe" diff --git a/.install/Alien Outback.sh b/.install/Alien Outback.sh index 44e0691..d46cc8a 100644 --- a/.install/Alien Outback.sh +++ b/.install/Alien Outback.sh @@ -8,5 +8,5 @@ rm -fv "$WINEPREFIX/drive_c/windows/temp/AOSetup.exe" # warning warning warning: Do not change location, or installer will not function. # FIXME: Hacky, but it works. Install dotnet20 by itself so it actually doesn't hang. winetricks -q dotnet20 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. add_launcher "c:\Program Files\Draconis Entertainment\Alien Outback\ao.exe" diff --git a/.install/Change Reaction.sh b/.install/Change Reaction.sh index 77d9339..3969292 100644 --- a/.install/Change Reaction.sh +++ b/.install/Change Reaction.sh @@ -8,5 +8,5 @@ rm -fv "$WINEPREFIX/drive_c/windows/temp/ChangeReactionSetup.exe" # warning warning warning: Do not change location, or installer will not function. # FIXME: Hacky, but it works. Install dotnet20 by itself so it actually doesn't hang. winetricks -q dotnet20 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. add_launcher "c:\Program Files\Draconis Entertainment\Change Reaction\ChangeReactionGui.exe" diff --git a/.install/Chopper Challenge.sh b/.install/Chopper Challenge.sh index 799c91e..debe468 100644 --- a/.install/Chopper Challenge.sh +++ b/.install/Chopper Challenge.sh @@ -4,6 +4,6 @@ download "https://www.agarchive.net/games/XSight/chopper%20challenge%20setup.exe install_wine_bottle vb6run dx8vb speechsdk wine "${cache}/chopper challenge setup.exe" /silent & xdotool sleep 5 key y 2> /dev/null -${wine}server -w +wineserver -w echo "$USER|n/a" >> "$WINEPREFIX/drive_c/Program Files/x-sight interactive/chopper challenge/config.dat" add_launcher "c:\Program Files\x-sight interactive\chopper challenge\Chopper.exe" diff --git a/.install/Danger City.sh b/.install/Danger City.sh index bfcb3d2..71c0820 100644 --- a/.install/Danger City.sh +++ b/.install/Danger City.sh @@ -5,5 +5,5 @@ xdotool sleep 15 key --clearmodifiers --delay 200 Return 2> /dev/null xdotool sleep 5 key --clearmodifiers --delay 200 Return 2> /dev/null xdotool sleep 5key --clearmodifiers --delay 200 Return 2> /dev/null xdotool sleep 10 --clearmodifiers --delay 200 Return 2> /dev/null -${wine}server -w +wineserver -w add_launcher 'c:\Program Files\Danger City\dc.exe' diff --git a/.install/DynaMan.sh b/.install/DynaMan.sh index 99c588c..b1e807f 100644 --- a/.install/DynaMan.sh +++ b/.install/DynaMan.sh @@ -8,5 +8,5 @@ rm -fv "$WINEPREFIX/drive_c/windows/temp/DMSetup.exe" # warning warning warning: Do not change location, or installer will not function. # FIXME: Hacky, but it works. Install dotnet20 by itself so it actually doesn't hang. winetricks -q dotnet20 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. add_launcher "c:\Program Files\Draconis Entertainment\DynaMan\dm.exe" diff --git a/.install/ESP Pinball Classic.sh b/.install/ESP Pinball Classic.sh index cde9d11..bd2a213 100644 --- a/.install/ESP Pinball Classic.sh +++ b/.install/ESP Pinball Classic.sh @@ -8,5 +8,5 @@ rm -fv "$WINEPREFIX/drive_c/windows/temp/PBCSetup.exe" # warning warning warning: Do not change location, or installer will not function. # FIXME: Hacky, but it works. Install dotnet20 by itself so it actually doesn't hang. winetricks -q dotnet20 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. add_launcher "c:\Program Files\Draconis Entertainment\ESP Pinball Classic\pbc.exe" diff --git a/.install/ESP Pinball Extreme.sh b/.install/ESP Pinball Extreme.sh index 9366a0b..dbb6bc8 100644 --- a/.install/ESP Pinball Extreme.sh +++ b/.install/ESP Pinball Extreme.sh @@ -8,5 +8,5 @@ rm -fv "$WINEPREFIX/drive_c/windows/temp/PBXSetup.exe" # warning warning warning: Do not change location, or installer will not function. # FIXME: Hacky, but it works. Install dotnet20 by itself so it actually doesn't hang. winetricks -q dotnet20 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. add_launcher "c:\Program Files\Draconis Entertainment\ESP Pinball Xtreme\pbx.exe" diff --git a/.install/Entombed.sh b/.install/Entombed.sh index 4fb7c4a..38cc2f2 100644 --- a/.install/Entombed.sh +++ b/.install/Entombed.sh @@ -4,18 +4,18 @@ export winVer="win7" install_wine_bottle speechsdk msvcrt40 gdiplus ie7 wmp11 mf # Ok, more dotnet. LC_ALL=C DISPLAY="" winetricks -q dotnet40 xna40 -${wine}server -k # Sigh. +wineserver -k # Sigh. mkdir -p "${WINEPREFIX}/drive_c/temp" pushd "${WINEPREFIX}/drive_c/temp" install_with_progress 7z "Extracting game files..." x "${cache}/SSCERuntime-ENU.exe" -${wine} msiexec /i "${WINEPREFIX}/drive_c/temp/SSCERuntime_x86-ENU.msi" /q +wine msiexec /i "${WINEPREFIX}/drive_c/temp/SSCERuntime_x86-ENU.msi" /q rm * popd pushd "${WINEPREFIX}/drive_c/Program Files/Microsoft SQL Server Compact Edition/v3.5" -${wine} regsvr32 sqlceoledb35.dll -${wine} regsvr32 sqlceca35.dll +wine regsvr32 sqlceoledb35.dll +wine regsvr32 sqlceca35.dll popd -${wine} "${cache}/EntombedSetup.exe" /silent +wine "${cache}/EntombedSetup.exe" /silent pushd "${WINEPREFIX}/drive_c/Program Files/Entombed" cp ../Microsoft\ SQL\ Server\ Compact\ Edition/v3.5/Private/System.Data.SqlServerCe.Entity.dll ../Microsoft\ SQL\ Server\ Compact\ Edition/v3.5/Private/System.Data.SqlServerCe.dll . cp ../Microsoft\ SQL\ Server\ Compact\ Edition/v3.5/sql* . diff --git a/.install/GMA Tank Commander.sh b/.install/GMA Tank Commander.sh index df356ac..56cebb8 100644 --- a/.install/GMA Tank Commander.sh +++ b/.install/GMA Tank Commander.sh @@ -12,7 +12,7 @@ xdotool sleep 10 type --clearmodifiers --delay 100 "uuuuuuu" 2> /dev/null xdotool key --clearmodifiers Tab 2> /dev/null xdotool key --clearmodifiers Return 2> /dev/null xdotool sleep 10 key --clearmodifiers Return 2> /dev/null -${wine}server -w +wineserver -w echo "To accurately set your information, edit the file:" echo "${WINEPREFIX}/drive_c/Program\ Files/GMA\ Tank\ Commander/config.dat" echo "The default country is US. The fields are:" diff --git a/.install/Hunter.sh b/.install/Hunter.sh index 66c2746..27b50a5 100644 --- a/.install/Hunter.sh +++ b/.install/Hunter.sh @@ -2,10 +2,10 @@ download "http://www.agarchive.net/games/bsc/HunterSetup.exe" "https://www.agarc install_wine_bottle vb6run dx8vb # FIXME: Hacky, but it works. Install dotnet35 by itself so it actually doesn't hang. winetricks -q dotnet35sp1 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. wine "${cache}/HunterSetup.exe" /silent & xdotool sleep 10 key --clearmodifiers alt+y 2> /dev/null -sleep 30 && ${wine}server -k # Sometimes the installer finishes but the ${wine}server has more processes that don't exit, so we can't depend on ${wine}server -w. +sleep 30 && wineserver -k # Sometimes the installer finishes but the wineserver has more processes that don't exit, so we can't depend on wineserver -w. mkdir -p "$WINEPREFIX/drive_c/Program Files/bsc-key-generator" install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/bsc-key-generator" "${cache}/BSC unlock code generator.7z" echo "$USER"$'\n'"$(hostname)"$'\n'"none"$'\n'"US" > "$WINEPREFIX/drive_c/Program Files/Hunter/config.dat" @@ -18,7 +18,7 @@ if command -v xclip &> /dev/null && command -v xdotool &> /dev/null ; then xdotool sleep 1 key Shift+Tab sleep 1 key Return # FIXME: Kind of hacky, but let's make sure it actually exitted. sleep 5 - ${wine}server -k + wineserver -k wine "c:\Program Files\bsc-key-generator\BlindsoftwareUnlockCodeGenerator.exe" & xdotool sleep 10 key Return sleep 2 type h xdotool sleep 1 key Tab sleep 1 type $regcode @@ -27,13 +27,13 @@ if command -v xclip &> /dev/null && command -v xdotool &> /dev/null ; then regcode="$(xclip -selection clipboard -o)" # Might as well reuse the variable. # FIXME: Kind of hacky, but let's make sure it actually exitted since I can't find a good way to exit this program. sleep 5 - ${wine}server -k + wineserver -k wine "c:\Program Files\Hunter\HunterRegistration.exe" & echo "$regcode" | xclip -selection clipboard xdotool sleep 10 key Return sleep 2 key Shift+Tab sleep 1 key Shift+Tab sleep 1 key Return # FIXME: Kind of hacky, but let's make sure it actually exitted. sleep 5 - ${wine}server -k + wineserver -k else echo "Warning: You need xclip and xdotool for this installer to finish the registration process, however, you don't have them. Either remove the program, install the stated tools, and reinstall it, or go on your own. Caveat Emptor, go to jail, do not pass go, do not collect audiogame rewards and all that stuff." fi diff --git a/.install/Light Cars.sh b/.install/Light Cars.sh index 3f485b0..22429f1 100644 --- a/.install/Light Cars.sh +++ b/.install/Light Cars.sh @@ -2,7 +2,7 @@ download "https://www.agarchive.net/games/lighttech/light%20cars%20setup.exe" install_wine_bottle dx8vb vb6run wine "${cache}/light cars setup.exe" & xdotool sleep 10 key --clearmodifiers alt+n sleep 1 key --clearmodifiers alt+a key --clearmodifiers space sleep 1 key --clearmodifiers alt+n sleep 1 key --clearmodifiers alt+n sleep 1 key --clearmodifiers alt+i sleep 30 key --clearmodifiers Tab sleep 1 key --clearmodifiers Return 2> /dev/null -${wine}server -w +wineserver -w echo -e "${USER} ${HOST}\nna@na.na\nUS" > ~/.local/wine/light-cars/drive_c/Program\ Files/Lighttech\ Interactive/Light\ Cars/config.dat unix2dos ~/.local/wine/light-cars/drive_c/Program\ Files/Lighttech\ Interactive/Light\ Cars/config.dat add_launcher "c:\Program Files\Lighttech Interactive\Light Cars\lightCars.exe" diff --git a/.install/Lone Wolf.sh b/.install/Lone Wolf.sh index 8aa6f21..dc84c46 100644 --- a/.install/Lone Wolf.sh +++ b/.install/Lone Wolf.sh @@ -11,5 +11,5 @@ xdotool key --clearmodifiers Tab 2> /dev/null xdotool type --clearmodifiers --delay 100 "uuuuuu" 2> /dev/null xdotool key --clearmodifiers Tab 2> /dev/null xdotool key --clearmodifiers Return 2> /dev/null -${wine}server -w +wineserver -w add_launcher "c:\Program Files\Lone Wolf\lw.exe" diff --git a/.install/Marina Break.sh b/.install/Marina Break.sh index 4e4bd28..7c82996 100644 --- a/.install/Marina Break.sh +++ b/.install/Marina Break.sh @@ -4,5 +4,5 @@ export winVer="win7" install_wine_bottle speechsdk wine "${cache}/MbSetupE.exe" & xdotool sleep 10 key Return -${wine}server -w +wineserver -w add_launcher "c:\nyanchangame\MarinaBreak\marinabreak.exe" diff --git a/.install/Maze Craze.sh b/.install/Maze Craze.sh index ce1052f..f5e35c4 100644 --- a/.install/Maze Craze.sh +++ b/.install/Maze Craze.sh @@ -1,7 +1,7 @@ # Uses standard wine path based on architecture (win32/win64) download "http://www.danielzingaro.com/maze_craze_setup.exe" install_wine_bottle vb6run dx8vb -${wine} "${cache}/maze_craze_setup.exe" & +wine "${cache}/maze_craze_setup.exe" & xdotool sleep 15 key --delay 100 y 2> /dev/null xdotool sleep 3 key --delay 250 alt+n 2> /dev/null xdotool key --delay 250 alt+a 2> /dev/null @@ -12,5 +12,5 @@ xdotool key --delay 250 alt+n 2> /dev/null xdotool key --delay 250 alt+i 2> /dev/null xdotool sleep 15 key --delay 250 alt+f 2> /dev/null xdotool sleep 3 key --delay 250 n 2> /dev/null -${wine}server -k +wineserver -k add_launcher "c:\Program Files\Maze Craze 1.4\mazecraze.exe" diff --git a/.install/Monkey Business.sh b/.install/Monkey Business.sh index 0cbfa9a..d715afa 100644 --- a/.install/Monkey Business.sh +++ b/.install/Monkey Business.sh @@ -8,5 +8,5 @@ rm -fv "$WINEPREFIX/drive_c/windows/temp/MBSetup.exe" # warning warning warning: Do not change location, or installer will not function. # FIXME: Hacky, but it works. Install dotnet20 by itself so it actually doesn't hang. winetricks -q dotnet20 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. add_launcher "c:\Program Files\Draconis Entertainment\Monkey Business\mb.exe" diff --git a/.install/MudSplat English.sh b/.install/MudSplat English.sh index 630d5e6..e472e8a 100644 --- a/.install/MudSplat English.sh +++ b/.install/MudSplat English.sh @@ -1,28 +1,33 @@ +#!/bin/bash +case "${game}" in + "MudSplat English") a="a" f="f" i="i" n="n" - ;& + ;; "MudSplat French") # Variables may be already set for English installation, so make sure not to overwrite them. a="${a:-j}" f="${f:-t}" i="${i:-i}" n="${n:-s}" - ;& + ;; "MudSplat Swedish") # Variables may be already set for French installation, so make sure not to overwrite them. a="${a:-a}" f="${f:-f}" i="${i:-i}" n="${n:-n}" + ;; +esac download "https://www.agarchive.net/games/other/Mudsplat-install.exe" install_wine_bottle wine "${cache}/Mudsplat-install.exe" & # Select the language. xdotool sleep 10 type --clearmodifiers ${game:9:1} 2> /dev/null xdotool sleep 1 key --clearmodifiers Return sleep 1 key alt+${n} sleep 1 key alt+${a} sleep 1 key alt+${n} sleep 1 key space sleep 1 key alt+${n} sleep 1 key alt+${n} sleep 1 key alt+${i} sleep 10 key space sleep 1 key alt+${f} 2> /dev/null -${wine}server -w +wineserver -w mudsplatLauncher="$(find "$WINEPREFIX/drive_c/Program Files/TiM/MudSplat" -name 'mudsplat-*.exe')" mudsplatLauncher="${mudsplatLauncher##*/}" -add_launcher "c:\Program Files\TiM\MudSplat\\${mudsplatLauncher}" +add_launcher "c:\Program Files\TiM\MudSplat\\${mudsplatLauncher}" \ No newline at end of file diff --git a/.install/Park Boss.sh b/.install/Park Boss.sh index 99963cd..ced59d2 100644 --- a/.install/Park Boss.sh +++ b/.install/Park Boss.sh @@ -3,5 +3,5 @@ download "http://www.ndadamson.com/downloads/Park%20Boss%201.01%20setup.exe" install_wine_bottle speechsdk wine "${cache}/Park Boss 1.01 setup.exe" /silent & xdotool sleep 10 key --clearmodifiers Return sleep 1 key alt+n sleep 1 key alt+a sleep 1 key alt+i sleep 10 key alt+f 2> /dev/null -${wine}server -w +wineserver -w add_launcher "c:\Program Files\NASoft\ParkBoss\pbMain.exe" diff --git a/.install/Pipe 2 Blast Chamber.sh b/.install/Pipe 2 Blast Chamber.sh index 10c2b63..8b01203 100644 --- a/.install/Pipe 2 Blast Chamber.sh +++ b/.install/Pipe 2 Blast Chamber.sh @@ -1,11 +1,11 @@ install_wine_bottle vb6run dx8vb # FIXME: Hacky, but it works. Install dotnet35 by itself so it actually doesn't hang. winetricks -q dotnet35sp1 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. download "http://www.agarchive.net/games/bsc/BlastChamberSetup.exe" "https://www.agarchive.net/games/bsc/BSC%20unlock%20code%20generator.7z" wine "${cache}/BlastChamberSetup.exe" /silent & xdotool sleep 10 key --clearmodifiers alt+y 2> /dev/null -sleep 30 && ${wine}server -k # Sometimes the installer finishes but the ${wine}server has more processes that don't exit, so we can't depend on ${wine}server -w. +sleep 30 && wineserver -k # Sometimes the installer finishes but the wineserver has more processes that don't exit, so we can't depend on wineserver -w. mkdir -p "$WINEPREFIX/drive_c/Program Files/bsc-key-generator" install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/bsc-key-generator" "${cache}/BSC unlock code generator.7z" echo "$USER"$'\n'"$(hostname)"$'\n'"none"$'\n'"US" > "$WINEPREFIX/drive_c/Program Files/Blast Chamber/config.dat" @@ -18,7 +18,7 @@ if command -v xclip &> /dev/null && command -v xdotool &> /dev/null ; then xdotool sleep 1 key Shift+Tab sleep 1 key Return # FIXME: Kind of hacky, but let's make sure it actually exitted. sleep 5 - ${wine}server -k + wineserver -k wine "c:\Program Files\bsc-key-generator\BlindsoftwareUnlockCodeGenerator.exe" & xdotool sleep 10 key Return sleep 2 type b xdotool sleep 1 key Tab sleep 1 type $regcode @@ -27,13 +27,13 @@ if command -v xclip &> /dev/null && command -v xdotool &> /dev/null ; then regcode="$(xclip -selection clipboard -o)" # Might as well reuse the variable. # FIXME: Kind of hacky, but let's make sure it actually exitted since I can't find a good way to exit this program. sleep 5 - ${wine}server -k + wineserver -k wine "c:\Program Files\Blast Chamber\register.exe" & echo "$regcode" | xclip -selection clipboard xdotool sleep 10 key Return sleep 2 key Shift+Tab sleep 1 key Shift+Tab sleep 1 key Return # FIXME: Kind of hacky, but let's make sure it actually exitted. sleep 5 - ${wine}server -k + wineserver -k else echo "Warning: You need xclip and xdotool for this installer to finish the registration process, however, you don't have them. Either remove the program, install the stated tools, and reinstall it, or go on your own. Caveat Emptor, go to jail, do not pass go, do not collect audiogame rewards and all that stuff." fi diff --git a/.install/River Raiders.sh b/.install/River Raiders.sh index 971b9e4..130153a 100644 --- a/.install/River Raiders.sh +++ b/.install/River Raiders.sh @@ -5,5 +5,5 @@ wine "$cache/River Raiders 1.3.5.exe" & xdotool sleep 10 type y 2> /dev/null xdotool sleep 2 type y 2> /dev/null xdotool sleep 2 key --clearmodifiers alt+n sleep 2 key alt+n sleep 2 key alt+n sleep 2 key alt+i sleep 10 key alt+f 2> /dev/null -${wine}server -w +wineserver -w add_launcher "c:\Program Files\River Raiders\raid.exe" diff --git a/.install/Screaming Strike 2.sh b/.install/Screaming Strike 2.sh index 52ab146..aa4ad86 100644 --- a/.install/Screaming Strike 2.sh +++ b/.install/Screaming Strike 2.sh @@ -4,5 +4,5 @@ download "https://www.nyanchangames.com/softs/screamingStrike2.exe" "${nvdaContr install_wine_bottle fakejapanese speechsdk wine "${cache}/screamingStrike2.exe" & xdotool sleep 10 key Return -${wine}server -w +wineserver -w add_launcher "c:\nyanchangame\Screaming Strike 2\play.exe" diff --git a/.install/Shadow Line.sh b/.install/Shadow Line.sh index b724cca..88e49c8 100644 --- a/.install/Shadow Line.sh +++ b/.install/Shadow Line.sh @@ -11,7 +11,7 @@ echo "Running installer, this will take approximately 3 minutes..." xdotool sleep 180 key --clearmodifiers --delay=500 Down xdotool key --clearmodifiers --delay=500 space xdotool key --clearmodifiers --delay=500 alt+f -${wine}server -w +wineserver -w mv -v "${cache}/language_en.dat" "${WINEPREFIX}/drive_c/Program Files/GalaxyLaboratory/ShadowRine_FullVoice/SystemData/language_en.dat" add_launcher "c:\Program Files\GalaxyLaboratory\ShadowRine_FullVoice\play_sr.exe" echo "Please set the language to English when the game opens." diff --git a/.install/Silver Dollar.sh b/.install/Silver Dollar.sh index 2016dd0..f01cff0 100644 --- a/.install/Silver Dollar.sh +++ b/.install/Silver Dollar.sh @@ -8,5 +8,5 @@ rm -fv "$WINEPREFIX/drive_c/windows/temp/SilverDollarSetup.exe" # warning warning warning: Do not change location, or installer will not function. # FIXME: Hacky, but it works. Install dotnet40 by itself so it actually doesn't hang. DISPLAY="" winetricks -q dotnet40 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. add_launcher "c:\Program Files\Draconis Entertainment\Silver Dollar\SilverDollarGui.exe" diff --git a/.install/Super Deekout.sh b/.install/Super Deekout.sh index 8a1c46c..cb691b7 100644 --- a/.install/Super Deekout.sh +++ b/.install/Super Deekout.sh @@ -1,7 +1,7 @@ # Uses standard wine path based on architecture (win32/win64) download "http://www.danielzingaro.com/superdeekout_setup.exe" "http://www.danielzingaro.com/sd_full.exe" install_wine_bottle vb6run dx8vb -${wine} "${cache}/superdeekout_setup.exe" & +wine "${cache}/superdeekout_setup.exe" & xdotool sleep 15 key --delay 100 y 2> /dev/null xdotool sleep 3 key --delay 250 alt+n 2> /dev/null xdotool key --delay 250 alt+a 2> /dev/null @@ -12,14 +12,14 @@ xdotool key --delay 250 alt+n 2> /dev/null xdotool key --delay 250 alt+i 2> /dev/null xdotool sleep 15 key --delay 250 alt+f 2> /dev/null xdotool sleep 3 key --delay 250 n 2> /dev/null -${wine}server -k +wineserver -k install_with_progress 7z "Extracting game files..." x -y -o"$WINEPREFIX/drive_c/Program Files/Super Deekout" "${cache}/sd_full.exe" echo "Super Deekout needs some information before it will run:" alert read -erp "Please enter your first name: " fname read -erp "Please enter your last name: " lname read -erp "Please enter your email address: " email -${wine} "c:\Program Files\Super Deekout\config.exe" & +wine "c:\Program Files\Super Deekout\config.exe" & xdotool sleep 5 key --delay 100 Return 2> /dev/null xdotool sleep 3 type --clearmodifiers --delay 100 "${fname}" xdotool key --clearmodifiers --delay 100 Tab 2> /dev/null @@ -30,5 +30,5 @@ xdotool key --clearmodifiers --delay 100 Tab 2> /dev/null xdotool sleep 15 key --delay 100 u 2> /dev/null xdotool key --clearmodifiers --delay 100 Tab 2> /dev/null xdotool sleep 1 key --delay 250 Return 2> /dev/null -${wine}server -k +wineserver -k add_launcher "c:\Program Files\Super Deekout\super.exe" diff --git a/.install/Tactical Battle.sh b/.install/Tactical Battle.sh index 53fb68c..ec50cac 100644 --- a/.install/Tactical Battle.sh +++ b/.install/Tactical Battle.sh @@ -1,6 +1,6 @@ download "https://blindgamers.com/downloads/Tactical%20Battle%20Dev.zip" install_wine_bottle speechsdk LC_ALL=C DISPLAY="" winetricks -q dotnet462 -${wine}server -k +wineserver -k install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Tactical Battle" "${cache}/Tactical Battle Dev.zip" add_launcher "c:\Program Files\Tactical Battle\Tactical Battle.exe" diff --git a/.install/Technoshock.sh b/.install/Technoshock.sh index f9fcfe7..7344026 100644 --- a/.install/Technoshock.sh +++ b/.install/Technoshock.sh @@ -3,6 +3,6 @@ install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/technoshock_140b_en.zip" install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/technoshock_140b_en_update.zip" wine "$WINEPREFIX/drive_c/Program Files/setup_eng.exe" /silent -${wine}server -w +wineserver -w wine "$WINEPREFIX/drive_c/Program Files/setup_eng_update_pack.exe" /silent add_launcher "c:\Program Files\Tiflocomp Games\Technoshock\ts.exe" diff --git a/.install/Ten Pin Alley.sh b/.install/Ten Pin Alley.sh index f61b46e..0268a4b 100644 --- a/.install/Ten Pin Alley.sh +++ b/.install/Ten Pin Alley.sh @@ -9,5 +9,5 @@ rm -fv "$WINEPREFIX/drive_c/windows/temp/TPAXPSetup.exe" # warning warning warning: Do not change location, or installer will not function. # FIXME: Hacky, but it works. Install dotnet20 by itself so it actually doesn't hang. winetricks -q dotnet20 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. add_launcher "c:\Program Files\Draconis Entertainment\Ten Pin Alley\tpa.exe" diff --git a/.install/Three D velocity.sh b/.install/Three D velocity.sh index 2842406..db76af5 100644 --- a/.install/Three D velocity.sh +++ b/.install/Three D velocity.sh @@ -5,6 +5,6 @@ download "https://github.com/munawarb/Three-D-Velocity-Binaries/archive/master.z install_wine_bottle sapi vcrun2008 gdiplus xact dotnet48 xna40 # Dotnet is evil. That is all. # LC_ALL=C winetricks -q dotnet48 -# ${wine}server -k # Ha ha ha. +# wineserver -k # Ha ha ha. install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/master.zip" add_launcher "c:\Program Files\Three-D-Velocity-Binaries-master\tdv.exe" diff --git a/.install/Troopanum2.sh b/.install/Troopanum2.sh index 262dce8..e010053 100644 --- a/.install/Troopanum2.sh +++ b/.install/Troopanum2.sh @@ -2,10 +2,10 @@ download "https://www.agarchive.net/games/bsc/Troopanum2Setup.exe" "https://www. install_wine_bottle vb6run dx8vb # FIXME: Hacky, but it works. Install dotnet35 by itself so it actually doesn't hang. winetricks -q dotnet35sp1 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. wine "${cache}/Troopanum2Setup.exe" /silent & xdotool sleep 10 key --clearmodifiers alt+y 2> /dev/null -sleep 30 && ${wine}server -k # Sometimes the installer finishes but the ${wine}server has more processes that don't exit, so we can't depend on ${wine}server -w. +sleep 30 && wineserver -k # Sometimes the installer finishes but the wineserver has more processes that don't exit, so we can't depend on wineserver -w. mkdir -p "$WINEPREFIX/drive_c/Program Files/bsc-key-generator" install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/bsc-key-generator" "${cache}/BSC unlock code generator.7z" echo "$USER"$'\n'"$(hostname)"$'\n'"none"$'\n'"US" > "$WINEPREFIX/drive_c/Program Files/Troopanum 2.0/config.dat" @@ -18,7 +18,7 @@ if command -v xclip &> /dev/null && command -v xdotool &> /dev/null ; then xdotool sleep 1 key Shift+Tab sleep 1 key Return # FIXME: Kind of hacky, but let's make sure it actually exitted. sleep 5 - ${wine}server -k + wineserver -k wine "c:\Program Files\bsc-key-generator\BlindsoftwareUnlockCodeGenerator.exe" & xdotool sleep 10 key Return sleep 2 type t xdotool sleep 1 type t @@ -28,13 +28,13 @@ if command -v xclip &> /dev/null && command -v xdotool &> /dev/null ; then regcode="$(xclip -selection clipboard -o)" # Might as well reuse the variable. # FIXME: Kind of hacky, but let's make sure it actually exitted since I can't find a good way to exit this program. sleep 5 - ${wine}server -k + wineserver -k wine "c:\Program Files\Troopanum 2.0\register.exe" & echo "$regcode" | xclip -selection clipboard xdotool sleep 10 key Return sleep 2 key Shift+Tab sleep 1 key Shift+Tab sleep 1 key Return # FIXME: Kind of hacky, but let's make sure it actually exitted. sleep 5 - ${wine}server -k + wineserver -k else echo "Warning: You need xclip and xdotool for this installer to finish the registration process, however, you don't have them. Either remove the program, install the stated tools, and reinstall it, or go on your own. Caveat Emptor, go to jail, do not pass go, do not collect audiogame rewards and all that stuff." fi diff --git a/.install/Tube Sim.sh b/.install/Tube Sim.sh index ad1221d..2d5fd88 100644 --- a/.install/Tube Sim.sh +++ b/.install/Tube Sim.sh @@ -3,5 +3,5 @@ download "http://www.ndadamson.com/downloads/TubeSim1_1_Install.exe" install_wine_bottle speechsdk wine "${cache}/TubeSim1_1_Install.exe" /silent & xdotool sleep 10 key --clearmodifiers Return sleep 1 key alt+n sleep 1 key alt+a sleep 1 key alt+i sleep 10 key alt+f 2> /dev/null -${wine}server -w +wineserver -w add_launcher "c:\Program Files\NASoft\TubeSim\tsMain.exe" diff --git a/.install/Ultimate SounDoku.sh b/.install/Ultimate SounDoku.sh index 17d2165..d6e0d49 100644 --- a/.install/Ultimate SounDoku.sh +++ b/.install/Ultimate SounDoku.sh @@ -8,5 +8,5 @@ rm -fv "$WINEPREFIX/drive_c/windows/temp/USSetup.exe" # warning warning warning: Do not change location, or installer will not function. # FIXME: Hacky, but it works. Install dotnet20 by itself so it actually doesn't hang. winetricks -q dotnet20 -${wine}server -k # Damn you, dotnet. +wineserver -k # Damn you, dotnet. add_launcher "c:\Program Files\Draconis Entertainment\Ultimate Soundoku\soundoku.exe" diff --git a/.install/Wave of the Undead.sh b/.install/Wave of the Undead.sh index d31b696..7158e70 100644 --- a/.install/Wave of the Undead.sh +++ b/.install/Wave of the Undead.sh @@ -7,5 +7,5 @@ wine "${cache}/Wave-of-the-Undead-Setup.exe" & xdotool sleep 20 key Alt+n xdotool sleep 2 key space xdotool sleep 2 key Alt+f - ${wine}server -w + wineserver -w add_launcher "c:\Program Files (x86)\Wave Of The Undead\wave_of_the_undead.exe" From 6351d88676ada18f46f8fdb1837b9cbfedbb0b3f Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Wed, 6 Aug 2025 00:28:41 -0400 Subject: [PATCH 34/77] Attempt to improve progress details output during things like game installation. may have to revert this one, have to wait and see. --- .includes/dialog-interface.sh | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index 5bd7ee5..2b389ba 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -226,12 +226,14 @@ agm_progressbox() { local text="$2" if [[ "$dialogType" == "yad" ]]; then - # Use a text-info dialog that auto-closes when command finishes - # This is more accessible than progress bars for screen readers - { - cat - echo "=== Operation completed ===" - } | yad --text-info \ + # Use a text-info dialog with improved real-time output display + # Force line buffering and use named pipe for better responsiveness + local tmpPipe + tmpPipe=$(mktemp -u) + mkfifo "$tmpPipe" + + # Start yad in background reading from the pipe + yad --text-info \ --title="$title" \ --text="$text" \ --width=600 \ @@ -239,7 +241,25 @@ agm_progressbox() { --timeout=1 \ --timeout-indicator=bottom \ --button="Close:0" \ - --tail + --tail \ + --auto-scroll \ + --filename="$tmpPipe" & + local yadPid=$! + + # Process input and write to pipe with unbuffered output + { + stdbuf -oL cat + echo "=== Operation completed ===" + } > "$tmpPipe" & + local catPid=$! + + # Wait for either process to finish + wait $catPid 2>/dev/null + + # Clean up + sleep 1 # Brief pause to ensure yad displays the completion message + kill $yadPid 2>/dev/null + rm -f "$tmpPipe" else dialog --title "$title" \ --progressbox "$text" 20 70 From 27f9e973a32a0371b4068dec2d735a1e9f48c14b Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Wed, 6 Aug 2025 00:39:17 -0400 Subject: [PATCH 35/77] More improvements to progress bars. Hopefully fixed a bug that was causing games to install twice. --- .includes/dialog-interface.sh | 54 ++++++++++++++--------------------- audiogame-manager.sh | 26 ++++++++++------- 2 files changed, 37 insertions(+), 43 deletions(-) diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index 2b389ba..182de42 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -226,40 +226,30 @@ agm_progressbox() { local text="$2" if [[ "$dialogType" == "yad" ]]; then - # Use a text-info dialog with improved real-time output display - # Force line buffering and use named pipe for better responsiveness - local tmpPipe - tmpPipe=$(mktemp -u) - mkfifo "$tmpPipe" + # Use accessible form approach without temp files + # Process command output first to get summary info + local lineCount=0 + local lastLine="Starting..." + local allOutput="" - # Start yad in background reading from the pipe - yad --text-info \ + # Collect output while command runs + while IFS= read -r line; do + ((lineCount++)) + lastLine="$line" + allOutput="${allOutput}${line}\n" + done < <(stdbuf -oL cat) + + # Show completion dialog with accessible summary + yad --form \ --title="$title" \ - --text="$text" \ - --width=600 \ - --height=400 \ - --timeout=1 \ - --timeout-indicator=bottom \ - --button="Close:0" \ - --tail \ - --auto-scroll \ - --filename="$tmpPipe" & - local yadPid=$! - - # Process input and write to pipe with unbuffered output - { - stdbuf -oL cat - echo "=== Operation completed ===" - } > "$tmpPipe" & - local catPid=$! - - # Wait for either process to finish - wait $catPid 2>/dev/null - - # Clean up - sleep 1 # Brief pause to ensure yad displays the completion message - kill $yadPid 2>/dev/null - rm -f "$tmpPipe" + --field="$text - Completed:LBL" \ + --field="Total steps: $lineCount:LBL" \ + --field="Last action::LBL" \ + --field="$lastLine:RO" \ + --selectable-labels \ + --button="OK:0" \ + --width=500 \ + --height=200 else dialog --title "$title" \ --progressbox "$text" 20 70 diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 9a351b6..56629ca 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -526,6 +526,7 @@ while getopts "${args}" i ; do i) game_installer;; I) export game="${OPTARG}" + export noninteractiveInstall="true" break;; k) kill_game;; L) license;; @@ -552,16 +553,19 @@ done # If agmNoLaunch is set, exit (script is being sourced) [[ "$agmNoLaunch" == "true" ]] && exit 0 -# If no game specified, exit -[[ ${#game} -lt 1 ]] && exit 0 +# Only proceed with noninteractive installation if explicitly requested +if [[ "$noninteractiveInstall" == "true" ]]; then + # If no game specified for noninteractive install, exit + [[ ${#game} -lt 1 ]] && exit 0 -# Install the specified game noninteractively -if [[ -f ".install/${game}.sh" ]]; then - export LANG="en_US.UTF-8" - . ".install/${game}.sh" - # Show success message - agm_msgbox "Installation Complete" "Audio Game Installer" "Game \"${game}\" has been successfully installed." -else - agm_msgbox "Audio Game Installer" "" "Error: Game '${game}' not found in .install directory" - exit 1 + # Install the specified game noninteractively + if [[ -f ".install/${game}.sh" ]]; then + export LANG="en_US.UTF-8" + . ".install/${game}.sh" + # Show success message + agm_msgbox "Installation Complete" "Audio Game Installer" "Game \"${game}\" has been successfully installed." + else + agm_msgbox "Audio Game Installer" "" "Error: Game '${game}' not found in .install directory" + exit 1 + fi fi From 775d48c0681e5bb8939fccb431118ff4738fee09 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Wed, 6 Aug 2025 00:42:34 -0400 Subject: [PATCH 36/77] Hopefully make update messages shown after updates less spammy. --- .includes/update.sh | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/.includes/update.sh b/.includes/update.sh index 5f9dd37..5b2ea05 100644 --- a/.includes/update.sh +++ b/.includes/update.sh @@ -37,16 +37,25 @@ if [[ "$home" == "$remote" ]]; then fi agm_yesno "Audiogame Manager" "Audiogame Manager" "Updates are available. Would you like to update now?" || return - # Capture update output for display - local updateOutput - updateOutput=$({ git pull 2>&1 - echo - echo "Recent changes:" - git log '@{1}..' --pretty=format:'%an: %s' | tac; } 2>&1) - local updateResult=$? + # Perform git pull quietly, then show only the important changes + local updateResult + git pull --quiet >/dev/null 2>&1 + updateResult=$? - # Show the update results - agm_msgbox "Update Complete" "Audiogame Manager" "$updateOutput" + # Get the important information: commit messages and summary + local changesSummary + changesSummary=$({ + echo "=== UPDATE COMPLETED ===" + echo + echo "Recent changes:" + git log '@{1}..' --pretty=format:'• %an: %s' | tac + echo + echo "Update summary:" + git diff --stat '@{1}..' | tail -1 + } 2>/dev/null) + + # Show only the meaningful update information + agm_msgbox "Update Complete" "Audiogame Manager" "$changesSummary" exit $updateResult } From 9a7b440423a528c1bf51eac36496b55f6ed28dfa Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Wed, 6 Aug 2025 00:54:34 -0400 Subject: [PATCH 37/77] Totally fubar progress bars. Attempted fix here. Also add progress beeps because yad isn't the most accessible thing with progress dialogues. --- .includes/dialog-interface.sh | 85 ++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 12 deletions(-) diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index 182de42..a0080e8 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -226,19 +226,52 @@ agm_progressbox() { local text="$2" if [[ "$dialogType" == "yad" ]]; then - # Use accessible form approach without temp files - # Process command output first to get summary info + # Start audio feedback for accessibility + local beepPid + local yadPid + + # Cleanup function for traps + cleanup_progress() { + [[ -n "$beepPid" ]] && kill "$beepPid" 2>/dev/null + [[ -n "$yadPid" ]] && kill "$yadPid" 2>/dev/null + } + + # Set trap to ensure cleanup on interruption + trap cleanup_progress EXIT INT TERM + + if command -v sox >/dev/null 2>&1; then + { + while true; do + # Generate a short, pleasant progress beep (440Hz for 0.1s) + sox -q -n -d synth 0.1 sine 440 vol 0.3 2>/dev/null + sleep 2 # Beep every 2 seconds + done + } & + beepPid=$! + fi + + # Start visual progress dialog with auto-close + yad --progress \ + --title="$title" \ + --text="$text" \ + --auto-close \ + --pulsate \ + --width=400 \ + --height=100 & + yadPid=$! + + # Process command output local lineCount=0 local lastLine="Starting..." - local allOutput="" - - # Collect output while command runs while IFS= read -r line; do ((lineCount++)) lastLine="$line" - allOutput="${allOutput}${line}\n" done < <(stdbuf -oL cat) + # Clean up background processes + cleanup_progress + trap - EXIT INT TERM # Remove traps + # Show completion dialog with accessible summary yad --form \ --title="$title" \ @@ -249,7 +282,7 @@ agm_progressbox() { --selectable-labels \ --button="OK:0" \ --width=500 \ - --height=200 + --height=150 else dialog --title "$title" \ --progressbox "$text" 20 70 @@ -263,18 +296,46 @@ agm_simple_progressbox() { local text="$2" if [[ "$dialogType" == "yad" ]]; then - # Just show a simple status with no pulsating - more accessible + # Start audio feedback for accessibility + local beepPid + local yadPid + + # Cleanup function for traps + cleanup_simple_progress() { + [[ -n "$beepPid" ]] && kill "$beepPid" 2>/dev/null + [[ -n "$yadPid" ]] && kill "$yadPid" 2>/dev/null + } + + # Set trap to ensure cleanup on interruption + trap cleanup_simple_progress EXIT INT TERM + + if command -v sox >/dev/null 2>&1; then + { + while true; do + # Generate a short, pleasant progress beep (440Hz for 0.1s) + sox -q -n -d synth 0.1 sine 440 vol 0.3 2>/dev/null + sleep 2 # Beep every 2 seconds + done + } & + beepPid=$! + fi + + # Show progress dialog with pulsating yad --progress \ --title="$title" \ --text="$text" \ --auto-close \ + --pulsate \ --width=400 \ --height=100 & - local yadPid=$! - # Read from stdin and discard, but keep yad window open until command finishes + yadPid=$! + + # Read from stdin and discard, but keep dialogs open until command finishes cat > /dev/null - # Close the progress dialog - kill $yadPid 2>/dev/null + + # Clean up background processes + cleanup_simple_progress + trap - EXIT INT TERM # Remove traps else dialog --title "$title" \ --progressbox "$text" 20 70 From 3d77356e7bc22d493b96f39445cf24206a59f698 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Wed, 6 Aug 2025 01:01:42 -0400 Subject: [PATCH 38/77] Track down and fix some more progress bar stuff. --- .includes/dialog-interface.sh | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index a0080e8..5248278 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -271,18 +271,6 @@ agm_progressbox() { # Clean up background processes cleanup_progress trap - EXIT INT TERM # Remove traps - - # Show completion dialog with accessible summary - yad --form \ - --title="$title" \ - --field="$text - Completed:LBL" \ - --field="Total steps: $lineCount:LBL" \ - --field="Last action::LBL" \ - --field="$lastLine:RO" \ - --selectable-labels \ - --button="OK:0" \ - --width=500 \ - --height=150 else dialog --title "$title" \ --progressbox "$text" 20 70 From a124cd1a1ff028c50787cd8a036d99a8e74470af Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Wed, 6 Aug 2025 01:04:12 -0400 Subject: [PATCH 39/77] Updated Challenge of the Horse to hopefully use nvda2speechd. --- .install/Challenge of the Horse.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.install/Challenge of the Horse.sh b/.install/Challenge of the Horse.sh index 6d03672..94a2907 100644 --- a/.install/Challenge of the Horse.sh +++ b/.install/Challenge of the Horse.sh @@ -1,6 +1,5 @@ download "http://files.tunmi13.com/projects_archive/coth.zip" -# Uses standard wine path based on architecture (win32/win64) export winVer="win7" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/$game" "${cache}/coth.zip" add_launcher "c:\Program Files\\${game}\game.exe" From adfef6fba4dbb4bc0ae92fda24e4cb8c737c5a94 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Wed, 6 Aug 2025 01:39:34 -0400 Subject: [PATCH 40/77] An attempt at getting Swamp running in WOW64. I expect this to fail horribly. --- .install/Swamp.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.install/Swamp.sh b/.install/Swamp.sh index a6567d4..cbab125 100644 --- a/.install/Swamp.sh +++ b/.install/Swamp.sh @@ -7,7 +7,7 @@ export winetricksSettings="vd=1024x768" agm_yesno "Swamp Installation" "Swamp Installation" "If you do not have a full 32 bit gstreamer installation, the Swamp music can cause stuttering and crashes. Would you like to remove the music directory after installation?" deleteMusic=$? download "https://www.kaldobsky.com/audiogames/Swamp.zip" -install_wine_bottle dx8vb quartz corefonts vb6run speechsdk +install_wine_bottle dx8vb quartz corefonts vb6run sapi install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/Swamp.zip" # make sure the latest version is installed. if curl -L --output "${cache}/SwampPatch.zip" "https://www.kaldobsky.com/audiogames/SwampPatch.zip" ; then From fa80331a63046d6a84fb802032a96ebd717fecf9 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Wed, 6 Aug 2025 15:47:59 -0400 Subject: [PATCH 41/77] Ported over ui updates from Linux Game Manager. --- .includes/dialog-interface.sh | 48 +++++++++++++++++++++++++++-------- .includes/functions.sh | 13 +++++++--- .includes/update.sh | 4 ++- 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index 5248278..5a61196 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -165,12 +165,12 @@ agm_msgbox() { local text="$3" if [[ "$dialogType" == "yad" ]]; then - yad --form \ + echo -e "$text" | yad --text-info \ --title="$title" \ - --field="$text:LBL" \ - --selectable-labels \ + --show-cursor \ --button="OK:0" \ - --width=400 + --width=600 \ + --height=400 else dialog --backtitle "$backTitle" \ --title "$title" \ @@ -186,13 +186,13 @@ agm_yesno() { local text="$3" if [[ "$dialogType" == "yad" ]]; then - yad --form \ + echo -e "$text" | yad --text-info \ --title="$title" \ - --field="$text:LBL" \ - --selectable-labels \ + --show-cursor \ --button="Yes:0" \ --button="No:1" \ - --width=400 + --width=600 \ + --height=400 else dialog --backtitle "$backTitle" \ --title "$title" \ @@ -361,8 +361,36 @@ agm_progress_with_percent() { local text="$2" if [[ "$dialogType" == "yad" ]]; then - # Create a true progress dialog that accepts percentage updates - yad --progress \ + # Start audio feedback for accessibility + local beepPid + local yadPid + + # Cleanup function for traps + cleanup_percent_progress() { + [[ -n "$beepPid" ]] && kill "$beepPid" 2>/dev/null + [[ -n "$yadPid" ]] && kill "$yadPid" 2>/dev/null + } + + # Set trap to ensure cleanup on interruption + trap cleanup_percent_progress EXIT INT TERM + + if command -v sox >/dev/null 2>&1; then + { + while true; do + # Generate a short, pleasant progress beep (440Hz for 0.1s) + sox -q -n -d synth 0.1 sine 440 vol 0.3 2>/dev/null + sleep 2 # Beep every 2 seconds + done + } & + beepPid=$! + fi + + # Create a true progress dialog that accepts percentage updates with tee for cleanup + { + cat + cleanup_percent_progress + trap - EXIT INT TERM + } | yad --progress \ --title="$title" \ --text="$text" \ --auto-close \ diff --git a/.includes/functions.sh b/.includes/functions.sh index 8db8e0d..b73ae3a 100644 --- a/.includes/functions.sh +++ b/.includes/functions.sh @@ -54,9 +54,16 @@ download() { # Skip if the item is in cache. [[ -e "${cache}/${dest}" ]] && continue if [[ "$dialogType" == "yad" ]]; then - # Use curl's progress bar with better accessibility for yad - if ! curl -L4 -C - --retry 10 --progress-bar --output "${cache}/${dest}" "${i}" 2>&1 | \ - sed -u 's/.*\r\([0-9]*\)%.*/\1/' | agm_progress_with_percent "Audio Game Manager" "Downloading \"$dest\"..."; then + # Use curl's progress bar with better parsing for yad + if ! { + curl -L4 -C - --retry 10 --progress-bar --output "${cache}/${dest}" "${i}" 2>&1 | \ + stdbuf -oL grep -o '[0-9]*%' | \ + stdbuf -oL sed -u 's/%$//' | \ + while read -r percent; do + echo "$percent" + echo "# Downloading $dest - ${percent}%" + done + } | agm_progress_with_percent "Audio Game Manager" "Downloading \"$dest\"..."; then agm_infobox "Audio Game Manager" "Audio Game Manager" "Could not download \"$dest\". Installation cannot continue." exit 1 fi diff --git a/.includes/update.sh b/.includes/update.sh index 5b2ea05..33fb5d4 100644 --- a/.includes/update.sh +++ b/.includes/update.sh @@ -1,3 +1,5 @@ +#!/usr/bin/env bash + # Check for latest news check_news() { # For use by update scripts that want to source functions in this file. @@ -45,7 +47,7 @@ fi # Get the important information: commit messages and summary local changesSummary changesSummary=$({ - echo "=== UPDATE COMPLETED ===" + echo "UPDATE COMPLETED" echo echo "Recent changes:" git log '@{1}..' --pretty=format:'• %an: %s' | tac From adefd7aab430493213b1c7438590353004e1eec4 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Wed, 6 Aug 2025 19:09:11 -0400 Subject: [PATCH 42/77] Try to get Audio Quake working on 64 bit wine. --- .install/AudioQuake.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.install/AudioQuake.sh b/.install/AudioQuake.sh index db772f0..4b14984 100644 --- a/.install/AudioQuake.sh +++ b/.install/AudioQuake.sh @@ -1,6 +1,6 @@ download "https://github.com/matatk/agrip/releases/download/2020.0-beta1/AudioQuake+LDL_2020.0-beta1_Windows.zip" "https://stormgames.wolfe.casa/downloads/quake.zip" export winVer="win7" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/AudioQuake+LDL_2020.0-beta1_Windows.zip" install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/AudioQuake/id1" "${cache}/quake.zip" add_launcher "c:\Program Files\AudioQuake\AudioQuake.exe" From 50bb078de2b71b0f229c6dad0d642daaba391b20 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 7 Aug 2025 02:04:06 -0400 Subject: [PATCH 43/77] Initial attempt to get a working wine32. This should hopefully work for a while once correctly set up. --- .includes/bottle.sh | 25 +++++++++++++++--------- .install/Swamp.sh | 12 ++++-------- audiogame-manager.sh | 45 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 17 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index 20293a0..1b1a8ba 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -67,9 +67,9 @@ install_rhvoice() { download "${RHVoice[${voiceName}]}" winetricks -q win8 | agm_progressbox "RHVoice Setup" "Preparing Windows environment for RHVoice..." echo "Installing RHVoice ${voiceName^}..." - wine "${cache}/${voiceFile}" & + "${WINE:-wine}" "${cache}/${voiceFile}" & sleep 20 | agm_progressbox "RHVoice Setup" "Installing RHVoice ${voiceName^} voice..." - wineserver -k + "${WINESERVER:-wineserver}" -k } install_wine_bottle() { @@ -92,9 +92,16 @@ install_wine_bottle() { fi export WINEPREFIX="$HOME/.local/wine${architecture}" - # Modern wine is unified - no separate wine32/wine64 executables - export WINE="wine" - export WINESERVER="wineserver" + + # 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 @@ -106,8 +113,8 @@ install_wine_bottle() { # Only do basic setup if bottle doesn't exist if [[ "$bottleExists" == false ]]; then echo -n "Creating new wine${architecture} bottle - Using " - wine --version - DISPLAY="" wineboot -u | agm_progressbox "Wine Setup" "Initializing wine bottle..." + "$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)" @@ -120,8 +127,8 @@ install_wine_bottle() { 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..." + "$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 diff --git a/.install/Swamp.sh b/.install/Swamp.sh index cbab125..ca01f80 100644 --- a/.install/Swamp.sh +++ b/.install/Swamp.sh @@ -1,20 +1,16 @@ -# Source dialog interface wrapper -source "${0%/*}/../.includes/dialog-interface.sh" - -# Uses standard wine path based on architecture (win32/win64) -export winVer="win7" +export WINEARCH="win32" export winetricksSettings="vd=1024x768" agm_yesno "Swamp Installation" "Swamp Installation" "If you do not have a full 32 bit gstreamer installation, the Swamp music can cause stuttering and crashes. Would you like to remove the music directory after installation?" deleteMusic=$? download "https://www.kaldobsky.com/audiogames/Swamp.zip" -install_wine_bottle dx8vb quartz corefonts vb6run sapi +install_wine_bottle dx8vb speechsdk quartz corefonts vb6run install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/Swamp.zip" # make sure the latest version is installed. if curl -L --output "${cache}/SwampPatch.zip" "https://www.kaldobsky.com/audiogames/SwampPatch.zip" ; then install_with_progress unzip "Installing Swamp patch..." -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/SwampPatch.zip" fi -$wine 'c:\Program Files\swamp\checkup.exe' /verysilent -#$wine cmd.exe /c 'cd /d c:\Program Files\swamp && Windows32bit.bat' +"$WINE" 'c:\Program Files\swamp\checkup.exe' /verysilent +#wine cmd.exe /c 'cd /d c:\Program Files\swamp && Windows64bit.bat' # Delete music if requested. if [[ $deleteMusic -eq 0 ]]; then rm -frv "$WINEPREFIX/drive_c/Program Files/swamp/sounds/Music/" diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 56629ca..03744b3 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -3,6 +3,49 @@ # Dialog accessibility export DIALOGOPTS='--no-lines --visit-items' +# Wine32 version for SAPI compatibility +wineThirtyTwoVersion="9.0" + +# Check and manage wine32 installation +check_wine32() { + local wine32Dir="${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/wine32" + local versionFile="$wine32Dir/VERSION" + local currentVersion="" + + # Check current installed version + [[ -f "$versionFile" ]] && currentVersion=$(cat "$versionFile") + + # If version mismatch or missing, install/update + if [[ "$currentVersion" != "$wineThirtyTwoVersion" ]]; then + echo "Setting up Wine32 version $wineThirtyTwoVersion for SAPI compatibility..." + + # Remove old installation + rm -rf "$wine32Dir" 2>/dev/null + mkdir -p "$wine32Dir" + + # Download and install wine32 + local installFile="$(mktemp)" + if curl -L --output "$installFile" "https://www.playonlinux.com/wine/binaries/phoenicis/upstream-linux-x86/PlayOnLinux-wine-${wineThirtyTwoVersion}-upstream-linux-x86.tar.gz"; then + if tar xf "$installFile" -C "$wine32Dir" --strip-components=1; then + echo "$wineThirtyTwoVersion" > "$versionFile" + echo "Wine32 version $wineThirtyTwoVersion installed successfully." + else + echo "Failed to extract wine32. SAPI games may not work properly." + rm -rf "$wine32Dir" + fi + else + echo "Failed to download wine32. SAPI games may not work properly." + fi + rm -f "$installFile" + fi + + # Export wine32 path for bottle.sh + if [[ -f "$wine32Dir/bin/wine" ]]; then + export wine32="$wine32Dir/bin/wine" + export wine32server="$wine32Dir/bin/wineserver" + fi +} + # Install games game_installer() { export LANG="en_US.UTF-8" @@ -476,6 +519,8 @@ source .includes/update.sh # Check minimum requirements check_requirements || exit 1 +# Set up wine32 for SAPI games +check_wine32 # Check for updates update # Get latest news if available From e94b4ed13b7ed7ec9305c314e999e444f67aaa59 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 7 Aug 2025 02:18:15 -0400 Subject: [PATCH 44/77] Send inital setup stuff like installing wine32 through progress indication system. --- audiogame-manager.sh | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 03744b3..22af297 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -17,26 +17,28 @@ check_wine32() { # If version mismatch or missing, install/update if [[ "$currentVersion" != "$wineThirtyTwoVersion" ]]; then - echo "Setting up Wine32 version $wineThirtyTwoVersion for SAPI compatibility..." - # Remove old installation rm -rf "$wine32Dir" 2>/dev/null mkdir -p "$wine32Dir" - # Download and install wine32 - local installFile="$(mktemp)" - if curl -L --output "$installFile" "https://www.playonlinux.com/wine/binaries/phoenicis/upstream-linux-x86/PlayOnLinux-wine-${wineThirtyTwoVersion}-upstream-linux-x86.tar.gz"; then - if tar xf "$installFile" -C "$wine32Dir" --strip-components=1; then + # Download wine32 using existing download function + local wineFile="PlayOnLinux-wine-${wineThirtyTwoVersion}-upstream-linux-x86.tar.gz" + local wineUrl="https://www.playonlinux.com/wine/binaries/phoenicis/upstream-linux-x86/${wineFile}" + + # Use existing download function which handles progress + download "$wineUrl" + + # Extract with progress feedback + { + echo "# Extracting Wine32 version $wineThirtyTwoVersion..." + if tar xf "${cache}/${wineFile}" -C "$wine32Dir" --strip-components=1; then echo "$wineThirtyTwoVersion" > "$versionFile" - echo "Wine32 version $wineThirtyTwoVersion installed successfully." + echo "# Wine32 setup complete." else - echo "Failed to extract wine32. SAPI games may not work properly." + echo "# Failed to extract wine32. SAPI games may not work properly." rm -rf "$wine32Dir" fi - else - echo "Failed to download wine32. SAPI games may not work properly." - fi - rm -f "$installFile" + } | agm_progressbox "Wine32 Setup" "Extracting Wine32 for SAPI compatibility..." fi # Export wine32 path for bottle.sh From 81d00ef4f25e010e2ff28ad6f6ffedcaa53426ff Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 7 Aug 2025 02:38:04 -0400 Subject: [PATCH 45/77] work on calling the correct version of wine when a game is launched. --- .includes/bottle.sh | 22 ++++++---------------- .install/Swamp.sh | 2 +- audiogame-manager.sh | 22 +++++++++++++++++++++- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index 1b1a8ba..2062f7a 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -67,9 +67,9 @@ install_rhvoice() { download "${RHVoice[${voiceName}]}" winetricks -q win8 | agm_progressbox "RHVoice Setup" "Preparing Windows environment for RHVoice..." echo "Installing RHVoice ${voiceName^}..." - "${WINE:-wine}" "${cache}/${voiceFile}" & + wine "${cache}/${voiceFile}" & sleep 20 | agm_progressbox "RHVoice Setup" "Installing RHVoice ${voiceName^} voice..." - "${WINESERVER:-wineserver}" -k + wineserver -k } install_wine_bottle() { @@ -93,16 +93,6 @@ install_wine_bottle() { 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 @@ -113,8 +103,8 @@ install_wine_bottle() { # 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..." + 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)" @@ -127,8 +117,8 @@ install_wine_bottle() { 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..." + 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 diff --git a/.install/Swamp.sh b/.install/Swamp.sh index ca01f80..f1fca13 100644 --- a/.install/Swamp.sh +++ b/.install/Swamp.sh @@ -9,7 +9,7 @@ install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/P if curl -L --output "${cache}/SwampPatch.zip" "https://www.kaldobsky.com/audiogames/SwampPatch.zip" ; then install_with_progress unzip "Installing Swamp patch..." -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/SwampPatch.zip" fi -"$WINE" 'c:\Program Files\swamp\checkup.exe' /verysilent +wine 'c:\Program Files\swamp\checkup.exe' /verysilent #wine cmd.exe /c 'cd /d c:\Program Files\swamp && Windows64bit.bat' # Delete music if requested. if [[ $deleteMusic -eq 0 ]]; then diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 22af297..7d1d0a5 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -41,13 +41,33 @@ check_wine32() { } | agm_progressbox "Wine32 Setup" "Extracting Wine32 for SAPI compatibility..." fi - # Export wine32 path for bottle.sh + # Export wine32 path for function overrides if [[ -f "$wine32Dir/bin/wine" ]]; then export wine32="$wine32Dir/bin/wine" export wine32server="$wine32Dir/bin/wineserver" fi } +# Wine function overrides for automatic architecture detection +wine() { + if [[ "$WINEPREFIX" =~ wine32 ]] && [[ -n "$wine32" ]]; then + "$wine32" "$@" + else + command wine "$@" + fi +} + +wineserver() { + if [[ "$WINEPREFIX" =~ wine32 ]] && [[ -n "$wine32server" ]]; then + "$wine32server" "$@" + else + command wineserver "$@" + fi +} + +# Export functions so they're available in subshells and sourced scripts +export -f wine wineserver + # Install games game_installer() { export LANG="en_US.UTF-8" From e5c6798c8096a24bcfe08fb67d2bbfcd36ddb3af Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 7 Aug 2025 02:52:32 -0400 Subject: [PATCH 46/77] Better approach at using correct wine for 32 bit games, assuming it works that is. --- .includes/bottle.sh | 8 ++++++++ audiogame-manager.sh | 19 ------------------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index 2062f7a..224491e 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -5,6 +5,14 @@ get_bottle() { local architecture="${1:-win64}" architecture="${architecture/win/}" export WINEPREFIX="$HOME/.local/wine${architecture}" + + # Set wine executables based on architecture + if [[ "$architecture" == "32" ]] && [[ -n "$wine32" ]]; then + export WINE="$wine32" + export WINESERVER="$wine32server" + else + unset WINE WINESERVER # Use system defaults + fi } # Note: install_wine function removed - we now use system wine with simplified bottle management diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 7d1d0a5..182cc58 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -48,25 +48,6 @@ check_wine32() { fi } -# Wine function overrides for automatic architecture detection -wine() { - if [[ "$WINEPREFIX" =~ wine32 ]] && [[ -n "$wine32" ]]; then - "$wine32" "$@" - else - command wine "$@" - fi -} - -wineserver() { - if [[ "$WINEPREFIX" =~ wine32 ]] && [[ -n "$wine32server" ]]; then - "$wine32server" "$@" - else - command wineserver "$@" - fi -} - -# Export functions so they're available in subshells and sourced scripts -export -f wine wineserver # Install games game_installer() { From 9515c25ea3e7c927026ab876a1462218725b26cf Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 7 Aug 2025 20:18:11 -0400 Subject: [PATCH 47/77] A ton of updates. We now have working 32 bit wine, Swamp installs and works, many other 32 bit games should as well. Improvements to the user interface both GUI and CLI. Tons of bug fixes. Not quite yet ready for mainstream testing, but getting closer. --- .includes/bottle.sh | 112 +++++++++-------- .includes/dialog-interface.sh | 13 +- .install/A Hero's Call.sh | 2 +- .install/Adrian's Doom.sh | 2 +- .install/Adventurers At C.sh | 2 +- .install/Alien Outback.sh | 2 +- .install/Angel Gift.sh | 2 +- .install/BG 15 Puzzle.sh | 2 +- .install/BG 2048.sh | 2 +- .install/BG Aces Up Solitaire.sh | 2 +- .install/BG Alchemy.sh | 2 +- .install/BG Battleship.sh | 2 +- .install/BG Boggle.sh | 2 +- .install/BG Boxes.sh | 2 +- .install/BG Brainiac.sh | 2 +- .install/BG Chess Challenge.sh | 2 +- .install/BG Code Breaker.sh | 2 +- .install/BG Cribbage Solitaire.sh | 2 +- .install/BG Cribbage.sh | 2 +- .install/BG Crossword Puzzle.sh | 2 +- .install/BG Draw Dominoes.sh | 2 +- .install/BG Elevens Solitaire.sh | 2 +- .install/BG Fives Dominoes.sh | 2 +- .install/BG Free Cell Solitaire.sh | 2 +- .install/BG Golf Solitaire.sh | 2 +- .install/BG Hangman.sh | 2 +- .install/BG Hearts.sh | 2 +- .install/BG Klondike Solitaire.sh | 2 +- .install/BG LAP.sh | 2 +- .install/BG Master Mind.sh | 2 +- .install/BG Mine Sweeper.sh | 2 +- .install/BG Nomination Whist.sh | 2 +- .install/BG Penguin Solitaire.sh | 2 +- .install/BG Poker Solitaire.sh | 2 +- .install/BG Pyramid Solitaire.sh | 2 +- .install/BG Scorpion Solitaire.sh | 2 +- .install/BG Scrabble.sh | 2 +- .install/BG Simon.sh | 2 +- .install/BG Spider Solitaire.sh | 2 +- .install/BG Sudoku.sh | 2 +- .install/BG Tablic Solitaire.sh | 2 +- .install/BG Tri-Peaks Solitaire.sh | 2 +- .install/BG Twenty 20 Cricket.sh | 2 +- .install/BG Uno.sh | 2 +- .install/BG Word Builder.sh | 2 +- .install/BG Word Candy.sh | 2 +- .install/BG Word Jumble.sh | 2 +- .install/BG Word Maze.sh | 2 +- .install/BG Word Solitaire.sh | 2 +- .install/BG Word Target.sh | 2 +- .install/BG Word Yahtzee.sh | 2 +- .install/BG Yahtzee.sh | 2 +- .install/Battle Zone.sh | 2 +- .install/Battle of the Hunter.sh | 2 +- .install/Bloodshed.sh | 2 +- .install/Bokurano Daibouken 3.sh | 2 +- .install/Breed Memorial.sh | 2 +- .install/Castaways 2.sh | 2 +- .install/Castaways.sh | 2 +- .install/Change Reaction.sh | 2 +- .install/Chopper Challenge.sh | 2 +- .install/Clashes of the Sky.sh | 2 +- .install/Constant Battle.sh | 2 +- .install/Crazy Tennis.sh | 2 +- .install/Danger on the Wheel.sh | 2 +- .install/Dark Destroyer.sh | 2 +- .install/Daytona and the Book of Gold.sh | 2 +- .install/Deathmatch.sh | 2 +- .install/Dog Who Hates Toast.sh | 2 +- .install/Dreamland.sh | 2 +- .install/Duck Hunt.sh | 2 +- .install/DynaMan.sh | 2 +- .install/ESP Pinball Classic.sh | 2 +- .install/ESP Pinball Extreme.sh | 2 +- .install/Endless Runner.sh | 2 +- .install/Entombed.sh | 4 +- .install/Eurofly.sh | 4 +- .install/Extant.sh | 2 +- .install/GMA Tank Commander.sh | 2 +- .install/Galactic Strike.sh | 2 +- .install/Hammer of Glory.sh | 2 +- .install/Kitchensinc Games.sh | 2 +- .install/Lone Wolf.sh | 2 +- .install/Lost.sh | 2 +- .install/Lunimals.sh | 2 +- .install/Manamon 2.sh | 2 +- .install/Manamon.sh | 2 +- .install/Marina Break.sh | 2 +- .install/Monkey Business.sh | 2 +- .install/Oh Shit.sh | 2 +- .install/Palace Punch Up.sh | 2 +- .install/Paladin of the Sky.sh | 2 +- .install/Park Boss.sh | 2 +- .install/Paw Prints.sh | 2 +- .install/Penta Path.sh | 2 +- .install/Perilous Hearts.sh | 2 +- .install/Preludeamals.sh | 2 +- .install/Psycho Strike.sh | 2 +- .install/Puzzle Divided.sh | 2 +- .install/Rettou.sh | 2 +- .install/Revelation.sh | 2 +- .install/Rhythm Rage.sh | 2 +- .install/Road to Rage Offline.sh | 2 +- .install/Sammy Center.sh | 2 +- ...d the Castle of Witchcraft and Wizardry.sh | 2 +- .install/Scramble!.sh | 2 +- .install/Screaming Strike 2.sh | 2 +- .install/Shades of Doom 1.2.sh | 2 +- .install/Shades of Doom.sh | 2 +- .install/Silver Dollar.sh | 2 +- .install/Sketchbook.sh | 2 +- .install/Smashathon.sh | 2 +- .install/Sonic Zoom.sh | 2 +- .install/Sonic the Hedgehog.sh | 2 +- .install/Star Trek Final Conflict.sh | 2 +- .install/Super Dogs Bone Hunt.sh | 2 +- .install/Super Mario Bros.sh | 2 +- .install/Swamp.sh | 4 +- .install/Tactical Battle.sh | 2 +- .install/Tarot Assistant.sh | 2 +- .install/Ten Pin Alley.sh | 2 +- .install/Three D velocity.sh | 4 +- .install/Tomb Hunter.sh | 2 +- .install/Triple Triad.sh | 2 +- .install/Tube Sim.sh | 2 +- .install/Ultimate SounDoku.sh | 2 +- .install/Undead Assault.sh | 2 +- .install/VIP Mud.sh | 2 +- .install/Villains From Beyond.sh | 2 +- audiogame-manager.sh | 118 +++++++++++++++++- 130 files changed, 309 insertions(+), 196 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index 224491e..9bce43b 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -6,12 +6,35 @@ get_bottle() { architecture="${architecture/win/}" export WINEPREFIX="$HOME/.local/wine${architecture}" - # Set wine executables based on 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 - unset WINE WINESERVER # Use system defaults + # 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 } @@ -81,13 +104,15 @@ install_rhvoice() { } install_wine_bottle() { - # Respect explicit WINEARCH settings, otherwise default to wine64 + # 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 - # Default behavior: wine32 only for legacy speechsdk, wine64 for everything else if [[ "$*" =~ speechsdk ]]; then export WINEARCH="win32" else - export WINEARCH="win64" + export WINEARCH="win64" fi fi @@ -101,63 +126,40 @@ install_wine_bottle() { export WINEPREFIX="$HOME/.local/wine${architecture}" - # 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 + # Set wine environment + set_wine_env "$architecture" - # 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..." + 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" - # 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" + 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 - 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}" + # 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" diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index 5a61196..c096c71 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -250,23 +250,18 @@ agm_progressbox() { beepPid=$! fi - # Start visual progress dialog with auto-close + # Start visual progress dialog with auto-close, redirect stdin to prevent conflicts yad --progress \ --title="$title" \ --text="$text" \ --auto-close \ --pulsate \ --width=400 \ - --height=100 & + --height=100 /dev/null - agm_msgbox "Bokurano Daibouken 3" "Bokurano Daibouken 3" "If you would like English translations, the file is available at http://www.nyanchangames.com/order/bk3translate.html. Save the dict.dat file to your Downloads or Desktop directory. For convenience the url has been copied to your clipboard. Press enter when you are ready to continue." + agm_msgbox "Bokurano Daibouken 3" "Bokurano Daibouken 3" "If you would like English translations, the file is available at http://www.nyanchangames.com/order/bk3translate.html. Save the dict.dat file to your Downloads or Desktop directory. For convenience the url has been copied to your clipboard. Press enter when you are ready to continue." fi dictFile="" for i in "${HOME}/Downloads/dict.dat" "${HOME}/Desktop/dict.dat" ; do diff --git a/.install/Breed Memorial.sh b/.install/Breed Memorial.sh index 5459864..bdd5661 100644 --- a/.install/Breed Memorial.sh +++ b/.install/Breed Memorial.sh @@ -1,6 +1,6 @@ # download "https://hirotaka2014.sakura.ne.jp/mh0406/game/breed_memorial.zip" "${nvdaControllerClientDll}" export winVer="win7" -install_wine_bottle cjkfonts speechsdk +install_wine_bottle cjkfonts install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/breed_memorial.zip" add_launcher "c:\Program Files\Breed memorial\Breed memorial\breed memorial.exe" diff --git a/.install/Castaways 2.sh b/.install/Castaways 2.sh index 7e67396..7689a53 100644 --- a/.install/Castaways 2.sh +++ b/.install/Castaways 2.sh @@ -1,7 +1,7 @@ download "http://www.kaldobsky.com/audiogames/castaways2beta.zip" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/castaways2" "${cache}/castaways2beta.zip" wine "c:\Program Files\castaways2\Checkup.exe" /verysilent add_launcher "c:\Program Files\castaways2\Castaways2.exe" diff --git a/.install/Castaways.sh b/.install/Castaways.sh index 16de149..51fb608 100644 --- a/.install/Castaways.sh +++ b/.install/Castaways.sh @@ -1,7 +1,7 @@ download "https://www.kaldobsky.com/audiogames/castaways.zip" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/castaways" "${cache}/castaways.zip" wine "c:\Program Files\castaways\Checkup.exe" /verysilent add_launcher "c:\Program Files\castaways\Castaways.exe" diff --git a/.install/Change Reaction.sh b/.install/Change Reaction.sh index 3969292..e4638cc 100644 --- a/.install/Change Reaction.sh +++ b/.install/Change Reaction.sh @@ -1,7 +1,7 @@ download "https://download.dracoent.com/Windows/ChangeReactionSetup.exe" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" -install_wine_bottle vb6run dx8vb speechsdk quartz +install_wine_bottle vb6run dx8vb quartz cp -fv "${cache}/ChangeReactionSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/ChangeReactionSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/ChangeReactionSetup.exe" diff --git a/.install/Chopper Challenge.sh b/.install/Chopper Challenge.sh index debe468..dad9ecf 100644 --- a/.install/Chopper Challenge.sh +++ b/.install/Chopper Challenge.sh @@ -1,7 +1,7 @@ # # Freezes at menu download "https://www.agarchive.net/games/XSight/chopper%20challenge%20setup.exe" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb wine "${cache}/chopper challenge setup.exe" /silent & xdotool sleep 5 key y 2> /dev/null wineserver -w diff --git a/.install/Clashes of the Sky.sh b/.install/Clashes of the Sky.sh index 8875de7..865304f 100644 --- a/.install/Clashes of the Sky.sh +++ b/.install/Clashes of the Sky.sh @@ -1,6 +1,6 @@ get_installer "clashes_of_the_sky.zip" "https://tunmi13.itch.io/clashes-of-the-sky" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/clashes_of_the_sky.zip" add_launcher 'c:\Program Files\clashes_of_the_sky\clash.exe' diff --git a/.install/Constant Battle.sh b/.install/Constant Battle.sh index 7bafb60..014b895 100644 --- a/.install/Constant Battle.sh +++ b/.install/Constant Battle.sh @@ -1,6 +1,6 @@ # export winVer="win7" download "https://renovagames.com/bc/BC-Setup.exe" -install_wine_bottle cjkfonts speechsdk +install_wine_bottle cjkfonts wine "${cache}/BC-Setup.exe" /silent #add_launcher "c:\Program Files\" diff --git a/.install/Crazy Tennis.sh b/.install/Crazy Tennis.sh index 24b3188..592e06b 100644 --- a/.install/Crazy Tennis.sh +++ b/.install/Crazy Tennis.sh @@ -1,4 +1,4 @@ download "https://www.agarchive.net/games/VIP/crazy%20tennis%20setup.exe" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/crazy tennis setup.exe" /sp- /silent add_launcher "c:\Program Files\Crazytennis\crazytennis.exe" diff --git a/.install/Danger on the Wheel.sh b/.install/Danger on the Wheel.sh index b013391..6cc3fd7 100644 --- a/.install/Danger on the Wheel.sh +++ b/.install/Danger on the Wheel.sh @@ -1,6 +1,6 @@ download "http://oriolgomez.com/games/wheel_en.zip" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/danger on the wheel" "${cache}/wheel_en.zip" add_launcher "c:\Program Files\danger on the wheel\game.exe" diff --git a/.install/Dark Destroyer.sh b/.install/Dark Destroyer.sh index 1286575..ee372c1 100644 --- a/.install/Dark Destroyer.sh +++ b/.install/Dark Destroyer.sh @@ -1,6 +1,6 @@ # # No custom bottle needed - use standard wine path based on architecture download "https://www.agarchive.net/games/pb/Dark-Destroyer-Setup.exe" -install_wine_bottle speechsdk ie6 +install_wine_bottle ie6 wine "$cache/Dark-Destroyer-Setup.exe" /silent add_launcher 'c:\Pbgames\Dark_destroyer\darkdestroyer.exe' diff --git a/.install/Daytona and the Book of Gold.sh b/.install/Daytona and the Book of Gold.sh index f9bb131..7cc6e0f 100644 --- a/.install/Daytona and the Book of Gold.sh +++ b/.install/Daytona and the Book of Gold.sh @@ -2,7 +2,7 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://kaldobsky.com/audiogames/Daytona.zip" -install_wine_bottle vb6run dx8vb quartz corefonts +install_wine_bottle vb6run dx8vb quartz install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/daytona" "${cache}/Daytona.zip" wine 'c:\Program Files\daytona\checkup.exe' /verysilent add_launcher "c:\Program Files\daytona\Daytona.exe" diff --git a/.install/Deathmatch.sh b/.install/Deathmatch.sh index 4cb0cb2..dc636c9 100644 --- a/.install/Deathmatch.sh +++ b/.install/Deathmatch.sh @@ -1,6 +1,6 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.agarchive.net/games/realitySoftware/death%20match%20project%20alpha%20setup.exe" -install_wine_bottle quartz speechsdk +install_wine_bottle quartz wine "${cache}/death match project alpha setup.exe" /silent add_launcher "c:\Program Files\reality software\death match project alpha\dm1.exe" diff --git a/.install/Dog Who Hates Toast.sh b/.install/Dog Who Hates Toast.sh index dd53b72..040fd92 100644 --- a/.install/Dog Who Hates Toast.sh +++ b/.install/Dog Who Hates Toast.sh @@ -2,7 +2,7 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/dogwhohatestoast.zip" -install_wine_bottle vb6run dx8vb quartz speechsdk corefonts +install_wine_bottle vb6run dx8vb quartz install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/dogwhohatestoast" "${cache}/dogwhohatestoast.zip" wine 'c:\Program Files\dogwhohatestoast\checkup.exe' /verysilent add_launcher "c:\Program Files\dogwhohatestoast\DogwhoHatesToast.exe" diff --git a/.install/Dreamland.sh b/.install/Dreamland.sh index d8cde22..287b2af 100644 --- a/.install/Dreamland.sh +++ b/.install/Dreamland.sh @@ -1,4 +1,4 @@ download https://scwl-1251129685.cos.ap-shanghai.myqcloud.com/dreamland/Win/DreamLandSetup.exe -install_wine_bottle speechsdk ole32 +install_wine_bottle ole32 wine "${cache}/DreamLandSetup.exe" /silent add_launcher "c:\Program Files\DreamLand\DreamLand.exe" \ No newline at end of file diff --git a/.install/Duck Hunt.sh b/.install/Duck Hunt.sh index 1d3c55a..c9f2511 100644 --- a/.install/Duck Hunt.sh +++ b/.install/Duck Hunt.sh @@ -1,5 +1,5 @@ # Uses standard wine path based on architecture (win32/win64) download "http://files.l-works.net/dhsetup.exe" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb wine "${cache}/dhsetup.exe" /silent add_launcher "c:\Program Files\Lworks\Duck Hunt\duckhunt.exe" \ No newline at end of file diff --git a/.install/DynaMan.sh b/.install/DynaMan.sh index b1e807f..750a199 100644 --- a/.install/DynaMan.sh +++ b/.install/DynaMan.sh @@ -1,7 +1,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/DMSetup.exe" -install_wine_bottle vb6run dx8vb speechsdk quartz +install_wine_bottle vb6run dx8vb quartz cp -fv "${cache}/DMSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/DMSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/DMSetup.exe" diff --git a/.install/ESP Pinball Classic.sh b/.install/ESP Pinball Classic.sh index bd2a213..04c5187 100644 --- a/.install/ESP Pinball Classic.sh +++ b/.install/ESP Pinball Classic.sh @@ -1,7 +1,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/PBCSetup.exe" -install_wine_bottle vb6run dx8vb speechsdk quartz +install_wine_bottle vb6run dx8vb quartz cp -fv "${cache}/PBCSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/PBCSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/PBCSetup.exe" diff --git a/.install/ESP Pinball Extreme.sh b/.install/ESP Pinball Extreme.sh index dbb6bc8..49e3f56 100644 --- a/.install/ESP Pinball Extreme.sh +++ b/.install/ESP Pinball Extreme.sh @@ -1,7 +1,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/PBXSetup.exe" -install_wine_bottle vb6run dx8vb speechsdk quartz +install_wine_bottle vb6run dx8vb quartz cp -fv "${cache}/PBXSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/PBXSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/PBXSetup.exe" diff --git a/.install/Endless Runner.sh b/.install/Endless Runner.sh index 5dcc745..b1426f8 100644 --- a/.install/Endless Runner.sh +++ b/.install/Endless Runner.sh @@ -1,4 +1,4 @@ download "http://www.masonasons.me/softs/EndlessRunner.7z" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress 7z "Extracting game files..." x -y -o"$WINEPREFIX/drive_c/Program Files/Endless Runner" "${cache}/EndlessRunner.7z" -prunner add_launcher "c:\Program Files\Endless Runner\runner.exe" diff --git a/.install/Entombed.sh b/.install/Entombed.sh index 38cc2f2..492857e 100644 --- a/.install/Entombed.sh +++ b/.install/Entombed.sh @@ -1,7 +1,7 @@ download "http://blind-games.com/newentombed/EntombedSetup.exe" "https://download.microsoft.com/download/E/C/1/EC1B2340-67A0-4B87-85F0-74D987A27160/SSCERuntime-ENU.exe" "https://stormgames.wolfe.casa/downloads/Entombed.exe.config" "https://stormgames.wolfe.casa/downloads/mfplat.dll" -# Uses wine32 due to speechsdk dependency +# Uses wine32 due to dependency export winVer="win7" -install_wine_bottle speechsdk msvcrt40 gdiplus ie7 wmp11 mf +install_wine_bottle msvcrt40 gdiplus ie7 wmp11 mf # Ok, more dotnet. LC_ALL=C DISPLAY="" winetricks -q dotnet40 xna40 wineserver -k # Sigh. diff --git a/.install/Eurofly.sh b/.install/Eurofly.sh index 418328c..94b08e7 100644 --- a/.install/Eurofly.sh +++ b/.install/Eurofly.sh @@ -1,8 +1,8 @@ # export winVer="win7" export winetricksSettings="vd=1024x768" -download "https://www.stefankiss.sk/files/eurofly2/Launcher_1.2.zip" "https://www.stefankiss.sk/files/eurofly2/Eurofly_2_ful_setup.exe" -install_wine_bottle speechsdk comctl32 +download "https://www.stefankiss.sk/files/eurofly2/Launcher_1.2.zip" "https://www.stefankiss.sk/files/eurofly2/Eurofly_2_ful_setup.exe" +install_wine_bottle comctl32 wine "${cache}/Eurofly_2_ful_setup.exe" /silent install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Eurofly" "${cache}/Launcher_1.2.zip" add_launcher "c:\Eurofly\launcher.exe" diff --git a/.install/Extant.sh b/.install/Extant.sh index ac5a4a7..bc36403 100644 --- a/.install/Extant.sh +++ b/.install/Extant.sh @@ -1,4 +1,4 @@ download "https://agarchive.net/games/other/extant.zip" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/extant" "${cache}/extant.zip" add_launcher "c:\Program Files\extant\Extant.exe" diff --git a/.install/GMA Tank Commander.sh b/.install/GMA Tank Commander.sh index 56cebb8..44982db 100644 --- a/.install/GMA Tank Commander.sh +++ b/.install/GMA Tank Commander.sh @@ -1,5 +1,5 @@ download "http://www.gmagames.com/gtc120.exe" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb wine "${cache}/gtc120.exe" /silent & xdotool sleep 10 key --clearmodifiers alt+y 2> /dev/null xdotool sleep 15 type --clearmodifiers --delay 100 "${USER^}" 2> /dev/null diff --git a/.install/Galactic Strike.sh b/.install/Galactic Strike.sh index 98426cb..5716389 100644 --- a/.install/Galactic Strike.sh +++ b/.install/Galactic Strike.sh @@ -1,6 +1,6 @@ get_installer "Galactic Strike 1.2.zip" "https://fusion-forged-games.itch.io/galactic-strike" export winVer="win10" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Galactic Strike" "${cache}/Galactic Strike 1.2.zip" add_launcher "c:\Program Files\Galactic Strike\Galactic Strike.exe" echo "Use controls wasd to movi and navigate the menu." diff --git a/.install/Hammer of Glory.sh b/.install/Hammer of Glory.sh index f0bd826..9c6e0a1 100644 --- a/.install/Hammer of Glory.sh +++ b/.install/Hammer of Glory.sh @@ -1,6 +1,6 @@ # Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://oriolgomez.com/games/hammer_en.zip" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/hammer of glory" "${cache}/hammer_en.zip" add_launcher "c:\Program Files\hammer of glory\game.exe" diff --git a/.install/Kitchensinc Games.sh b/.install/Kitchensinc Games.sh index 987389e..d267ec6 100644 --- a/.install/Kitchensinc Games.sh +++ b/.install/Kitchensinc Games.sh @@ -1,5 +1,5 @@ download "${ipfsGateway}/ipfs/QmdkLPig6Kp3AZTwKAhjrhhsEuvhFCFhm6SHLUQVeNNYCb?filename=kitchen.tar.xz" -install_wine_bottle vb6run speechsdk dx8vb +install_wine_bottle vb6run dx8vb echo "Extracting files..." tar xf "${cache}/kitchen.tar.xz" -C "$WINEPREFIX/drive_c/Program Files/" add_launcher "c:\Program Files\Kitchen's Sink\gamemenu.exe" diff --git a/.install/Lone Wolf.sh b/.install/Lone Wolf.sh index dc84c46..2775f44 100644 --- a/.install/Lone Wolf.sh +++ b/.install/Lone Wolf.sh @@ -1,5 +1,5 @@ download "http://www.gmagames.com/lw350.exe" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb wine "${cache}/lw350.exe" /silent & xdotool sleep 10 key --clearmodifiers alt+y 2> /dev/null xdotool sleep 10 type --clearmodifiers --delay 100 "$USER" 2> /dev/null diff --git a/.install/Lost.sh b/.install/Lost.sh index 1f54ccc..d282288 100644 --- a/.install/Lost.sh +++ b/.install/Lost.sh @@ -1,5 +1,5 @@ # Uses standard wine path based on architecture (win32/win64) download "https://agarchive.net/games/danZ/lost.zip" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/lost" "$cache/lost.zip" add_launcher 'c:\Program Files\lost\lost.exe' diff --git a/.install/Lunimals.sh b/.install/Lunimals.sh index 1aabfd9..97afd96 100644 --- a/.install/Lunimals.sh +++ b/.install/Lunimals.sh @@ -2,7 +2,7 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://kaldobsky.com/audiogames/lunimals.zip" -install_wine_bottle vb6run dx8vb quartz speechsdk corefonts +install_wine_bottle vb6run dx8vb quartz install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/lunimals" "${cache}/lunimals.zip" wine 'c:\Program Files\lunimals\checkup.exe' /verysilent add_launcher "c:\Program Files\lunimals\Lunimals.exe" diff --git a/.install/Manamon 2.sh b/.install/Manamon 2.sh index 8f0ed39..e0b02d3 100644 --- a/.install/Manamon 2.sh +++ b/.install/Manamon 2.sh @@ -1,5 +1,5 @@ export winVer="win7" download "http://www.vgstorm.com/manamon2/manamon2_installer.exe" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/manamon2_installer.exe" /silent add_launcher "c:\Program Files\VGStorm.com\Manamon 2\rpg.exe" diff --git a/.install/Manamon.sh b/.install/Manamon.sh index 47fe1ed..8eb4f5c 100644 --- a/.install/Manamon.sh +++ b/.install/Manamon.sh @@ -1,5 +1,5 @@ export winVer="win7" download "https://www.vgstorm.com/manamon/manamon_installer.exe" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/manamon_installer.exe" /silent add_launcher "c:\Program Files\VGStorm.com\Manamon\rpg.exe" diff --git a/.install/Marina Break.sh b/.install/Marina Break.sh index 7c82996..6d06459 100644 --- a/.install/Marina Break.sh +++ b/.install/Marina Break.sh @@ -1,7 +1,7 @@ # # Uses standard wine path based on architecture (win32/win64) export winVer="win7" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/MbSetupE.exe" & xdotool sleep 10 key Return wineserver -w diff --git a/.install/Monkey Business.sh b/.install/Monkey Business.sh index d715afa..fc6422e 100644 --- a/.install/Monkey Business.sh +++ b/.install/Monkey Business.sh @@ -1,7 +1,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/MBSetup.exe" -install_wine_bottle vb6run dx8vb speechsdk quartz +install_wine_bottle vb6run dx8vb quartz cp -fv "${cache}/MBSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/MBSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/MBSetup.exe" diff --git a/.install/Oh Shit.sh b/.install/Oh Shit.sh index 62aa2d5..1158b9c 100644 --- a/.install/Oh Shit.sh +++ b/.install/Oh Shit.sh @@ -1,6 +1,6 @@ export winVer="win7" export norh="true" # Requires sapi even though uses nvda download "${ipfsGateway}/ipfs/QmQnAJJrt5uABFziQc7enXYrJ74J9GKQSMi8Ry8ebsxfPV?filename=OhShit.zip" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/OhShit.zip" add_launcher "c:\Program Files\oh_shit\OhShit.exe" diff --git a/.install/Palace Punch Up.sh b/.install/Palace Punch Up.sh index 9ca20eb..af5afc1 100644 --- a/.install/Palace Punch Up.sh +++ b/.install/Palace Punch Up.sh @@ -1,4 +1,4 @@ download "https://www.agarchive.net/games/blastbay/palace%20punch-up%20setup.exe" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/palace punch-up setup.exe" /silent add_launcher "c:\Program Files\Palace Punch-up\palace.exe" diff --git a/.install/Paladin of the Sky.sh b/.install/Paladin of the Sky.sh index 6d68821..89220b4 100644 --- a/.install/Paladin of the Sky.sh +++ b/.install/Paladin of the Sky.sh @@ -1,5 +1,5 @@ export winVer="win7" download "http://www.vgstorm.com/cod/pots/paladin_installer.exe" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/paladin_installer.exe" /silent add_launcher "c:\Program Files\VGStorm.com\Paladin of the Sky\game.exe" diff --git a/.install/Park Boss.sh b/.install/Park Boss.sh index ced59d2..4fbbfc9 100644 --- a/.install/Park Boss.sh +++ b/.install/Park Boss.sh @@ -1,6 +1,6 @@ export winVer="win7" download "http://www.ndadamson.com/downloads/Park%20Boss%201.01%20setup.exe" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/Park Boss 1.01 setup.exe" /silent & xdotool sleep 10 key --clearmodifiers Return sleep 1 key alt+n sleep 1 key alt+a sleep 1 key alt+i sleep 10 key alt+f 2> /dev/null wineserver -w diff --git a/.install/Paw Prints.sh b/.install/Paw Prints.sh index 6378568..9396bd3 100644 --- a/.install/Paw Prints.sh +++ b/.install/Paw Prints.sh @@ -2,7 +2,7 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/pawprints.zip" -install_wine_bottle vb6run dx8vb quartz speechsdk corefonts +install_wine_bottle vb6run dx8vb quartz install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/pawprints" "${cache}/pawprints.zip" wine 'c:\Program Files\pawprints\checkup.exe' /verysilent add_launcher "c:\Program Files\pawprints\PawPrints.exe" diff --git a/.install/Penta Path.sh b/.install/Penta Path.sh index ad7a782..f0c6385 100644 --- a/.install/Penta Path.sh +++ b/.install/Penta Path.sh @@ -2,7 +2,7 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "http://www.kaldobsky.com/audiogames/pentapath.zip" -install_wine_bottle vb6run dx8vb quartz speechsdk corefonts +install_wine_bottle vb6run dx8vb quartz install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/pentapath" "${cache}/pentapath.zip" wine 'c:\Program Files\pentapath\checkup.exe' /verysilent add_launcher "c:\Program Files\pentapath\PentaPath.exe" diff --git a/.install/Perilous Hearts.sh b/.install/Perilous Hearts.sh index 77f3766..189d21f 100644 --- a/.install/Perilous Hearts.sh +++ b/.install/Perilous Hearts.sh @@ -1,4 +1,4 @@ download "https://www.agarchive.net/games/blastbay/perilous%20hearts%20concept%20demo.exe" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/perilous hearts concept demo.exe" /silent add_launcher "c:\Program Files\Perilous Hearts Concept Demo\perilous_hearts.exe" diff --git a/.install/Preludeamals.sh b/.install/Preludeamals.sh index e50042b..3dd33f1 100644 --- a/.install/Preludeamals.sh +++ b/.install/Preludeamals.sh @@ -2,7 +2,7 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/Preludeamals.zip" -install_wine_bottle vb6run dx8vb quartz speechsdk corefonts +install_wine_bottle vb6run dx8vb quartz install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/preludeamals" "${cache}/Preludeamals.zip" wine 'c:\Program Files\preludeamals\checkup.exe' /verysilent add_launcher "c:\Program Files\preludeamals\Preludeamals.exe" diff --git a/.install/Psycho Strike.sh b/.install/Psycho Strike.sh index c16d5c2..6e6b6c2 100644 --- a/.install/Psycho Strike.sh +++ b/.install/Psycho Strike.sh @@ -1,5 +1,5 @@ # download "http://www.vgstorm.com/psycho_strike_installer.exe" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/psycho_strike_installer.exe" /silent add_launcher "c:\Program Files\VGStorm.com\Psycho Strike\strike.exe" diff --git a/.install/Puzzle Divided.sh b/.install/Puzzle Divided.sh index 785c7ea..83f57b8 100644 --- a/.install/Puzzle Divided.sh +++ b/.install/Puzzle Divided.sh @@ -2,6 +2,6 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/puzzledivided.zip" -install_wine_bottle vb6run dx8vb quartz corefonts +install_wine_bottle vb6run dx8vb quartz install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/puzzledivided" "${cache}/puzzledivided.zip" add_launcher "c:\Program Files\puzzledivided\PuzzleDivided.exe" diff --git a/.install/Rettou.sh b/.install/Rettou.sh index a2ff952..4bf23e9 100644 --- a/.install/Rettou.sh +++ b/.install/Rettou.sh @@ -2,6 +2,6 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "http://www.kaldobsky.com/audiogames/rettou.zip" -install_wine_bottle vb6run dx8vb quartz speechsdk corefonts +install_wine_bottle vb6run dx8vb quartz install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/rettou" "${cache}/rettou.zip" add_launcher "c:\Program Files\rettou\Rettou.exe" diff --git a/.install/Revelation.sh b/.install/Revelation.sh index a68ac25..279f06e 100644 --- a/.install/Revelation.sh +++ b/.install/Revelation.sh @@ -2,6 +2,6 @@ export winVer="win7" export winetricksSettings="vd=1024x768" download "https://www.kaldobsky.com/audiogames/revelation.zip" -install_wine_bottle vb6run dx8vb quartz speechsdk corefonts +install_wine_bottle vb6run dx8vb quartz install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/revelation" "${cache}/revelation.zip" add_launcher "c:\Program Files\revelation\Revelation.exe" diff --git a/.install/Rhythm Rage.sh b/.install/Rhythm Rage.sh index eba00cb..b909c33 100644 --- a/.install/Rhythm Rage.sh +++ b/.install/Rhythm Rage.sh @@ -1,6 +1,6 @@ # Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "http://oriolgomez.com/games/rr_en.zip" "${nvdaControllerClientDll}" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/rhythm rage" "${cache}/rr_en.zip" add_launcher "c:\Program Files\rhythm rage\game.exe" diff --git a/.install/Road to Rage Offline.sh b/.install/Road to Rage Offline.sh index ac06de5..f79b132 100644 --- a/.install/Road to Rage Offline.sh +++ b/.install/Road to Rage Offline.sh @@ -1,5 +1,5 @@ export winVer="win7" download "https://agarchive.net/games/talon/the%20road%20to%20rage%20offline.7z" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files" "${cache}/the road to rage offline.7z" add_launcher "c:\Program Files\RTR Offline\rtr.exe" diff --git a/.install/Sammy Center.sh b/.install/Sammy Center.sh index 72024dd..a21a311 100644 --- a/.install/Sammy Center.sh +++ b/.install/Sammy Center.sh @@ -1,6 +1,6 @@ # export winVer="win7" download "http://www.samtupy.com/games/SCSetup.exe" "${nvdaControllerClientDll}" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/SCSetup.exe" /silent add_launcher "c:\Program Files\Sam Tupy\SammyCenter\SammyCenter.exe" diff --git a/.install/Sarah and the Castle of Witchcraft and Wizardry.sh b/.install/Sarah and the Castle of Witchcraft and Wizardry.sh index 6155c74..c46a62a 100644 --- a/.install/Sarah and the Castle of Witchcraft and Wizardry.sh +++ b/.install/Sarah and the Castle of Witchcraft and Wizardry.sh @@ -1,5 +1,5 @@ download "http://www.pcs-games.net/Sarah10.exe" "http://www.pcs-games.net/Sarah-Patch4.exe" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb wine "${cache}/Sarah10.exe" /sp- /verysilent wine "${cache}/Sarah-Patch4.exe" /sp- /verysilent add_launcher "c:\Program Files\Sarah and the Castle of Witchcraft and Wizardry 10\scw.exe" diff --git a/.install/Scramble!.sh b/.install/Scramble!.sh index f5cfdf2..0cf863d 100644 --- a/.install/Scramble!.sh +++ b/.install/Scramble!.sh @@ -1,7 +1,7 @@ winetricksSettings="vd=1024x768" export winVer="win7" download "https://stevend.net/downloads/scramble_win32.zip" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/scramble_win32.zip" echo "Note: When you first start the game, it will say that tts initialization failed. Please answer that you do not want to attempt initialization of tts when the game starts to allow easy speech through speech dispatcher." alert diff --git a/.install/Screaming Strike 2.sh b/.install/Screaming Strike 2.sh index aa4ad86..736038d 100644 --- a/.install/Screaming Strike 2.sh +++ b/.install/Screaming Strike 2.sh @@ -1,7 +1,7 @@ # Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "https://www.nyanchangames.com/softs/screamingStrike2.exe" "${nvdaControllerClientDll}" -install_wine_bottle fakejapanese speechsdk +install_wine_bottle fakejapanese wine "${cache}/screamingStrike2.exe" & xdotool sleep 10 key Return wineserver -w diff --git a/.install/Shades of Doom 1.2.sh b/.install/Shades of Doom 1.2.sh index 057d231..1b89f4e 100644 --- a/.install/Shades of Doom 1.2.sh +++ b/.install/Shades of Doom 1.2.sh @@ -1,4 +1,4 @@ download "http://gmagames.com/sod1208.exe" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb wine "${cache}/sod1208.exe" /sp- /verysilent add_launcher "c:\Program Files\Shades of Doom 1.2\sod.exe" diff --git a/.install/Shades of Doom.sh b/.install/Shades of Doom.sh index 249b15e..b22c803 100644 --- a/.install/Shades of Doom.sh +++ b/.install/Shades of Doom.sh @@ -1,5 +1,5 @@ export winVer="win7" download "http://www.gmagames.com/sod20024.exe" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb wine "${cache}/sod20024.exe" /silent add_launcher "c:\Program Files\Shades of Doom 2.0\sod.exe" diff --git a/.install/Silver Dollar.sh b/.install/Silver Dollar.sh index f01cff0..3b625b3 100644 --- a/.install/Silver Dollar.sh +++ b/.install/Silver Dollar.sh @@ -1,7 +1,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/SilverDollarSetup.exe" -install_wine_bottle speechsdk +install_wine_bottle cp -fv "${cache}/SilverDollarSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/SilverDollarSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/SilverDollarSetup.exe" diff --git a/.install/Sketchbook.sh b/.install/Sketchbook.sh index 8d7b7cd..a7b50e6 100644 --- a/.install/Sketchbook.sh +++ b/.install/Sketchbook.sh @@ -1,6 +1,6 @@ export winVer="win7" download "http://sbyw.games/SBYW/SBYW.zip" "http://sbyw.games/SBYW/sounds.zip" "${nvdaControllerClientDll}" -install_wine_bottle speechsdk +install_wine_bottle mv -v "${cache}/sounds.zip" "${cache}/SBYW-sounds.zip" install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/sketchbook" "${cache}/SBYW.zip" install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/sketchbook" "${cache}/SBYW-sounds.zip" diff --git a/.install/Smashathon.sh b/.install/Smashathon.sh index fa97345..31dc0c8 100644 --- a/.install/Smashathon.sh +++ b/.install/Smashathon.sh @@ -1,5 +1,5 @@ # Uses standard wine path based on architecture (win32/win64) download "https://agarchive.net/games/lworks/Smashathon0.02.zip" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "$cache/Smashathon0.02.zip" add_launcher 'c:\Program Files\Smashathon0.02\smashathon.exe' diff --git a/.install/Sonic Zoom.sh b/.install/Sonic Zoom.sh index c88d4dd..02a29eb 100644 --- a/.install/Sonic Zoom.sh +++ b/.install/Sonic Zoom.sh @@ -1,5 +1,5 @@ export winVer="win7" download "http://wwwx.cs.unc.edu/Research/assist/et/projects/SonicZoom/soniczoom11.zip" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/soniczoom11.zip" add_launcher "c:\Program Files\Sonic Zoom\SonicZoom.exe" \ No newline at end of file diff --git a/.install/Sonic the Hedgehog.sh b/.install/Sonic the Hedgehog.sh index 3beb8c8..63d4fa8 100644 --- a/.install/Sonic the Hedgehog.sh +++ b/.install/Sonic the Hedgehog.sh @@ -1,5 +1,5 @@ export winVer="win7" download "https://www.agarchive.net/games/jeqoconGames/sonic%20the%20hedgehog.7z" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Sonic the Hedgehog" "${cache}/sonic the hedgehog.7z" add_launcher "c:\Program Files\Sonic the Hedgehog\sth.exe" diff --git a/.install/Star Trek Final Conflict.sh b/.install/Star Trek Final Conflict.sh index 9a57d57..82038cf 100644 --- a/.install/Star Trek Final Conflict.sh +++ b/.install/Star Trek Final Conflict.sh @@ -1,4 +1,4 @@ download "https://agarchive.net/games/USA/star%20trek%20final%20conflict%20Setup.exe" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/star trek final conflict Setup.exe" /silent add_launcher "c:\Program Files\USA Games\Final Conflict\stfc.exe" \ No newline at end of file diff --git a/.install/Super Dogs Bone Hunt.sh b/.install/Super Dogs Bone Hunt.sh index 0ff58a1..87e51a1 100644 --- a/.install/Super Dogs Bone Hunt.sh +++ b/.install/Super Dogs Bone Hunt.sh @@ -1,4 +1,4 @@ download "http://www.pcs-games.net/SBH11.exe" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb wine "${cache}/SBH11.exe" /sp- /silent add_launcher "c:\Program Files\SuperDog's Bone Hunt\sbh.exe" diff --git a/.install/Super Mario Bros.sh b/.install/Super Mario Bros.sh index 413a275..77339b1 100644 --- a/.install/Super Mario Bros.sh +++ b/.install/Super Mario Bros.sh @@ -1,5 +1,5 @@ export winVer="win7" download "https://www.agarchive.net/games/jeqoconGames/super%20mario%20bros.7z" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Super Mario Bros" "${cache}/super mario bros.7z" add_launcher "c:\Program Files\Super Mario Bros\Mario.exe" diff --git a/.install/Swamp.sh b/.install/Swamp.sh index f1fca13..26c0b54 100644 --- a/.install/Swamp.sh +++ b/.install/Swamp.sh @@ -3,13 +3,13 @@ export winetricksSettings="vd=1024x768" agm_yesno "Swamp Installation" "Swamp Installation" "If you do not have a full 32 bit gstreamer installation, the Swamp music can cause stuttering and crashes. Would you like to remove the music directory after installation?" deleteMusic=$? download "https://www.kaldobsky.com/audiogames/Swamp.zip" -install_wine_bottle dx8vb speechsdk quartz corefonts vb6run +install_wine_bottle dx8vb quartz vb6run install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/Swamp.zip" # make sure the latest version is installed. if curl -L --output "${cache}/SwampPatch.zip" "https://www.kaldobsky.com/audiogames/SwampPatch.zip" ; then install_with_progress unzip "Installing Swamp patch..." -d "$WINEPREFIX/drive_c/Program Files/swamp" "${cache}/SwampPatch.zip" fi -wine 'c:\Program Files\swamp\checkup.exe' /verysilent +wine 'c:\Program Files\swamp\Checkup.exe' /verysilent #wine cmd.exe /c 'cd /d c:\Program Files\swamp && Windows64bit.bat' # Delete music if requested. if [[ $deleteMusic -eq 0 ]]; then diff --git a/.install/Tactical Battle.sh b/.install/Tactical Battle.sh index ec50cac..8fe3e51 100644 --- a/.install/Tactical Battle.sh +++ b/.install/Tactical Battle.sh @@ -1,5 +1,5 @@ download "https://blindgamers.com/downloads/Tactical%20Battle%20Dev.zip" -install_wine_bottle speechsdk +install_wine_bottle LC_ALL=C DISPLAY="" winetricks -q dotnet462 wineserver -k install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Tactical Battle" "${cache}/Tactical Battle Dev.zip" diff --git a/.install/Tarot Assistant.sh b/.install/Tarot Assistant.sh index e19a5f4..0bc63cc 100644 --- a/.install/Tarot Assistant.sh +++ b/.install/Tarot Assistant.sh @@ -1,7 +1,7 @@ # Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "https://www.kaldobsky.com/audiogames/tarot.zip" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Tarot Assistant" "${cache}/tarot.zip" wine "c:\Program Files\Tarot Assistant\Checkup.exe" /verysilent add_launcher "c:\Program Files\Tarot Assistant\TarotAssistant.exe" diff --git a/.install/Ten Pin Alley.sh b/.install/Ten Pin Alley.sh index 0268a4b..898d97c 100644 --- a/.install/Ten Pin Alley.sh +++ b/.install/Ten Pin Alley.sh @@ -1,7 +1,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/TPAXPSetup.exe" -install_wine_bottle vb6run dx8vb speechsdk quartz +install_wine_bottle vb6run dx8vb quartz cp -fv "${cache}/TPAXPSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/TPAXPSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/TPAXPSetup.exe" diff --git a/.install/Three D velocity.sh b/.install/Three D velocity.sh index db76af5..e086067 100644 --- a/.install/Three D velocity.sh +++ b/.install/Three D velocity.sh @@ -2,9 +2,9 @@ export winVer="win10" export WINEARCH=win64 export norh=false # Must install a voice, and rhvoice works easily with 64 bit. download "https://github.com/munawarb/Three-D-Velocity-Binaries/archive/master.zip" -install_wine_bottle sapi vcrun2008 gdiplus xact dotnet48 xna40 +install_wine_bottle sapi vcrun2008 gdiplus xact dotnet48 xna40 # Dotnet is evil. That is all. -# LC_ALL=C winetricks -q dotnet48 +# LC_ALL=C winetricks -q dotnet48 # wineserver -k # Ha ha ha. install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/master.zip" add_launcher "c:\Program Files\Three-D-Velocity-Binaries-master\tdv.exe" diff --git a/.install/Tomb Hunter.sh b/.install/Tomb Hunter.sh index 4826c5d..3e14666 100644 --- a/.install/Tomb Hunter.sh +++ b/.install/Tomb Hunter.sh @@ -1,4 +1,4 @@ download "http://masonasons.me/softs/th_freeware_password_is_tombhunter.7z" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Tomb Hunter" "${cache}/th_freeware_password_is_tombhunter.7z" -ptombhunter add_launcher "c:\Program Files\Tomb Hunter\th.exe" diff --git a/.install/Triple Triad.sh b/.install/Triple Triad.sh index 9fc3a6a..cad8175 100644 --- a/.install/Triple Triad.sh +++ b/.install/Triple Triad.sh @@ -1,7 +1,7 @@ # Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "https://www.kaldobsky.com/audiogames/tripletriad.zip" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Triple Triad" "${cache}/tripletriad.zip" wine "c:\Program Files\Triple Triad\Checkup.exe" /verysilent add_launcher "c:\Program Files\Triple Triad\TripleTriad.exe" diff --git a/.install/Tube Sim.sh b/.install/Tube Sim.sh index 2d5fd88..8f396b2 100644 --- a/.install/Tube Sim.sh +++ b/.install/Tube Sim.sh @@ -1,6 +1,6 @@ export winVer="win7" download "http://www.ndadamson.com/downloads/TubeSim1_1_Install.exe" -install_wine_bottle speechsdk +install_wine_bottle wine "${cache}/TubeSim1_1_Install.exe" /silent & xdotool sleep 10 key --clearmodifiers Return sleep 1 key alt+n sleep 1 key alt+a sleep 1 key alt+i sleep 10 key alt+f 2> /dev/null wineserver -w diff --git a/.install/Ultimate SounDoku.sh b/.install/Ultimate SounDoku.sh index d6e0d49..19fdcb9 100644 --- a/.install/Ultimate SounDoku.sh +++ b/.install/Ultimate SounDoku.sh @@ -1,7 +1,7 @@ export winVer="win7" # Uses standard wine path based on architecture (win32/win64) download "http://download.dracoent.com/Windows/classic/USSetup.exe" -install_wine_bottle vb6run dx8vb speechsdk quartz +install_wine_bottle vb6run dx8vb quartz cp -fv "${cache}/USSetup.exe" "$WINEPREFIX/drive_c/windows/temp/" wine "c:/windows/temp/USSetup.exe" /sp- /silent rm -fv "$WINEPREFIX/drive_c/windows/temp/USSetup.exe" diff --git a/.install/Undead Assault.sh b/.install/Undead Assault.sh index 3025d50..3b99723 100644 --- a/.install/Undead Assault.sh +++ b/.install/Undead Assault.sh @@ -1,5 +1,5 @@ export winVer="win7" download "http://undead-assault.com/static/files/public/undead_assault.zip" "${nvdaControllerClientDll}" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/undead_assault" "${cache}/undead_assault.zip" add_launcher "c:\Program Files\undead_assault\Undead Assault.exe" diff --git a/.install/VIP Mud.sh b/.install/VIP Mud.sh index 27385c9..7ddb9c1 100644 --- a/.install/VIP Mud.sh +++ b/.install/VIP Mud.sh @@ -1,5 +1,5 @@ export winVer="win7" -install_wine_bottle vb6run dx8vb speechsdk +install_wine_bottle vb6run dx8vb wine "${cache}/vipmud20016.exe" /silent mkdir -p "${HOME}/.local/wine/vip-mud/drive_c/users/${USER}/Documents/VIP Mud" add_launcher "c:\Program Files\VIPMud 2.0\vipmud2.exe" diff --git a/.install/Villains From Beyond.sh b/.install/Villains From Beyond.sh index 2cdc4c7..2fc3a33 100644 --- a/.install/Villains From Beyond.sh +++ b/.install/Villains From Beyond.sh @@ -1,6 +1,6 @@ # Uses standard wine path based on architecture (win32/win64) export winVer="win7" download "${ipfsGateway}/ipfs/QmWx271xuk3Mv9XTBoVu5BDJvXFZdasawC2nhtV21WAaUU?filename=villains_en.zip" -install_wine_bottle speechsdk +install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/villains from beyond" "${cache}/villains_en.zip" add_launcher "c:\Program Files\villains from beyond\game.exe" diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 182cc58..1e6958b 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -41,13 +41,127 @@ check_wine32() { } | agm_progressbox "Wine32 Setup" "Extracting Wine32 for SAPI compatibility..." fi - # Export wine32 path for function overrides + # Export wine32 path for bottle creation if [[ -f "$wine32Dir/bin/wine" ]]; then export wine32="$wine32Dir/bin/wine" export wine32server="$wine32Dir/bin/wineserver" fi } +# Ensure wine bottles exist with proper dependencies +ensure_wine_bottles() { + local wine32Bottle="$HOME/.local/wine32" + local wine64Bottle="$HOME/.local/wine64" + + # Create wine32 bottle for SAPI games if missing + if [[ ! -d "$wine32Bottle" ]] || [[ ! -f "$wine32Bottle/system.reg" ]]; then + { + echo "# Creating wine32 bottle for SAPI compatibility..." + echo "# This may take several minutes on first run..." + + # Set up environment for wine32 + export WINEPREFIX="$wine32Bottle" + export WINE="$wine32" + export WINESERVER="$wine32server" + export PATH="${wine32%/*}:$PATH" + unset WINEARCH + + # Initialize wine32 bottle + echo "# Initializing wine32 environment..." + DISPLAY="" "$WINE" wineboot -u + + # Install mono and gecko + echo "# Installing .NET Framework..." + monoPath="$(find /usr/share/wine/ -maxdepth 1 -type d -name mono 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 + "$WINE" msiexec /i z:"$monoPath" /quiet + + echo "# Installing web browser support..." + geckoPath="$(find /usr/share/wine/ -maxdepth 1 -type d -name "gecko" 2> /dev/null)" + 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:"$geckoPath" /quiet + + # Install SAPI dependencies + echo "# Installing Speech SDK and SAPI dependencies..." + env WINE="$WINE" WINESERVER="$WINESERVER" DISPLAY="${DISPLAY:-:0}" winetricks -q isolate_home speechsdk corefonts winxp + + # Set Microsoft Mike as default voice (better than Mary/Sam) + echo "# Setting Microsoft Mike as default voice..." + + # Initialize SAPI to create registry entries + mkdir -p "${WINEPREFIX}/drive_c/windows/temp" + cat << "EOF" > "${WINEPREFIX}/drive_c/windows/temp/init_sapi.vbs" +dim speechobject +set speechobject=createobject("sapi.spvoice") +speechobject.speak "" +EOF + "$WINE" cscript "c:\\windows\\temp\\init_sapi.vbs" + + # Set Microsoft Mike as default voice + "$WINE" reg add "HKCU\\SOFTWARE\\Microsoft\\Speech\\Voices" /v "DefaultTokenId" /t REG_SZ /d "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\MSMike" /f + # Set speech rate to 7 (normal speed) + "$WINE" reg add "HKCU\\SOFTWARE\\Microsoft\\Speech\\Voices" /v "DefaultTTSRate" /t REG_DWORD /d "7" /f + echo "Set Microsoft Mike as default voice" + + echo "# Wine32 bottle creation complete." + } | agm_progressbox "Wine Bottle Setup" "Creating wine32 bottle for SAPI games (this may take several minutes)..." + fi + + # Create wine64 bottle for modern games if missing + if [[ ! -d "$wine64Bottle" ]] || [[ ! -f "$wine64Bottle/system.reg" ]]; then + { + echo "# Creating wine64 bottle for modern games..." + + # Set up environment for wine64 + export WINEPREFIX="$wine64Bottle" + export WINE="wine" + export WINESERVER="wineserver" + unset WINEARCH + + # Initialize wine64 bottle + echo "# Initializing wine64 environment..." + DISPLAY="" wine wineboot -u + + # Install mono and gecko + echo "# Installing .NET Framework..." + monoPath="$(find /usr/share/wine/ -maxdepth 1 -type d -name mono 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 + wine msiexec /i z:"$monoPath" /quiet + + echo "# Installing web browser support..." + geckoPath="$(find /usr/share/wine/ -maxdepth 1 -type d -name "gecko" 2> /dev/null)" + 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:"$geckoPath" /quiet + + # Install common dependencies for modern games + echo "# Installing common dependencies..." + winetricks -q isolate_home corefonts vcrun2019 win10 + + # Setup nvda2speechd for accessibility + echo "# Setting up accessibility support..." + 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 + + echo "# Wine64 bottle creation complete." + } | agm_progressbox "Wine Bottle Setup" "Creating wine64 bottle for modern games..." + fi +} + # Install games game_installer() { @@ -524,6 +638,8 @@ source .includes/update.sh check_requirements || exit 1 # Set up wine32 for SAPI games check_wine32 +# Ensure wine bottles exist with dependencies +ensure_wine_bottles # Check for updates update # Get latest news if available From 19fd7fb899656b594b763b2edb0250ca786b5271 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sat, 9 Aug 2025 06:42:11 -0400 Subject: [PATCH 48/77] Set-voice updated to new format. Also, search for and set voices using wine registry instead of old sed method. --- speech/set-voice.sh | 559 ++++++++++++++++++++++++++------------------ 1 file changed, 338 insertions(+), 221 deletions(-) diff --git a/speech/set-voice.sh b/speech/set-voice.sh index 595694e..b07cda2 100755 --- a/speech/set-voice.sh +++ b/speech/set-voice.sh @@ -1,10 +1,10 @@ #!/usr/bin/env bash -# Set Voice -# Set the default wine voice based on installed options. +# Set Speech +# Configure SAPI voices and speech rate for wine32 bottle -# -# âe contents of this file are subject to the Common Public Attribution -# License Version 1.0 (the âcenseâ you may not use this file except in +# License header +# The contents of this file are subject to the Common Public Attribution +# License Version 1.0 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at # https://opensource.org/licenses/CPAL-1.0. The License is based on the Mozilla Public License Version # 1.1 but Sections 14 and 15 have been added to cover use of software over a @@ -12,7 +12,7 @@ # Developer. In addition, Exhibit A has been modified to be consistent with # Exhibit B. # -# Software distributed under the License is distributed on an â ISâasis, +# Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. @@ -40,8 +40,6 @@ # Works which are defined in the CPAL as a work which combines Covered Code # or portions thereof with code not governed by the terms of the CPAL. -#--code-- - # Detect dialog interface type BEFORE potentially setting DISPLAY if [[ -z "$DISPLAY" ]]; then dialogType="dialog" @@ -52,215 +50,296 @@ fi # Source dialog interface wrapper source "${0%/*}/../.includes/dialog-interface.sh" +# Settings to improve accessibility of dialog +export DIALOGOPTS='--insecure --no-lines --visit-items' +# Turn off debug messages +export WINEDEBUG="-all" +# Set DISPLAY if needed +if [[ -z "$DISPLAY" ]]; then + export DISPLAY=:0 +fi + +# Set wine prefix to wine32 - this is the only supported bottle for SAPI +export WINEPREFIX="$HOME/.local/wine32" +export bottle="$HOME/.local/wine32" + help() { echo "${0##*/}" echo "Released under the terms of the Common Public Attribution License Version 1.0" echo -e "This is a Stormux project: https://stormux.org\n" echo -e "Usage:\n" - echo "With no arguments, open the game launcher." - for i in "${!command[@]}" ; do - echo "-${i/:/ }: ${command[${i}]}" - done | sort + echo "With no arguments, open the voice configuration menu." + echo "-h: Show this help screen." + echo "-r : Set voice rate (0-10, where 10 is fastest)." + echo "-v : Set voice by name." exit 0 } - -# Set a variable to make mac compatibility easier... -sed="sed" -grep="grep" -if [[ "$(uname)" == "Darwin" ]]; then - sed="gsed" - grep="ggrep" -fi -export grep -export sed -# Settings to improve accessibility of dialog. -export DIALOGOPTS='--insecure --no-lines --visit-items' -# Turn off debug messages -export WINEDEBUG="-all" -# Set DISPLAY, as needed -if [ -z "$DISPLAY" ] ; then -export DISPLAY=:0 -fi -# handle arguments -declare -A command=( - [b:]="the wine bottle to use." - [h]="This help screen." - [r:]="Specify voice rate, default is 7, options are 0-9 or A for fastest." - [v:]="Voice name, the voice to use, same as in the menu." -) - - msgbox() { -# Returns: None -# Shows the provided message on the screen with an ok button. -agm_msgbox "Set Voice" "Set Voice" "$*" + agm_msgbox "Set Speech" "Set Speech" "$*" } infobox() { - # Returns: None - # Shows the provided message on the screen with no buttons. - local timeout=3 - agm_infobox "Set Voice" "Set Voice" "$*" - read -n1 -t $timeout continue - # Clear any keypresses from the buffer - read -t 0.01 continue + local timeout=3 + agm_infobox "Set Speech" "Set Speech" "$*" + read -r -n1 -t $timeout + read -r -t 0.01 } yesno() { - # Returns: Yes or No - # Args: Question to user. - # Called in if $(yesno) == "Yes" - # Or variable=$(yesno) - agm_yesno "Set Voice" "Set Voice" "$*" - if [[ $? -eq 0 ]]; then + if agm_yesno "Set Speech" "Set Speech" "$*"; then echo "Yes" else echo "No" fi } -menulist() { - # Args: List of items for menu. - # returns: selected tag - declare -a menuList - for i in "${@}" ; do +voice_menu() { + declare -a menuList=() + for i in "${@}"; do menuList+=("$i" "$i") done - agm_menu "Set Voice" "Set Voice" "Please select one" "${menuList[@]}" - return $? + agm_menu "Set Speech" "Set Speech" "Please select a voice:" "${menuList[@]}" } -restore_voice() { - if [[ $doRestore -eq 0 ]]; then - ${wine}server -k # If we don't do this it's likely wine will overwrite our reverted change or even clobber the registry key entirely - $sed -i -E -e 's/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"/"DefaultTokenId"="'"${oldVoice//\\/\\\\}"'"/g' "${WINEPREFIX}/user.reg" +rate_menu() { + declare -a rateList=() + for i in {0..10}; do + local desc="Rate $i" + if [[ $i -eq 0 ]]; then + desc="$desc (Slowest)" + elif [[ $i -eq 5 ]]; then + desc="$desc (Default)" + elif [[ $i -eq 10 ]]; then + desc="$desc (Fastest)" + fi + rateList+=("$i" "$desc") + done + agm_menu "Set Speech" "Set Speech" "Please select speech rate:" "${rateList[@]}" +} + +get_voices() { + # Get list of available voices using wine reg query + declare -a voices + declare -a voiceKeys + + # First, get Microsoft SAPI voices + local allOutput + allOutput=$(WINEPREFIX="$WINEPREFIX" "$wine" reg query "HKLM\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens" /s 2>/dev/null) + + # Parse output to find voice keys and names + local currentKey="" + local currentName="" + local inMainVoiceToken=false + + while IFS= read -r line; do + # Clean up the line first + line=$(echo "$line" | tr -d '\r\n' | sed 's/[[:space:]]*$//') + + # Check if this is a main voice token registry key line (exactly one level deep) + if [[ "$line" =~ ^HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\([^\\]+)$ ]]; then + # Save previous voice if we found a name and had collected both key and name + if [[ -n "$currentKey" && -n "$currentName" ]]; then + voices+=("$currentName") + voiceKeys+=("$currentKey") + fi + # Start new voice - clean up any carriage returns or whitespace + currentKey="${BASH_REMATCH[1]}" + currentName="" + inMainVoiceToken=true + # Check if this is a subkey (contains additional parts after token name) + elif [[ "$line" =~ ^HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\[^\\]+\\ ]]; then + # This is a subkey, not a main voice token + inMainVoiceToken=false + # Check if this is a default value line with voice name and we're in main token + elif [[ "$line" =~ ^[[:space:]]*\(Default\)[[:space:]]+REG_SZ[[:space:]]+(.+)$ ]] && [[ "$inMainVoiceToken" == true ]]; then + # Only capture voice name if we haven't already got one for this token + if [[ -z "$currentName" ]]; then + currentName="${BASH_REMATCH[1]}" + # Clean up the voice name as well + currentName=$(echo "$currentName" | tr -d '\r\n' | sed 's/[[:space:]]*$//') + fi + fi + done <<< "$allOutput" + + # Don't forget the last voice + if [[ -n "$currentKey" && -n "$currentName" ]]; then + voices+=("$currentName") + voiceKeys+=("$currentKey") + fi + + # Now search for L&H TTS voices + local lhOutput + lhOutput=$(WINEPREFIX="$WINEPREFIX" "$wine" reg query "HKLM\\SOFTWARE\\L&H\\TTS\\V6.0\\Voice" /s 2>/dev/null) + + if [[ -n "$lhOutput" ]]; then + while IFS= read -r line; do + # Clean up the line first + line=$(echo "$line" | tr -d '\r\n' | sed 's/[[:space:]]*$//') + + # Look for voice name entries like "Carol REG_SZ {227A0E40-A92A-11d1-B17B-0020AFED142E}" + if [[ "$line" =~ ^[[:space:]]*([A-Za-z]+)[[:space:]]+REG_SZ[[:space:]]+\{([^}]+)\}$ ]]; then + local lhVoiceName="${BASH_REMATCH[1]}" + local lhVoiceGuid="${BASH_REMATCH[2]}" + + # Add L&H prefix to distinguish from SAPI voices (escape ampersand for YAD) + voices+=("L&H $lhVoiceName") + voiceKeys+=("LH_$lhVoiceGuid") + fi + done <<< "$lhOutput" + fi + + if [[ ${#voices[@]} -eq 0 ]]; then + return 1 + fi + + # Export arrays for use in other functions + export voiceList=("${voices[@]}") + export voiceKeyList=("${voiceKeys[@]}") + return 0 +} + +get_current_voice() { + # Get current default voice + local currentVoice + currentVoice=$(WINEPREFIX="$WINEPREFIX" "$wine" reg query "HKCU\\SOFTWARE\\Microsoft\\Speech\\Voices" /v "DefaultTokenId" 2>/dev/null | grep "REG_SZ" | sed 's/.*REG_SZ[[:space:]]*//') + + if [[ -n "$currentVoice" ]]; then + # Extract just the voice key from the full registry path + # The path format is: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSMike + if [[ "$currentVoice" =~ Tokens\\([^\\]+)$ ]]; then + local voiceKey="${BASH_REMATCH[1]}" + # Clean up any whitespace or special characters + voiceKey=$(echo "$voiceKey" | tr -d '\r\n' | sed 's/[[:space:]]*$//') + echo "$voiceKey" + fi + fi +} + +get_current_rate() { + # Get current speech rate + local currentRate + currentRate=$(WINEPREFIX="$WINEPREFIX" "$wine" reg query "HKCU\\SOFTWARE\\Microsoft\\Speech\\Voices" /v "DefaultTTSRate" 2>/dev/null | grep "REG_DWORD" | sed 's/.*REG_DWORD[[:space:]]*//' | sed 's/^0x//') + + if [[ -n "$currentRate" && "$currentRate" =~ ^[0-9a-fA-F]+$ ]]; then + # Convert hex to decimal + echo $((16#$currentRate)) + else + echo "5" # Default rate fi } set_voice() { - doRestore=1 - local tmp="$1" - local fullVoice - local counter=0 - for x in "${voiceList[@]}" ; do - [[ "$x" = "$tmp" ]] && break - counter=$(( $counter + 1 )) - done - local RHVoiceName="" - local RHVoicePath="${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/" - if [[ -d "$RHVoicePath" ]]; then - RHVoiceName="$(find "$RHVoicePath" -maxdepth 1 -type d -not -path "$RHVoicePath" | head -1)" - if [[ -n "$RHVoiceName" ]]; then - RHVoiceName="${RHVoiceName##*/}" + local voiceName="$1" + local voiceKey="" + + # Find the voice key for the given voice name + local i + for i in "${!voiceList[@]}"; do + if [[ "${voiceList[i]}" == "$voiceName" ]]; then + voiceKey="${voiceKeyList[i]}" + break fi + done + + if [[ -z "$voiceKey" ]]; then + msgbox "Error: Voice '$voiceName' not found." + return 1 fi - fullVoice="${voiceListFullName[$counter]}" - if [[ -n "$RHVoiceName" ]]; then - fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}" + + # Check if this is an L&H voice (cannot be set as system default) + if [[ "$voiceKey" =~ ^LH_ ]]; then + msgbox "L&H voices cannot be set as the system default SAPI voice. They use a proprietary API and must be selected by individual applications that support L&H TTS." + return 1 + fi + + # Kill wine server to ensure registry changes take effect + WINEPREFIX="$WINEPREFIX" "$wineserver" -k 2>/dev/null + + # Set the default voice using wine reg + local fullVoicePath="HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\$voiceKey" + if WINEPREFIX="$WINEPREFIX" "$wine" reg add "HKCU\\SOFTWARE\\Microsoft\\Speech\\Voices" /v "DefaultTokenId" /t REG_SZ /d "$fullVoicePath" /f 2>/dev/null; then + infobox "Voice set to: $voiceName" + return 0 + else + msgbox "Error: Failed to set voice." + return 1 + fi +} + +set_rate() { + local rate="$1" + + # Validate rate (0-10) + if ! [[ "$rate" =~ ^[0-9]$|^10$ ]]; then + msgbox "Error: Rate must be between 0 and 10." + return 1 + fi + + # Kill wine server to ensure registry changes take effect + WINEPREFIX="$WINEPREFIX" "$wineserver" -k 2>/dev/null + + # Set the speech rate using wine reg (convert to hex) + local hexRate + hexRate=$(printf "%x" "$rate") + if WINEPREFIX="$WINEPREFIX" "$wine" reg add "HKCU\\SOFTWARE\\Microsoft\\Speech\\Voices" /v "DefaultTTSRate" /t REG_DWORD /d "0x$hexRate" /f 2>/dev/null; then + infobox "Speech rate set to: $rate" + return 0 + else + msgbox "Error: Failed to set speech rate." + return 1 fi - ${wine}server -k # If we don't do this it's likely wine will overwrite our reverted change or even clobber the registry key entirely - # Remove any existing rate change for voices - $sed -i '/"DefaultTTSRate"=dword:/d' "${WINEPREFIX}/user.reg" - $sed -i -E -e 's/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\'"${fullVoice//\\/\\\\}"'"\n"DefaultTTSRate"=dword:0000000'${rate:-7}'/g' "${WINEPREFIX}/user.reg" } test_voice() { - doRestore=0 - local tmp="$1" - local fullVoice - local counter=0 - for x in "${voiceList[@]}" ; do - [ "$x" = "$tmp" ] && break - counter=$(( $counter + 1 )) - done - local RHVoiceName="" - local RHVoicePath="${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/" - if [[ -d "$RHVoicePath" ]]; then - RHVoiceName="$(find "$RHVoicePath" -maxdepth 1 -type d -not -path "$RHVoicePath" | head -1)" - if [[ -n "$RHVoiceName" ]]; then - RHVoiceName="${RHVoiceName##*/}" - fi - fi - fullVoice="${voiceListFullName[$counter]}" - if [[ -n "$RHVoiceName" ]]; then - fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}" - fi - ${wine}server -k # If we don't do this it's likely wine will overwrite our reverted change or even clobber the registry key entirely - $sed -i -E -e 's/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\'"${fullVoice//\\/\\\\}"'"/g' "${WINEPREFIX}/user.reg" + local voiceName="$1" + + # Set the voice temporarily for testing + set_voice "$voiceName" || return 1 + + # Create test script + mkdir -p "${WINEPREFIX}/drive_c/windows/temp" cat << "EOF" > "${WINEPREFIX}/drive_c/windows/temp/speak.vbs" - dim speechobject - set speechobject=createobject("sapi.spvoice") - speechobject.speak "This is a test of your chosen voice. It contains multiple sentences and punctuation, and is designed to give a full representation of this voices qualities." +dim speechObject +set speechObject = createObject("sapi.spvoice") +speechObject.speak "This is a test of your chosen voice. It contains multiple sentences and punctuation, and is designed to give a full representation of this voice's qualities." EOF - ${wine} cscript "c:\windows\temp\speak.vbs" + + # Test the voice + WINEPREFIX="$WINEPREFIX" "$wine" cscript "c:\\windows\\temp\\speak.vbs" 2>/dev/null } -# Handle voice restore, but only if voice changed -doRestore=1 -trap restore_voice SIGINT +initialize_sapi() { + # Initialize SAPI if not already done + mkdir -p "${WINEPREFIX}/drive_c/windows/temp" + cat << "EOF" > "${WINEPREFIX}/drive_c/windows/temp/init.vbs" +dim speechObject +set speechObject = createObject("sapi.spvoice") +speechObject.speak "" +EOF + WINEPREFIX="$WINEPREFIX" "$wine" cscript "c:\\windows\\temp\\init.vbs" 2>/dev/null +} -# Convert the keys of the command associative array to a format usable by getopts -args="${!command[*]}" -args="${args//[[:space:]]/}" -while getopts "${args}" i ; do - case "$i" in - b) - # Check for valid bottles in all possible locations - if [[ -d ~/.local/wine/${OPTARG} ]]; then - export bottle=~/.local/wine/${OPTARG} - export WINEPREFIX=~/.local/wine/${OPTARG} - elif [[ -d ~/.local/wine32 && ${OPTARG} == "wine32" ]]; then - export bottle=~/.local/wine32 - export WINEPREFIX=~/.local/wine32 - elif [[ -d ~/.local/wine64 && ${OPTARG} == "wine64" ]]; then - export bottle=~/.local/wine64 - export WINEPREFIX=~/.local/wine64 - else - echo "Invalid wine bottle specified." +# Handle command line arguments +while getopts "hr:v:" option; do + case "$option" in + h) help ;; + r) + if ! [[ "$OPTARG" =~ ^[0-9]$|^10$ ]]; then + echo "Error: Rate must be between 0 and 10." exit 1 fi - ;; - h) help;; - r) - if ! [[ "${OPTARG}" =~ ^[0-9A]$ ]]; then - echo "Invalid rate specified. Arguments must be 0-9 or A." - exit 1 - fi - rate="${OPTARG}" - ;; - v) voice="${OPTARG}";; + requestedRate="$OPTARG" + ;; + v) requestedVoice="$OPTARG" ;; + *) help ;; esac done - -# Get the desired wine bottle - -# Offer a list of wine bottles if one isn't specified on the command line. -if [[ -z "${bottle}" ]]; then - declare -a bottles=() - - # Check for wine32 and wine64 bottles - [[ -d ~/.local/wine32 ]] && bottles+=("$HOME/.local/wine32" "wine32") - [[ -d ~/.local/wine64 ]] && bottles+=("$HOME/.local/wine64" "wine64") - - # Add bottles from ~/.local/wine directory - if [[ -d ~/.local/wine ]]; then - for i in $(find ~/.local/wine/ -maxdepth 1 -type d -not -name 'wine' | sort); do - bottles+=("$i" "${i##*/}") - done - fi - - if [[ ${#bottles[@]} -eq 0 ]]; then - echo "No wine bottles found in ~/.local/wine32, ~/.local/wine64, or ~/.local/wine/" - exit 1 - fi - - export WINEPREFIX="$(agm_menu "Set Voice" "Set Voice" "Select A Wine Bottle" "${bottles[@]}")" -fi - -if [[ -z "${WINEPREFIX}" ]]; then - exit 0 +# Check if wine32 bottle exists +if [[ ! -d "$WINEPREFIX" ]]; then + msgbox "Error: Wine32 bottle not found at $WINEPREFIX. Please create it first." + exit 1 fi # Get wine version if available @@ -269,58 +348,96 @@ if [[ -r "${WINEPREFIX}/agm.conf" ]]; then export WINE export WINESERVER fi -wine="${WINE:-$(command -v wine)}" -wineserver="${WINESERVER:-$(command -v wineserver)}" +wine="${WINE:-$HOME/.local/share/audiogame-manager/wine32/bin/wine}" +wineserver="${WINESERVER:-$HOME/.local/share/audiogame-manager/wine32/bin/wineserver}" -# Debug information - comment out or delete when not needed -# echo "Using wine bottle: ${WINEPREFIX}" -# echo "Wine executable: ${wine}" -# echo "Wineserver executable: ${wineserver}" - -# In case the user hasn't run a game using sapi in this prefix yet, let's try to initialize all the registry keys properly. -mkdir -p "${WINEPREFIX}/drive_c/windows/temp" -cat << "EOF" > "${WINEPREFIX}/drive_c/windows/temp/speak.vbs" -dim speechobject -set speechobject=createobject("sapi.spvoice") -speechobject.speak "" -EOF -${wine} cscript "c:\windows\temp\speak.vbs" - -# Create an array of available voices. -ifs="$IFS" -IFS=$'\n' -voiceListFullName=($($grep -P '\[Software\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^\\]+\].*' "${WINEPREFIX}/system.reg" | $sed -E -e 's/\[([^]]+)\].*/\1/g')) -IFS="$ifs" - -# Debug the voice list - comment out or delete when not needed -# echo "Found ${#voiceListFullName[@]} voices in registry" -# for voice in "${voiceListFullName[@]}"; do -# echo "Voice: $voice" -# done - -voiceList=() -for x in "${voiceListFullName[@]}" ; do - voiceList+=("$(echo "$x" | $sed -E -e 's/Software\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\(.+)/\3/g')") -done -oldVoice="$($grep -P '"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"' "${WINEPREFIX}/user.reg" | $sed -E -e 's/"DefaultTokenId"="([^"]+)"/\1/g')" -exit=1 -if [[ "${#voiceList[@]}" -eq 0 ]]; then - agm_msgbox "Set Voice" "Set Voice" "No voices found in ${WINEPREFIX}. Make sure SAPI voices are installed in this Wine prefix." +# Check if wine executable exists +if [[ ! -x "$wine" ]]; then + msgbox "Error: Wine executable not found at $wine" exit 1 fi -while [[ $exit -ne 0 ]] ; do - if [[ -z "${voice}" ]]; then - voice="$(menulist "${voiceList[@]}")" + +# Initialize SAPI +initialize_sapi + +# Get available voices +if ! get_voices; then + msgbox "No SAPI voices found in wine32 bottle. Please install SAPI voices first." + exit 1 +fi + +# Handle command line options +if [[ -n "$requestedRate" ]]; then + set_rate "$requestedRate" +fi + +if [[ -n "$requestedVoice" ]]; then + set_voice "$requestedVoice" + exit 0 +fi + +# Show interactive menu if no voice specified +currentVoice=$(get_current_voice) +currentRate=$(get_current_rate) + +# Verify arrays are properly set +if [[ ${#voiceList[@]} -eq 0 ]]; then + msgbox "Error: No voices loaded." + exit 1 +fi + + +while true; do + # Build menu with current settings + declare -a menuOptions=() + + # Find current voice name for display + currentVoiceName="None" + if [[ -n "$currentVoice" ]]; then + for i in "${!voiceKeyList[@]}"; do + # Clean up the voice key for comparison + cleanKey=$(echo "${voiceKeyList[i]}" | tr -d '\r\n' | sed 's/[[:space:]]*$//') + if [[ "$cleanKey" == "$currentVoice" ]]; then + currentVoiceName="${voiceList[i]}" + break + fi + done fi - - case $? in - 0) - set_voice "$voice" "${rate:-7}" ; exit=0 ;; - 3) - test_voice "$voice";; - *) - restore_voice ; exit=0 ;; + + menuOptions+=("voice" "Select Voice (Current: $currentVoiceName)") + menuOptions+=("rate" "Set Rate (Current: $currentRate)") + menuOptions+=("test" "Test Current Voice") + menuOptions+=("quit" "Exit") + + choice=$(agm_menu "Set Speech" "SAPI Voice Configuration" "Choose an option:" "${menuOptions[@]}") + + case "$choice" in + "voice") + if selectedVoice=$(voice_menu "${voiceList[@]}"); then + if [[ -n "$selectedVoice" ]] && set_voice "$selectedVoice"; then + currentVoice=$(get_current_voice) + fi + fi + ;; + "rate") + if newRate=$(rate_menu); then + if [[ -n "$newRate" ]] && set_rate "$newRate"; then + currentRate=$(get_current_rate) + fi + fi + ;; + "test") + if [[ -n "$currentVoice" && "$currentVoiceName" != "None" ]]; then + infobox "Testing voice: $currentVoiceName" + test_voice "$currentVoiceName" + else + msgbox "No voice selected. Please select a voice first." + fi + ;; + "quit"|"") + break + ;; esac - done +done -exit 0 +exit 0 \ No newline at end of file From 46564d2e0a41a400d203a2d88b58b6966915249a Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sat, 9 Aug 2025 06:44:14 -0400 Subject: [PATCH 49/77] Fixed Bloodshed installer to be win32 so speech will work. --- .install/Bloodshed.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.install/Bloodshed.sh b/.install/Bloodshed.sh index 79915b3..735559c 100644 --- a/.install/Bloodshed.sh +++ b/.install/Bloodshed.sh @@ -1,3 +1,4 @@ +export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmcTCTMep4zp5zTw8ZaXYpjtu9inNPn8bNzwhW6cX97egw?filename=bloodshed.exe" install_wine_bottle cp "${cache}/bloodshed.exe" "$WINEPREFIX/drive_c/Program Files/" From 86b306897ae6108a63c62ad5ad2fd224cc2f7eb7 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 14 Aug 2025 03:39:36 -0400 Subject: [PATCH 50/77] Updated set-voice.sh from the version in master. Change it to only search ~/.local/wine32 since that's where all the 32 bit games go. --- speech/set-voice.sh | 544 +++++++++++++------------------------------- 1 file changed, 156 insertions(+), 388 deletions(-) mode change 100755 => 100644 speech/set-voice.sh diff --git a/speech/set-voice.sh b/speech/set-voice.sh old mode 100755 new mode 100644 index b07cda2..c09ffea --- a/speech/set-voice.sh +++ b/speech/set-voice.sh @@ -1,443 +1,211 @@ #!/usr/bin/env bash -# Set Speech -# Configure SAPI voices and speech rate for wine32 bottle +# Set Voice - Fixed version for audiogame-manager -# License header -# The contents of this file are subject to the Common Public Attribution -# License Version 1.0 (the "License"); you may not use this file except in -# compliance with the License. You may obtain a copy of the License at -# https://opensource.org/licenses/CPAL-1.0. The License is based on the Mozilla Public License Version -# 1.1 but Sections 14 and 15 have been added to cover use of software over a -# computer network and provide for limited attribution for the Original -# Developer. In addition, Exhibit A has been modified to be consistent with -# Exhibit B. -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# The Original Code is audiogame manager. -# -# The Original Developer is not the Initial Developer and is . If -# left blank, the Original Developer is the Initial Developer. -# -# The Initial Developer of the Original Code is Billy "Storm Dragon" Wolfe. All portions of -# the code written by Billy Wolfe are Copyright (c) 2020. All Rights -# Reserved. -# -# Contributor Michael Taboada. -# -# Attribution Copyright Notice: Audiogame manager copyright 2020 Storm Dragon. All rights reserved. -# -# Attribution Phrase (not exceeding 10 words): A Stormux project -# -# Attribution URL: https://stormgames.wolfe.casa -# -# Graphic Image as provided in the Covered Code, if any. -# -# Display of Attribution Information is required in Larger -# Works which are defined in the CPAL as a work which combines Covered Code -# or portions thereof with code not governed by the terms of the CPAL. - -# Detect dialog interface type BEFORE potentially setting DISPLAY -if [[ -z "$DISPLAY" ]]; then - dialogType="dialog" -else - dialogType="yad" +# Set a variable to make mac compatibility easier... +sed="sed" +grep="grep" +if [[ "$(uname)" == "Darwin" ]]; then + sed="gsed" + grep="ggrep" fi +export grep +export sed -# Source dialog interface wrapper -source "${0%/*}/../.includes/dialog-interface.sh" - -# Settings to improve accessibility of dialog +# Settings to improve accessibility of dialog. export DIALOGOPTS='--insecure --no-lines --visit-items' # Turn off debug messages export WINEDEBUG="-all" -# Set DISPLAY if needed -if [[ -z "$DISPLAY" ]]; then - export DISPLAY=:0 +# Set DISPLAY, as needed +if [ -z "$DISPLAY" ] ; then +export DISPLAY=:0 fi -# Set wine prefix to wine32 - this is the only supported bottle for SAPI -export WINEPREFIX="$HOME/.local/wine32" -export bottle="$HOME/.local/wine32" +# Handle arguments +declare -A command=( + [b:]="the wine bottle to use." + [h]="This help screen." + [r:]="Specify voice rate, default is 7, options are 0-9 or A for fastest." + [v:]="Voice name, the voice to use, same as in the menu." +) help() { echo "${0##*/}" echo "Released under the terms of the Common Public Attribution License Version 1.0" echo -e "This is a Stormux project: https://stormux.org\n" echo -e "Usage:\n" - echo "With no arguments, open the voice configuration menu." - echo "-h: Show this help screen." - echo "-r : Set voice rate (0-10, where 10 is fastest)." - echo "-v : Set voice by name." + echo "With no arguments, open the game launcher." + for i in "${!command[@]}" ; do + echo "-${i/:/ }: ${command[${i}]}" + done | sort exit 0 } msgbox() { - agm_msgbox "Set Speech" "Set Speech" "$*" +dialog --clear --msgbox "$*" 0 0 } -infobox() { - local timeout=3 - agm_infobox "Set Speech" "Set Speech" "$*" - read -r -n1 -t $timeout - read -r -t 0.01 -} - -yesno() { - if agm_yesno "Set Speech" "Set Speech" "$*"; then - echo "Yes" - else - echo "No" - fi -} - -voice_menu() { - declare -a menuList=() - for i in "${@}"; do +menulist() { + declare -a menuList + for i in "${@}" ; do menuList+=("$i" "$i") done - agm_menu "Set Speech" "Set Speech" "Please select a voice:" "${menuList[@]}" + dialog --backtitle "Use the up and down arrow keys to find the option you want, then press enter to select it." \ + --clear \ + --extra-button \ + --extra-label "Test Voice" \ + --no-tags \ + --menu "Please select one" 0 0 0 "${menuList[@]}" --stdout + return $? } -rate_menu() { - declare -a rateList=() - for i in {0..10}; do - local desc="Rate $i" - if [[ $i -eq 0 ]]; then - desc="$desc (Slowest)" - elif [[ $i -eq 5 ]]; then - desc="$desc (Default)" - elif [[ $i -eq 10 ]]; then - desc="$desc (Fastest)" - fi - rateList+=("$i" "$desc") - done - agm_menu "Set Speech" "Set Speech" "Please select speech rate:" "${rateList[@]}" -} - -get_voices() { - # Get list of available voices using wine reg query - declare -a voices - declare -a voiceKeys - - # First, get Microsoft SAPI voices - local allOutput - allOutput=$(WINEPREFIX="$WINEPREFIX" "$wine" reg query "HKLM\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens" /s 2>/dev/null) - - # Parse output to find voice keys and names - local currentKey="" - local currentName="" - local inMainVoiceToken=false - - while IFS= read -r line; do - # Clean up the line first - line=$(echo "$line" | tr -d '\r\n' | sed 's/[[:space:]]*$//') - - # Check if this is a main voice token registry key line (exactly one level deep) - if [[ "$line" =~ ^HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\([^\\]+)$ ]]; then - # Save previous voice if we found a name and had collected both key and name - if [[ -n "$currentKey" && -n "$currentName" ]]; then - voices+=("$currentName") - voiceKeys+=("$currentKey") - fi - # Start new voice - clean up any carriage returns or whitespace - currentKey="${BASH_REMATCH[1]}" - currentName="" - inMainVoiceToken=true - # Check if this is a subkey (contains additional parts after token name) - elif [[ "$line" =~ ^HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\[^\\]+\\ ]]; then - # This is a subkey, not a main voice token - inMainVoiceToken=false - # Check if this is a default value line with voice name and we're in main token - elif [[ "$line" =~ ^[[:space:]]*\(Default\)[[:space:]]+REG_SZ[[:space:]]+(.+)$ ]] && [[ "$inMainVoiceToken" == true ]]; then - # Only capture voice name if we haven't already got one for this token - if [[ -z "$currentName" ]]; then - currentName="${BASH_REMATCH[1]}" - # Clean up the voice name as well - currentName=$(echo "$currentName" | tr -d '\r\n' | sed 's/[[:space:]]*$//') - fi - fi - done <<< "$allOutput" - - # Don't forget the last voice - if [[ -n "$currentKey" && -n "$currentName" ]]; then - voices+=("$currentName") - voiceKeys+=("$currentKey") - fi - - # Now search for L&H TTS voices - local lhOutput - lhOutput=$(WINEPREFIX="$WINEPREFIX" "$wine" reg query "HKLM\\SOFTWARE\\L&H\\TTS\\V6.0\\Voice" /s 2>/dev/null) - - if [[ -n "$lhOutput" ]]; then - while IFS= read -r line; do - # Clean up the line first - line=$(echo "$line" | tr -d '\r\n' | sed 's/[[:space:]]*$//') - - # Look for voice name entries like "Carol REG_SZ {227A0E40-A92A-11d1-B17B-0020AFED142E}" - if [[ "$line" =~ ^[[:space:]]*([A-Za-z]+)[[:space:]]+REG_SZ[[:space:]]+\{([^}]+)\}$ ]]; then - local lhVoiceName="${BASH_REMATCH[1]}" - local lhVoiceGuid="${BASH_REMATCH[2]}" - - # Add L&H prefix to distinguish from SAPI voices (escape ampersand for YAD) - voices+=("L&H $lhVoiceName") - voiceKeys+=("LH_$lhVoiceGuid") - fi - done <<< "$lhOutput" - fi - - if [[ ${#voices[@]} -eq 0 ]]; then - return 1 - fi - - # Export arrays for use in other functions - export voiceList=("${voices[@]}") - export voiceKeyList=("${voiceKeys[@]}") - return 0 -} - -get_current_voice() { - # Get current default voice - local currentVoice - currentVoice=$(WINEPREFIX="$WINEPREFIX" "$wine" reg query "HKCU\\SOFTWARE\\Microsoft\\Speech\\Voices" /v "DefaultTokenId" 2>/dev/null | grep "REG_SZ" | sed 's/.*REG_SZ[[:space:]]*//') - - if [[ -n "$currentVoice" ]]; then - # Extract just the voice key from the full registry path - # The path format is: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\MSMike - if [[ "$currentVoice" =~ Tokens\\([^\\]+)$ ]]; then - local voiceKey="${BASH_REMATCH[1]}" - # Clean up any whitespace or special characters - voiceKey=$(echo "$voiceKey" | tr -d '\r\n' | sed 's/[[:space:]]*$//') - echo "$voiceKey" - fi - fi -} - -get_current_rate() { - # Get current speech rate - local currentRate - currentRate=$(WINEPREFIX="$WINEPREFIX" "$wine" reg query "HKCU\\SOFTWARE\\Microsoft\\Speech\\Voices" /v "DefaultTTSRate" 2>/dev/null | grep "REG_DWORD" | sed 's/.*REG_DWORD[[:space:]]*//' | sed 's/^0x//') - - if [[ -n "$currentRate" && "$currentRate" =~ ^[0-9a-fA-F]+$ ]]; then - # Convert hex to decimal - echo $((16#$currentRate)) - else - echo "5" # Default rate +restore_voice() { + if [[ $doRestore -eq 0 ]]; then + ${wine}server -k + $sed -i -E -e 's/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"/"DefaultTokenId"="'"${oldVoice//\\/\\\\}"'"/g' "${WINEPREFIX}/user.reg" fi } set_voice() { - local voiceName="$1" - local voiceKey="" - - # Find the voice key for the given voice name - local i - for i in "${!voiceList[@]}"; do - if [[ "${voiceList[i]}" == "$voiceName" ]]; then - voiceKey="${voiceKeyList[i]}" - break - fi + doRestore=1 + local tmp="$1" + local fullVoice + local counter=0 + for x in "${voiceList[@]}" ; do + [[ "$x" = "$tmp" ]] && break + counter=$(( $counter + 1 )) done - - if [[ -z "$voiceKey" ]]; then - msgbox "Error: Voice '$voiceName' not found." - return 1 - fi - - # Check if this is an L&H voice (cannot be set as system default) - if [[ "$voiceKey" =~ ^LH_ ]]; then - msgbox "L&H voices cannot be set as the system default SAPI voice. They use a proprietary API and must be selected by individual applications that support L&H TTS." - return 1 - fi - - # Kill wine server to ensure registry changes take effect - WINEPREFIX="$WINEPREFIX" "$wineserver" -k 2>/dev/null - - # Set the default voice using wine reg - local fullVoicePath="HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\$voiceKey" - if WINEPREFIX="$WINEPREFIX" "$wine" reg add "HKCU\\SOFTWARE\\Microsoft\\Speech\\Voices" /v "DefaultTokenId" /t REG_SZ /d "$fullVoicePath" /f 2>/dev/null; then - infobox "Voice set to: $voiceName" - return 0 - else - msgbox "Error: Failed to set voice." - return 1 - fi -} - -set_rate() { - local rate="$1" - - # Validate rate (0-10) - if ! [[ "$rate" =~ ^[0-9]$|^10$ ]]; then - msgbox "Error: Rate must be between 0 and 10." - return 1 - fi - - # Kill wine server to ensure registry changes take effect - WINEPREFIX="$WINEPREFIX" "$wineserver" -k 2>/dev/null - - # Set the speech rate using wine reg (convert to hex) - local hexRate - hexRate=$(printf "%x" "$rate") - if WINEPREFIX="$WINEPREFIX" "$wine" reg add "HKCU\\SOFTWARE\\Microsoft\\Speech\\Voices" /v "DefaultTTSRate" /t REG_DWORD /d "0x$hexRate" /f 2>/dev/null; then - infobox "Speech rate set to: $rate" - return 0 - else - msgbox "Error: Failed to set speech rate." - return 1 - fi + local RHVoiceName="$(find "${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/" -maxdepth 1 -type d 2>/dev/null | head -1)" + RHVoiceName="${RHVoiceName##*/}" + fullVoice="${voiceListFullName[$counter]}" + fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}" + ${wine}server -k + # Remove any existing rate change for voices + $sed -i '/"DefaultTTSRate"=dword:/d' "${WINEPREFIX}/user.reg" + $sed -i -E -e 's/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\'"${fullVoice//\\/\\\\}"'"\n"DefaultTTSRate"=dword:0000000'${rate:-7}'/g' "${WINEPREFIX}/user.reg" } test_voice() { - local voiceName="$1" - - # Set the voice temporarily for testing - set_voice "$voiceName" || return 1 - - # Create test script - mkdir -p "${WINEPREFIX}/drive_c/windows/temp" - cat << "EOF" > "${WINEPREFIX}/drive_c/windows/temp/speak.vbs" -dim speechObject -set speechObject = createObject("sapi.spvoice") -speechObject.speak "This is a test of your chosen voice. It contains multiple sentences and punctuation, and is designed to give a full representation of this voice's qualities." + doRestore=0 + local tmp="$1" + local fullVoice + local counter=0 + for x in "${voiceList[@]}" ; do + [ "$x" = "$tmp" ] && break + counter=$(( $counter + 1 )) + done + local RHVoiceName="$(find "${WINEPREFIX}/drive_c/ProgramData/Olga Yakovleva/RHVoice/data/voices/" -maxdepth 1 -type d 2>/dev/null | head -1)" + RHVoiceName="${RHVoiceName##*/}" + fullVoice="${voiceListFullName[$counter]}" + fullVoice="${fullVoice/RHVoice/RHVoice\\\\${RHVoiceName}}" + ${wine}server -k +$sed -i -E -e 's/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"/"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\'"${fullVoice//\\/\\\\}"'"/g' "${WINEPREFIX}/user.reg" + cat << "EOF" > "${bottle}/drive_c/windows/temp/speak.vbs" + dim speechobject + set speechobject=createobject("sapi.spvoice") + speechobject.speak "This is a test of your chosen voice. It contains multiple sentences and punctuation, and is designed to give a full representation of this voices qualities." EOF - - # Test the voice - WINEPREFIX="$WINEPREFIX" "$wine" cscript "c:\\windows\\temp\\speak.vbs" 2>/dev/null + ${wine} cscript "c:\windows\temp\speak.vbs" } -initialize_sapi() { - # Initialize SAPI if not already done - mkdir -p "${WINEPREFIX}/drive_c/windows/temp" - cat << "EOF" > "${WINEPREFIX}/drive_c/windows/temp/init.vbs" -dim speechObject -set speechObject = createObject("sapi.spvoice") -speechObject.speak "" -EOF - WINEPREFIX="$WINEPREFIX" "$wine" cscript "c:\\windows\\temp\\init.vbs" 2>/dev/null -} +# Handle voice restore, but only if voice changed +doRestore=1 +trap restore_voice SIGINT -# Handle command line arguments -while getopts "hr:v:" option; do - case "$option" in - h) help ;; - r) - if ! [[ "$OPTARG" =~ ^[0-9]$|^10$ ]]; then - echo "Error: Rate must be between 0 and 10." +# Convert the keys of the command associative array to a format usable by getopts +args="${!command[*]}" +args="${args//[[:space:]]/}" +while getopts "${args}" i ; do + case "$i" in + b) + if ! [[ -d ~/".local/wine/${OPTARG}" ]]; then + echo "Invalid wine bottle specified." exit 1 fi - requestedRate="$OPTARG" - ;; - v) requestedVoice="$OPTARG" ;; - *) help ;; + export bottle=~/".local/wine/${OPTARG}" + export WINEPREFIX=~/".local/wine/${OPTARG}" + ;; + h) help;; + r) + if ! [[ "${OPTARG}" =~ ^[0-9A]$ ]]; then + echo "Invalid rate specified. Arguments must be 0-9 or A." + exit 1 + fi + rate="${OPTARG}" + ;; + v) voice="${OPTARG}";; esac done -# Check if wine32 bottle exists -if [[ ! -d "$WINEPREFIX" ]]; then - msgbox "Error: Wine32 bottle not found at $WINEPREFIX. Please create it first." - exit 1 +# Get the desired wine bottle +# Offer a list of wine bottles if one isn't specified on the command line. +if [[ -z "${bottle}" ]]; then + declare -a bottle + for i in $(find ~/.local/wine/ -maxdepth 1 -type d -not -name 'wine' | sort) ; do + bottle+=("$i" "${i##*/}") + done + export WINEPREFIX="$(dialog --backtitle "Use the up and down arrow keys to find the option you want, then press enter to select it." \ + --clear \ + --no-tags \ + --menu "Select A Wine Bottle" 0 0 0 "${bottle[@]}" --stdout)" +fi + +if [[ -z "${WINEPREFIX}" ]]; then + exit 0 fi -# Get wine version if available +export bottle="$WINEPREFIX" + +# Get wine version if available - Use wine32 for SAPI games if [[ -r "${WINEPREFIX}/agm.conf" ]]; then source "${WINEPREFIX}/agm.conf" export WINE export WINESERVER fi -wine="${WINE:-$HOME/.local/share/audiogame-manager/wine32/bin/wine}" -wineserver="${WINESERVER:-$HOME/.local/share/audiogame-manager/wine32/bin/wineserver}" -# Check if wine executable exists -if [[ ! -x "$wine" ]]; then - msgbox "Error: Wine executable not found at $wine" - exit 1 +# Use wine32 installation from audiogame-manager +wine32Dir="${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/wine32" +if [[ -f "$wine32Dir/bin/wine" ]]; then + wine="$wine32Dir/bin/wine" +else + wine="${WINE:-$(command -v wine)}" fi -# Initialize SAPI -initialize_sapi +# In case the user hasn't run a game using sapi in this prefix yet, let's try to initialize all the registry keys properly. +cat << "EOF" > "${bottle}/drive_c/windows/temp/speak.vbs" +dim speechobject +set speechobject=createobject("sapi.spvoice") +speechobject.speak "" +EOF +${wine} cscript "c:\windows\temp\speak.vbs" -# Get available voices -if ! get_voices; then - msgbox "No SAPI voices found in wine32 bottle. Please install SAPI voices first." - exit 1 -fi - -# Handle command line options -if [[ -n "$requestedRate" ]]; then - set_rate "$requestedRate" -fi - -if [[ -n "$requestedVoice" ]]; then - set_voice "$requestedVoice" - exit 0 -fi - -# Show interactive menu if no voice specified -currentVoice=$(get_current_voice) -currentRate=$(get_current_rate) - -# Verify arrays are properly set -if [[ ${#voiceList[@]} -eq 0 ]]; then - msgbox "Error: No voices loaded." - exit 1 -fi - - -while true; do - # Build menu with current settings - declare -a menuOptions=() - - # Find current voice name for display - currentVoiceName="None" - if [[ -n "$currentVoice" ]]; then - for i in "${!voiceKeyList[@]}"; do - # Clean up the voice key for comparison - cleanKey=$(echo "${voiceKeyList[i]}" | tr -d '\r\n' | sed 's/[[:space:]]*$//') - if [[ "$cleanKey" == "$currentVoice" ]]; then - currentVoiceName="${voiceList[i]}" - break - fi - done - fi - - menuOptions+=("voice" "Select Voice (Current: $currentVoiceName)") - menuOptions+=("rate" "Set Rate (Current: $currentRate)") - menuOptions+=("test" "Test Current Voice") - menuOptions+=("quit" "Exit") - - choice=$(agm_menu "Set Speech" "SAPI Voice Configuration" "Choose an option:" "${menuOptions[@]}") - - case "$choice" in - "voice") - if selectedVoice=$(voice_menu "${voiceList[@]}"); then - if [[ -n "$selectedVoice" ]] && set_voice "$selectedVoice"; then - currentVoice=$(get_current_voice) - fi - fi - ;; - "rate") - if newRate=$(rate_menu); then - if [[ -n "$newRate" ]] && set_rate "$newRate"; then - currentRate=$(get_current_rate) - fi - fi - ;; - "test") - if [[ -n "$currentVoice" && "$currentVoiceName" != "None" ]]; then - infobox "Testing voice: $currentVoiceName" - test_voice "$currentVoiceName" - else - msgbox "No voice selected. Please select a voice first." - fi - ;; - "quit"|"") - break - ;; - esac +# Create an array of available voices. +ifs="$IFS" +IFS=$'\n' +voiceListFullName=($($grep -P '\[Software\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^\\]+\].*' "${WINEPREFIX}/system.reg" | $sed -E -e 's/\[([^]]+)\].*/\1/g')) +IFS="$ifs" +voiceList=() +for x in "${voiceListFullName[@]}" ; do + voiceList+=("$(echo "$x" | $sed -E -e 's/Software\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\(.+)/\3/g')") done +oldVoice="$($grep -P '"DefaultTokenId"="HKEY_LOCAL_MACHINE\\\\(SOFTWARE|Software)\\\\(Wow6432Node\\\\|)Microsoft\\\\Speech\\\\Voices\\\\Token(Enum|)s\\\\[^"]+"' "${WINEPREFIX}/user.reg" | $sed -E -e 's/"DefaultTokenId"="([^"]+)"/\1/g')" +exit=1 +if [[ "${#voiceList[@]}" -eq 0 ]]; then + dialog --msgbox "No voices found." -1 -1 + exit 1 +fi +while [[ $exit -ne 0 ]] ; do + if [[ -z "${voice}" ]]; then + voice="$(menulist "${voiceList[@]}")" + fi -exit 0 \ No newline at end of file + case $? in + 0) + set_voice "$voice" "${rate:-7}" ; exit=0 ;; + 3) + test_voice "$voice";; + *) + restore_voice ; exit=0 ;; + esac + done + +exit 0 From 6a3634545e71f5e6049c19df93c7dc7ce0431b93 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 14 Aug 2025 03:40:08 -0400 Subject: [PATCH 51/77] Fixed execute permissions on the set-voice script. --- speech/set-voice.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 speech/set-voice.sh diff --git a/speech/set-voice.sh b/speech/set-voice.sh old mode 100644 new mode 100755 From f7eef7daf57f510918e4a4155628f6ce84cfda84 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Fri, 29 Aug 2025 14:24:14 -0400 Subject: [PATCH 52/77] Updated ipfs for nvda tools. --- audiogame-manager.sh | 29 +++++++++++++---------------- game-scripts/conjury-update.sh | 6 +++--- game-scripts/crazy-party-update.sh | 2 +- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 1e6958b..2f471ef 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -151,7 +151,7 @@ EOF # Setup nvda2speechd for accessibility echo "# Setting up accessibility support..." - download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd" + download "${nvda2speechdBinary}" 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" @@ -439,8 +439,7 @@ create_game_array() { update_nvda_dlls() { # Ensure we have the replacement DLLs source .includes/functions.sh - download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" \ - "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" + download "${nvdaControllerClientDll}" "${nvdaControllerClient64Dll}" # Update wine64 bottle (most common) if [[ -d "$HOME/.local/wine64" ]]; then @@ -450,23 +449,23 @@ update_nvda_dlls() { case "${basename,,}" in "nvdacontrollerclient32.dll") - replacement="${cache}/nvda2speechd32.dll" + replacement="${cache}/nvdaControllerClient32.dll" ;; "nvdacontrollerclient64.dll") - replacement="${cache}/nvda2speechd64.dll" + replacement="${cache}/nvdaControllerClient64.dll" ;; "nvdacontrollerclient.dll") # Use file command to detect architecture if file "$dllFile" | grep -q "PE32+"; then - replacement="${cache}/nvda2speechd64.dll" + replacement="${cache}/nvdaControllerClient64.dll" elif file "$dllFile" | grep -q "PE32"; then - replacement="${cache}/nvda2speechd32.dll" + replacement="${cache}/nvdaControllerClient32.dll" fi ;; esac if [[ -n "$replacement" ]] && [[ -f "$replacement" ]]; then - echo "Updating $dllFile with nvda2speechd" + echo "Updating $dllFile with nvdaControllerClient" cp "$replacement" "$dllFile" fi done @@ -475,8 +474,8 @@ update_nvda_dlls() { # Also update wine32 bottle if it exists if [[ -d "$HOME/.local/wine32" ]]; then find "$HOME/.local/wine32" -type f \( -iname "nvdaControllerClient*.dll" \) -print0 | while IFS= read -r -d '' dllFile; do - echo "Updating $dllFile with nvda2speechd32" - cp "${cache}/nvda2speechd32.dll" "$dllFile" + echo "Updating $dllFile with nvdaControllerClient32" + cp "${cache}/nvdaControllerClient32.dll" "$dllFile" done fi } @@ -489,11 +488,7 @@ game_launcher() { # Start nvda2speechd if available if [[ -x ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd ]]; then - if command -v FEXLoader &> /dev/null ; then - FEXLoader -- ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd &> /dev/null & - else - ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd &> /dev/null & - fi + ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd &> /dev/null & fi # Replace NVDA controller client DLLs in wine64 bottle @@ -621,7 +616,9 @@ unset manualInstall unset version # ipfs gateway export ipfsGateway="${ipfsGateway:-https://ipfs.stormux.org}" -export nvdaControllerClientDll="${ipfsGateway}/ipfs/QmWu7YdSbKMk1Qm5DKvEA5hk1YuAK8wVkwhDf2CsmPkmF1?filename=nvdaControllerClient32.dll" +export nvdaControllerClientDll="${ipfsGateway}/ipfs/Qmd1JXdDoKJVnoaQssDiBgRpbgwKUwdJigiPw8iiYro3vt?filename=nvdaControllerClient32.dll" +export nvdaControllerClient64Dll="${ipfsGateway}/ipfs/QmcPoBTm6eCFF4R4uUc1of3rtrqMVx3HFN1U1jHosay8EX?filename=nvdaControllerClient64.dll" +export nvda2speechdBinary="${ipfsGateway}/ipfs/QmPxhoNsoFoJC7bCfioBBCcK8tEoSoYpm342z6u7KjFsVz?filename=nvda2speechd" # nvda2speechd server startup is now handled in game_launcher() diff --git a/game-scripts/conjury-update.sh b/game-scripts/conjury-update.sh index 41a4e49..8592899 100755 --- a/game-scripts/conjury-update.sh +++ b/game-scripts/conjury-update.sh @@ -49,11 +49,11 @@ export WINEPREFIX="$HOME/.local/wine/conjury" # Make sure both nvda2speechd 64 and 32 bit are available. # This is needed to work around the change from 64 bit to 32 bit game. -download "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd64.dll" "https://github.com/RastislavKish/nvda2speechd/releases/download/v0.1/nvda2speechd32.dll" +download "${nvdaControllerClient64Dll}" "${nvdaControllerClientDll}" # Now it should be as simple as running get_steam to redownload the game. get_steam 2684520 "https://store.steampowered.com/app/2684520/Conjury/" -find "$WINEPREFIX/drive_c/Program Files/Conjury" -type f -path '*/x86_64/nvdaControllerClient.dll' -exec cp -v "$cache/nvda2speechd64.dll" "{}" \; -find "$WINEPREFIX/drive_c/Program Files/Conjury" -type f -path '*/x86/nvdaControllerClient.dll' -exec cp -v "$cache/nvda2speechd32.dll" "{}" \; +find "$WINEPREFIX/drive_c/Program Files/Conjury" -type f -path '*/x86_64/nvdaControllerClient.dll' -exec cp -v "$cache/nvdaControllerClient64.dll" "{}" \; +find "$WINEPREFIX/drive_c/Program Files/Conjury" -type f -path '*/x86/nvdaControllerClient.dll' -exec cp -v "$cache/nvdaControllerClient32.dll" "{}" \; exit 0 diff --git a/game-scripts/crazy-party-update.sh b/game-scripts/crazy-party-update.sh index 8aa6bc2..a315068 100755 --- a/game-scripts/crazy-party-update.sh +++ b/game-scripts/crazy-party-update.sh @@ -68,7 +68,7 @@ url="http://pragmapragma.free.fr/crazy-party/Crazy-Party-beta${newVersion}.zip" wget -O "${cache}/Crazy-Party-beta${newVersion}.zip" "$url" || { echo "Could not download file."; exit 1; } unzip -DDod "${WINEPREFIX}/drive_c/Program Files" "${cache}/Crazy-Party-beta${newVersion}.zip" find "${WINEPREFIX}" -type f -name 'Tolk.dll' -exec cp -v "${cache}/Tolk.dll" "{}" \; -find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvda2speechd64.dll" "{}" \; +find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvdaControllerClient64.dll" "{}" \; sed -i "s/Crazy-Party-beta${oldVersion}/Crazy-Party-beta${newVersion}/" "$configFile" cp -v "${WINEPREFIX}/drive_c/Program Files/Crazy-Party-beta${oldVersion}/save.bin" "$HOME/.local/wine/crazy-party/drive_c/Program Files/Crazy-Party-beta${newVersion}/" cp -ruv "${WINEPREFIX}/drive_c/Program Files/Crazy-Party-beta${oldVersion}/"* "$HOME/.local/wine/crazy-party/drive_c/Program Files/Crazy-Party-beta${newVersion}/" 2> /dev/null From 7ff1cd57f7556237edf11eace9a444cd8391f341 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Tue, 9 Sep 2025 17:24:29 -0400 Subject: [PATCH 53/77] Update the installer for Mistworld. After some time cussin and spittin tobaccer juice, I've gotten things somewhat working. Namely: * Set the WINEARCH to win32 (it was thinking the game was 64-bit) * Setting the WINEPREFIX to the new path to reflect architectural changes. * Removing the unnecessary call to install SAPI. The notable problem was that for whatever reason the compiled nvdaControllerClient32.dll the manager was fetching did *not* work with the game. It complained about testIfRunning not being present in the compiled executable, which it certainly was. If you have a spare copy of the DLL lying around that works you should back that up and if you switch to the testing branch copy it *both* to AGM cache and the game directory. --- .install/Mist World.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.install/Mist World.sh b/.install/Mist World.sh index 6fda612..8c1aadd 100644 --- a/.install/Mist World.sh +++ b/.install/Mist World.sh @@ -1,6 +1,7 @@ +export WINEARCH="win32" export winVer="win7" +export WINEPREFIX="$HOME/.local/wine32" get_installer "Mist World_Setup.exe" "https://drive.google.com/uc?export=download&id=12YeUqorkkMT46ZSR5pcfWxSY8DHOLxZ-" -install_wine_bottle sapi install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/Program Files/Mist World" "$cache/Mist World_Setup.exe" sed -i 's/1024m/768m/g' "$WINEPREFIX/drive_c/Program Files/Mist World/mw.exe.vmoptions" cp "$WINEPREFIX/drive_c/Program Files/Mist World/"{mw.exe.vmoptions,update.exe.vmoptions} From 5590a4cde639ece75258174c7fb9e83fc6be62e5 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Tue, 9 Sep 2025 17:46:00 -0400 Subject: [PATCH 54/77] Fix WINEARCH preservation in wine bottle management Preserve explicitly set WINEARCH variables instead of unsetting them in wine environment functions. This ensures that installers setting WINEARCH="win32" are properly respected for architecture selection. Changes: - Remove unset WINEARCH from get_bottle() and set_wine_env() - Add comments explaining WINEARCH preservation - Update debug messages to show current WINEARCH value --- .includes/bottle.sh | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index 9bce43b..e88f3a4 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -13,12 +13,11 @@ get_bottle() { 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)" + # Keep WINEARCH for compatibility + echo "DEBUG: Using managed wine32 for LAUNCHER (WINE=$WINE, PATH updated)" else - # Clear wine variables for system wine - unset WINE WINESERVER WINEARCH + # Clear wine variables for system wine but preserve WINEARCH if set + unset WINE WINESERVER echo "DEBUG: Using system wine for LAUNCHER (architecture $architecture)" fi } @@ -30,11 +29,12 @@ set_wine_env() { export WINE="$wine32" export WINESERVER="$wine32server" export PATH="${wine32%/*}:$PATH" - unset WINEARCH - echo "DEBUG: Set wine32 environment for INSTALLATION (WINE=$WINE)" + # Don't unset WINEARCH - preserve it for proper architecture selection + echo "DEBUG: Set wine32 environment for INSTALLATION (WINE=$WINE, WINEARCH=$WINEARCH)" else - unset WINE WINESERVER WINEARCH - echo "DEBUG: Set system wine environment for INSTALLATION" + unset WINE WINESERVER + # Don't unset WINEARCH - preserve it for proper architecture selection + echo "DEBUG: Set system wine environment for INSTALLATION (WINEARCH=$WINEARCH)" fi } @@ -108,6 +108,7 @@ install_wine_bottle() { # Just set up the wine environment for game installation # Determine architecture from WINEARCH or speechsdk dependency + # Preserve existing WINEARCH if already set if [[ -z "$WINEARCH" ]]; then if [[ "$*" =~ speechsdk ]]; then export WINEARCH="win32" From f9df5b42998aa70485185402bb80c6c2f5bb2bd2 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Tue, 9 Sep 2025 18:25:18 -0400 Subject: [PATCH 55/77] Fix a typo. It is Shooter.exe --- .install/Shooter.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.install/Shooter.sh b/.install/Shooter.sh index 72802be..c310908 100644 --- a/.install/Shooter.sh +++ b/.install/Shooter.sh @@ -3,4 +3,4 @@ export winVer="win7" get_installer "shooter-win.zip" "https://brynify.itch.io/shooter" install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/shooter" "${cache}/shooter-win.zip" -add_launcher "c:\Program Files\shooter\shooter.exe" +add_launcher "c:\Program Files\shooter\Shooter.exe" From 7bc480fbbcfe8edd538b0295289ed4426773885b Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Thu, 11 Sep 2025 14:02:58 -0400 Subject: [PATCH 56/77] Fix Bokurano Daibouken three. It's actually a 32-bit game but it was being installed to the 64 bit prefix. --- .install/Bokurano Daibouken 3.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.install/Bokurano Daibouken 3.sh b/.install/Bokurano Daibouken 3.sh index 25d69d5..79239c1 100644 --- a/.install/Bokurano Daibouken 3.sh +++ b/.install/Bokurano Daibouken 3.sh @@ -1,4 +1,3 @@ -# Source dialog interface wrapper source "${0%/*}/../.includes/dialog-interface.sh" if [[ ! -r "${cache}/bk3-dict.dat" ]]; then @@ -17,6 +16,7 @@ fi download "https://www.nyanchangames.com/softs/nn3_setup.exe" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" +export WINEARCH=win32 install_wine_bottle install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/bk3" "${cache}/nn3_setup.exe" add_launcher "c:\nyanchangame\bk3\play.exe" From 1e3a3688812dc17821dfc3c38a46ac5c6858736d Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Thu, 11 Sep 2025 14:56:23 -0400 Subject: [PATCH 57/77] Fix BK# some more. The translations are now copied into place. --- .install/Bokurano Daibouken 3.sh | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.install/Bokurano Daibouken 3.sh b/.install/Bokurano Daibouken 3.sh index 79239c1..ad91ae1 100644 --- a/.install/Bokurano Daibouken 3.sh +++ b/.install/Bokurano Daibouken 3.sh @@ -1,5 +1,10 @@ -source "${0%/*}/../.includes/dialog-interface.sh" +download "https://www.nyanchangames.com/softs/nn3_setup.exe" +# Uses standard wine path based on architecture (win32/win64) +export winVer="win7" +export WINEARCH=win32 +install_wine_bottle +install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/bk3" "${cache}/nn3_setup.exe" if [[ ! -r "${cache}/bk3-dict.dat" ]]; then echo "http://www.nyanchangames.com/order/bk3translate.html" | xclip -selection clipboard 2> /dev/null agm_msgbox "Bokurano Daibouken 3" "Bokurano Daibouken 3" "If you would like English translations, the file is available at http://www.nyanchangames.com/order/bk3translate.html. Save the dict.dat file to your Downloads or Desktop directory. For convenience the url has been copied to your clipboard. Press enter when you are ready to continue." @@ -13,10 +18,7 @@ done if [[ "${#dictFile}" -ge 3 ]] && [[ ! -r "${cache}/bk3-dict.dat" ]]; then agm_yesno "Bokurano Daibouken 3" "Bokurano Daibouken 3" "Possible English translation file found at $dictFile. Would you like to use it for BK3?" && cp -fv "$dictFile" "${cache}/bk3-dict.dat" fi -download "https://www.nyanchangames.com/softs/nn3_setup.exe" -# Uses standard wine path based on architecture (win32/win64) -export winVer="win7" -export WINEARCH=win32 -install_wine_bottle -install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/bk3" "${cache}/nn3_setup.exe" +if [[ -f "${cache}/bk3-dict.dat" ]] ; then + cp -fv "${cache}/bk3-dict.dat" "${WINEPREFIX}/drive_c/nyanchangame/bk3/dict.dat" +fi add_launcher "c:\nyanchangame\bk3\play.exe" From 0cf2145852f584d292f5d35af6726bd5c1d0cea0 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Thu, 11 Sep 2025 16:04:18 -0400 Subject: [PATCH 58/77] Bokurano Daibouken I is 32-bit. Try to fix the custom launch options function. --- .install/Bokurano Daibouken.sh | 1 + audiogame-manager.sh | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/.install/Bokurano Daibouken.sh b/.install/Bokurano Daibouken.sh index c5f0001..830db8b 100644 --- a/.install/Bokurano Daibouken.sh +++ b/.install/Bokurano Daibouken.sh @@ -1,6 +1,7 @@ download "https://www.nyanchangames.com/softs/nn_setup.exe" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" +export WINEARCH="win32" install_wine_bottle install_with_progress 7z "Extracting game files..." x -o"$WINEPREFIX/drive_c/nyanchangame/bk" "${cache}/nn_setup.exe" add_launcher "c:\nyanchangame\bk\play.exe" diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 2f471ef..46062f9 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -340,7 +340,7 @@ kill_game() { # for games that require custom scripts before launch or custom launch parameters custom_launch_parameters() { - if [[ "${game[0]}" == "dragon-pong" ]]; then + if [[ "${game[2]}" == "Dragon Pong" ]]; then "${0%/*}/speech/speak_window_title.sh" DragonPong.exe & pushd "$(winepath "$winePath")" wine "$wineExec" @@ -348,16 +348,16 @@ custom_launch_parameters() { exit 0 fi # executioner's-rage: DLL replacement now handled by update_nvda_dlls() - if [[ "${game[0]}" == "laser-breakout" ]]; then + if [[ "${game[2]}" == "Laser Breakout" ]]; then "${0%/*}/speech/speak_window_title.sh" play.exe & fi - if [[ "${game[0]}" == "bokurano-daibouken-2" ]]; then - "${0%/*}/speech/clipboard_translator.sh" play.exe bokurano-daibouken2 & + if [[ "${game[2]}" == "Bokurano Daibouken 2" ]]; then + "${0%/*}/speech/clipboard_translator.sh" "${game[1]}" bokurano-daibouken2 & fi - if [[ "${game[0]}" == "bokurano-daibouken" ]]; then - "${0%/*}/speech/clipboard_translator.sh" play.exe bokurano-daibouken & + if [[ "${game[2]}" == "Bokurano Daibouken" ]]; then + "${0%/*}/speech/clipboard_translator.sh" "${game[1]}" bokurano-daibouken & fi - if [[ "${game[0]}" =~ "bokurano-daibouken-3" ]]; then + if [[ "${game[2]}" == "Bokurano Daibouken 3" ]]; then dictPath="$(winepath "${winePath}")" if [[ -r "${cache}/bk3-dict.dat" ]] && [[ ! -d "${dictPath}/dict" ]]; then cp "${cache}/bk3-dict.dat" "${dictPath}/dict.dat" @@ -365,44 +365,44 @@ custom_launch_parameters() { # DLL replacement now handled by update_nvda_dlls() if [[ ! -d "${dictPath}/dict" ]] && [[ ! -r "${cache}/bk3-dict.dat" ]]; then find "${WINEPREFIX}/drive_c/nyanchangame/bk3" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; - "${0%/*}/speech/clipboard_translator.sh" play.exe bokurano-daibouken3 & + "${0%/*}/speech/clipboard_translator.sh" "${game[1]}" bokurano-daibouken3 & fi fi - if [[ "${game[0]}" == "bop-it-emulator" ]]; then + if [[ "${game[2]}" == "Bop It Emulator" ]]; then "${0%/*}/speech/speak_window_title.sh" bop.exe & fi - if [[ "${game[0]}" == "road-to-rage" ]]; then + if [[ "${game[2]}" == "Road to Rage" ]]; then "${0%/*}/speech/speak_window_title.sh" trtr.exe & fi - if [[ "${game[0]}" == "sequence-storm" ]]; then + if [[ "${game[2]}" == "Sequence Storm" ]]; then "${0%/*}/speech/clipboard_reader.sh" SequenceStorm & fi - #if [[ "${game[0]}" == "shadow-line" ]]; then + #if [[ "${game[2]}" == "Shadow Line" ]]; then #find "${WINEPREFIX}/drive_c/" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; #"${0%/*}/speech/clipboard_translator.sh" play_sr.exe shadow-line & #fi # sketchbook: DLL replacement now handled by update_nvda_dlls() - if [[ "${game[0]}" == "audiodisc" ]]; then + if [[ "${game[2]}" == "Audiodisc" ]]; then wine "$winePath\\$wineExec" exit 0 fi - if [[ "${game[0]}" == "audioquake" ]]; then + if [[ "${game[2]}" == "Audioquake" ]]; then wine "$winePath\\$wineExec" exit 0 fi - if [[ "${game[0]}" == "screaming-strike-2" ]]; then + if [[ "${game[2]}" == "Screaming Strike 2" ]]; then pushd "$(winepath "$winePath")" wine "$wineExec" popd exit 0 fi - if [[ "${game[0]}" == "warsim" ]]; then + if [[ "${game[2]}" == "Warsim" ]]; then pushd "$(winepath "${game[1]%\\*}")" wine "${game[1]##*\\}" popd exit 0 fi - if [[ "${game[0]}" == "interceptor" ]]; then + if [[ "${game[2]}" == "Interceptor" ]]; then pushd "$(winepath "$winePath")" wine "$wineExec" popd From ba0075e74b9d30269af6b25e61d09ba9bbdbbe3d Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Thu, 11 Sep 2025 16:36:57 -0400 Subject: [PATCH 59/77] Fix clipboard translator process detection for long process names The pgrep command was failing to match Wine processes with long names like "c:\nyanchangame\bk\play.exe" because pgrep by default only matches against the first 15 characters of process names. Fixed by adding the -f flag to match against the full command line. --- speech/clipboard_translator.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/speech/clipboard_translator.sh b/speech/clipboard_translator.sh index f05139d..d9ef4cc 100755 --- a/speech/clipboard_translator.sh +++ b/speech/clipboard_translator.sh @@ -13,7 +13,7 @@ if [[ $# -ne 2 ]]; then fi # Wait for the application to start -while ! pgrep -u "$USER" ^$1 &> /dev/null ; do +while ! pgrep -f -u "$USER" "$1" &> /dev/null ; do sleep 0.05 done @@ -56,7 +56,7 @@ insert_database() { } # Read so long as the application is running -while pgrep -u "$USER" ^$1 &> /dev/null ; do +while pgrep -f -u "$USER" "$1" &> /dev/null ; do sleep 0.05 text="$(xclip -d "${DISPLAY:-:0}" -selection clipboard -o 2> /dev/null)" if [[ -f ~/.agmsilent ]]; then From e3289b92cb019b6d0737693a792ff66020606f59 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Tue, 7 Oct 2025 10:14:54 -0400 Subject: [PATCH 60/77] Fix some critters. After about half an hour of cussin and spitting tobacco juice, I came to some discoveries: * The clipboard translator wasn't even launching successfully. * For BKs 1 and 2, remove the nvda dll thereby forcing it to use the clipboard reader. * Fix up BK2 to go into the right bottle; it is a 32-bit game. --- audiogame-manager.sh | 27 ++++++++++++++++----------- speech/clipboard_translator.sh | 21 ++++++++++++++++++--- speech/speak_window_title.sh | 2 +- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 46062f9..132f650 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -1,5 +1,8 @@ #!/usr/bin/env bash +# Get script directory for relative paths +scriptDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + # Dialog accessibility export DIALOGOPTS='--no-lines --visit-items' @@ -171,7 +174,7 @@ game_installer() { # Create the menu of available games by reading from .install directory declare -a menuList # Get all .sh files from .install directory, excluding those starting with # as first line. - mapfile -t sortedGames < <(for f in "${0%/*}/.install/"*.sh; do + mapfile -t sortedGames < <(for f in "${scriptDir}/.install/"*.sh; do # Skip if first line starts with # [[ $(head -n1 "$f") == "#"* ]] && continue echo "${f##*/%.sh}" @@ -214,7 +217,7 @@ game_installer() { ;; *) # Convert game name to filename format - local installScript="${0%/*}/.install/${game}.sh" + local installScript="${scriptDir}/.install/${game}.sh" # Check if install script exists if [[ -f "$installScript" ]]; then # Source and execute the install script @@ -341,7 +344,7 @@ kill_game() { # for games that require custom scripts before launch or custom launch parameters custom_launch_parameters() { if [[ "${game[2]}" == "Dragon Pong" ]]; then - "${0%/*}/speech/speak_window_title.sh" DragonPong.exe & + "${scriptDir}/speech/speak_window_title.sh" DragonPong.exe & pushd "$(winepath "$winePath")" wine "$wineExec" popd @@ -349,13 +352,15 @@ custom_launch_parameters() { fi # executioner's-rage: DLL replacement now handled by update_nvda_dlls() if [[ "${game[2]}" == "Laser Breakout" ]]; then - "${0%/*}/speech/speak_window_title.sh" play.exe & + "${scriptDir}/speech/speak_window_title.sh" play.exe & fi if [[ "${game[2]}" == "Bokurano Daibouken 2" ]]; then - "${0%/*}/speech/clipboard_translator.sh" "${game[1]}" bokurano-daibouken2 & + find "${WINEPREFIX}/drive_c/nyanchangame/bk2" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; + "${scriptDir}/speech/clipboard_translator.sh" "play.exe" bokurano-daibouken2 & fi if [[ "${game[2]}" == "Bokurano Daibouken" ]]; then - "${0%/*}/speech/clipboard_translator.sh" "${game[1]}" bokurano-daibouken & + find "${WINEPREFIX}/drive_c/nyanchangame/bk" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; + "${scriptDir}/speech/clipboard_translator.sh" "play.exe" bokurano-daibouken & fi if [[ "${game[2]}" == "Bokurano Daibouken 3" ]]; then dictPath="$(winepath "${winePath}")" @@ -365,21 +370,21 @@ custom_launch_parameters() { # DLL replacement now handled by update_nvda_dlls() if [[ ! -d "${dictPath}/dict" ]] && [[ ! -r "${cache}/bk3-dict.dat" ]]; then find "${WINEPREFIX}/drive_c/nyanchangame/bk3" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; - "${0%/*}/speech/clipboard_translator.sh" "${game[1]}" bokurano-daibouken3 & + "${scriptDir}/speech/clipboard_translator.sh" "play.exe" bokurano-daibouken3 & fi fi if [[ "${game[2]}" == "Bop It Emulator" ]]; then - "${0%/*}/speech/speak_window_title.sh" bop.exe & + "${scriptDir}/speech/speak_window_title.sh" bop.exe & fi if [[ "${game[2]}" == "Road to Rage" ]]; then - "${0%/*}/speech/speak_window_title.sh" trtr.exe & + "${scriptDir}/speech/speak_window_title.sh" trtr.exe & fi if [[ "${game[2]}" == "Sequence Storm" ]]; then - "${0%/*}/speech/clipboard_reader.sh" SequenceStorm & + "${scriptDir}/speech/clipboard_reader.sh" SequenceStorm & fi #if [[ "${game[2]}" == "Shadow Line" ]]; then #find "${WINEPREFIX}/drive_c/" -type f -name 'nvdaControllerClient.dll' -exec rm -v "{}" \; - #"${0%/*}/speech/clipboard_translator.sh" play_sr.exe shadow-line & + #"${scriptDir}/speech/clipboard_translator.sh" play_sr.exe shadow-line & #fi # sketchbook: DLL replacement now handled by update_nvda_dlls() if [[ "${game[2]}" == "Audiodisc" ]]; then diff --git a/speech/clipboard_translator.sh b/speech/clipboard_translator.sh index d9ef4cc..b675a2e 100755 --- a/speech/clipboard_translator.sh +++ b/speech/clipboard_translator.sh @@ -7,6 +7,13 @@ # set -Eeuo pipefail # https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/#:~:text=set%20%2Du,is%20often%20highly%20desirable%20behavior. shopt -s expand_aliases +# Debug logging +#DEBUG_LOG="${XDG_CACHE_HOME:-$HOME/.cache}/audiogame-manager/translator-debug.log" +#exec 2>>"$DEBUG_LOG" +#echo "=== Translator started at $(date) ===" >&2 +#echo "Args: $@" >&2 +#set -x + if [[ $# -ne 2 ]]; then echo "Usage: $0 \"application name\" \"file name\"." exit 1 @@ -88,21 +95,29 @@ while pgrep -f -u "$USER" "$1" &> /dev/null ; do # Check if we already have a translation translated=$(sqlite3 "$translationFile" "SELECT translation FROM translations WHERE text = '$normalizedText' LIMIT 1;" 2>/dev/null) - + echo "DEBUG: Database lookup result: '$translated'" >&2 + if [[ -z "$translated" ]]; then + echo "DEBUG: No cached translation, calling trans command" >&2 # Get translation from the trans utility translated="$(trans -no-autocorrect -no-warn -brief "$normalizedText" | head -1 | sed 's/\s*$//' | normalizeUnicode)" - + echo "DEBUG: trans returned: '$translated'" >&2 + if [[ -n "$translated" ]]; then # Insert using echo piping to avoid escaping issues echo "$normalizedText|$translated" | sqlite3 -separator "|" "$translationFile" ".import /dev/stdin temp_import" sqlite3 "$translationFile" "INSERT OR IGNORE INTO translations SELECT * FROM temp_import; DELETE FROM temp_import;" + echo "DEBUG: Saved to database" >&2 fi fi - + # If we got a translation, speak it if [[ -n "$translated" ]]; then + echo "DEBUG: Speaking translation: '$translated'" >&2 spd-say -- "$translated" + else + echo "DEBUG: No translation available, speaking original: '$text'" >&2 + spd-say -- "$text" fi # Clear clipboard diff --git a/speech/speak_window_title.sh b/speech/speak_window_title.sh index d296dfa..3fbd4a1 100755 --- a/speech/speak_window_title.sh +++ b/speech/speak_window_title.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Adapted from the bash snippet found at: # https://bbs.archlinux.org/viewtopic.php?id=117031 From 9b15187917f1357cc67bc97f31d8a62fc00b9060 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Tue, 7 Oct 2025 10:20:19 -0400 Subject: [PATCH 61/77] fixup! Fix some critters. --- .install/Bokurano Daibouken 2.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.install/Bokurano Daibouken 2.sh b/.install/Bokurano Daibouken 2.sh index 210a102..3872265 100644 --- a/.install/Bokurano Daibouken 2.sh +++ b/.install/Bokurano Daibouken 2.sh @@ -1,3 +1,4 @@ +export WINEARCH=win32 download "https://www.nyanchangames.com/softs/nn2_setup.exe" # Uses standard wine path based on architecture (win32/win64) export winVer="win7" From 1811e8fe4aad20ece15855dbc9f3cb58eeb66e0a Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Tue, 7 Oct 2025 10:21:18 -0400 Subject: [PATCH 62/77] Do a bit of work on Dreamland. It's trying to run now, it really is, but... --- .install/Dreamland.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.install/Dreamland.sh b/.install/Dreamland.sh index 287b2af..fab7cfb 100644 --- a/.install/Dreamland.sh +++ b/.install/Dreamland.sh @@ -1,4 +1,9 @@ +export winVer="win10" +export WINEARCH=win32 +export WINEPREFIX="$HOME/.local/wine32" download https://scwl-1251129685.cos.ap-shanghai.myqcloud.com/dreamland/Win/DreamLandSetup.exe -install_wine_bottle ole32 -wine "${cache}/DreamLandSetup.exe" /silent -add_launcher "c:\Program Files\DreamLand\DreamLand.exe" \ No newline at end of file + +install_wine_bottle + +install_with_progress innoextract "Extracting game files..." --output-dir "$WINEPREFIX/drive_c/Program Files/DreamLand" "${cache}/DreamLandSetup.exe" +add_launcher "c:\Program Files\DreamLand\app\DreamLand.exe" From 064c77eb9d2d6edc8044eb3a6152953d550463a6 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Fri, 10 Oct 2025 12:43:41 -0400 Subject: [PATCH 63/77] Add Dreamland support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Install vcrun2019 and d3dcompiler_47 dependencies for Unity 2021.3 - Clean up malformed {app}\ paths created by innoextract - Create music directory with readme files for custom music support - NVDA DLL replacement handled automatically by update_nvda_dlls() - Game works with default wine start launcher 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .gitignore | 1 + .install/Dreamland.sh | 141 ++++++++++++++++ CLAUDE.md | 125 ++++++++++++++ poop.log | 382 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 649 insertions(+) create mode 100644 CLAUDE.md create mode 100644 poop.log diff --git a/.gitignore b/.gitignore index d0ed1f8..20c5e8a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.x.c *.x +music/ diff --git a/.install/Dreamland.sh b/.install/Dreamland.sh index fab7cfb..08e9568 100644 --- a/.install/Dreamland.sh +++ b/.install/Dreamland.sh @@ -4,6 +4,147 @@ export WINEPREFIX="$HOME/.local/wine32" download https://scwl-1251129685.cos.ap-shanghai.myqcloud.com/dreamland/Win/DreamLandSetup.exe install_wine_bottle +winetricks -q vcrun2019 d3dcompiler_47 install_with_progress innoextract "Extracting game files..." --output-dir "$WINEPREFIX/drive_c/Program Files/DreamLand" "${cache}/DreamLandSetup.exe" + +# Clean up malformed paths with literal {app}\ in filenames created by innoextract +find "$WINEPREFIX/drive_c/Program Files/DreamLand" -name '{app}\*' -type f -delete 2>/dev/null || true + +# Create music directory with readme files for custom music support (in game root, not app subdir) +mkdir -p "$WINEPREFIX/drive_c/Program Files/DreamLand/music" +cat > "$WINEPREFIX/drive_c/Program Files/DreamLand/music/readme.txt" << 'EOF' +Placing background music files in this directory can replace some background music played in the game. It supports WAV and OGG formats, and it is recommended to use WAV format for smoother playback. +login = Login interface +fight1 = Fighting state 1 +fight2 = Fighting state 2 +fight3 = Fighting state 3 +linan = Lin'an City +longzangguyuan = Longcang Ancient Plain +xuanjingbingyuan = Xuanjing Ice Field +changjiangshuidao = Yangtze River Waterway +shenxiaotiangong = Shenxiao Heavenly Palace +hemingshan = Heming Mountain +chamagudao = Tea-horse Ancient Passage +dajianlu = Dajianlu +diexueshahai = Bloody Desert +guilinbashu = Bagui Forest +hanquan = Chilly Spring +sizhouyuan = Sizhou Temple +minhai = Min Sea +xueyugaoyuan = Snowy plateau +caiji = Collecting on Snowy plateau +legend = Dreamland Legend +douzhanjing = DouZhanJing +shengsijing = Alive-Dead Land +zhenwuhuanjing = Zhenwu Fairyland +juezhanzhigu = Valley of Decisive battle +wuzhezhidian = The end of martial +shanshuozhiyuan = Shining Abyss +fenzhengshengtan = Altar of Dispute +zhanzhengyaosai = War fortress +luorihuaguang = Sunset Valley - Light +luorianying = Sunset Valley - Shadow +luorihedao = Sunset Valley - River course +luorirongyan = Sunset Valley - Lava Behemoth +luorianmie = Sunset Valley - Dim ancient dragon +taoshadao = Washing Island +taoshadaow = Washing Island - Flood +bangpai = Gang +bangzhan = Gang War +huabingchang = Skating Rink +kuafudating = Cross Server Hall +shilianzhidi = Trial Land +lunhuizhidi = Land of Samsara +suoyaota = Demon Tower +taixuhuanjing = TaiXu HuanJing +yizuchaoxue = Ant Hole +guijingbingtan = Ghost Land +taohuadao = Peach Blossom Island +gaoshanliushui = High Mountain - Flowing Water +beidilangyan = BeiDiLangYan +quanzhenlundao = QuanZhenLunDao +haishangxianke = Sea Guest +wujiya = WuJiYa +ruoshuiyu = RuoShuiYu +ditaifu = DiTaiFu +qiseta = Seven Color Tower +huanlingzhen = Calling Array +shamomigong = Desert Maze +jingchanyuan = JingChanYuan +guajingmiyuan = Divination Mirror +lingyunhuanjing = LingYun Fairyland +chaoyindong = Chaoyin Cave +shengxiaoshiergong = Twelve Palaces of Zodiac +guanxingtai = Star Watching Platform +fushendian = FuShen Hall +EOF + +cat > "$WINEPREFIX/drive_c/Program Files/DreamLand/music/说明.txt" << 'EOF' +在此目录下放入背景音乐文件可替换游戏中播放的游戏背景音乐,支持wav和ogg格式,建议使用wav格式,播放更加流畅 +login=登录 +fight1=战斗1 +fight2=战斗2 +fight3=战斗3 +linan=临安城 +longzangguyuan=龙藏古原 +xuanjingbingyuan=玄镜冰原 +changjiangshuidao=长江水道 +shenxiaotiangong=神霄天宫 +hemingshan=鹤鸣山 +chamagudao=茶马古道 +dajianlu=打箭炉 +diexueshahai=喋血沙海 +guilinbashu=桂林八树 +hanquan=寒泉 +sizhouyuan=泗州院 +minhai=闽海 +xueyugaoyuan=雪域高原 +caiji=雪域高原自动采集 +legend=迷梦传说 +douzhanjing=斗战境 +shengsijing=生死境 +zhenwuhuanjing=真武幻境 +juezhanzhigu=决战之谷 +wuzhezhidian=武者之巅 +shanshuozhiyuan=闪烁之渊 +fenzhengshengtan=纷争圣坛 +zhanzhengyaosai=战争要塞 +luorihuaguang=落日谷华光 +luorianying=落日谷暗影 +luorihedao=落日谷河道 +luorirongyan=落日谷熔岩巨兽 +luorianmie=落日谷黯灭古龙 +taoshadao=淘沙岛 +taoshadaow=淘沙岛水域 +bangpai=帮派 +bangzhan=帮派战 +huabingchang=滑冰场 +kuafudating=跨服大厅 +shilianzhidi=试炼之地 +lunhuizhidi=轮回之地 +suoyaota=锁妖塔 +taixuhuanjing=太虚幻境 +yizuchaoxue=蚁族巢穴 +guijingbingtan=鬼境冰潭 +taohuadao=桃花岛 +gaoshanliushui=高山流水 +beidilangyan=北地狼烟 +quanzhenlundao=全真论道 +haishangxianke=海上仙客 +wujiya=无稽崖 +ruoshuiyu=弱水域 +ditaifu=帝台府 +qiseta=七色塔 +huanlingzhen=唤灵阵 +shamomigong=沙漠迷宫 +jingchanyuan=净禅院 +guajingmiyuan=卦镜迷渊 +lingyunhuanjing=凌云幻境 +chaoyindong=潮音洞 +shengxiaoshiergong=生肖十二宫 +guanxingtai=观星台 +fushendian=缚神殿 +EOF + add_launcher "c:\Program Files\DreamLand\app\DreamLand.exe" diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..ea299bc --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,125 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Overview + +Audiogame Manager is a bash-based installer and launcher for Windows audio games running under Wine on Linux. It provides an accessible interface for managing audio games specifically designed for blind and visually impaired users. + +## Architecture + +### Core Components + +- **Main Script**: `audiogame-manager.sh` - Entry point with Wine32/64 bottle management and main menu system +- **Includes Directory**: `.includes/` - Shared functionality modules + - `functions.sh` - Core utilities (download, cache management, requirements checking) + - `dialog-interface.sh` - UI abstraction layer supporting both console (dialog) and GUI (yad) modes + - `bottle.sh` - Wine prefix management + - `checkup.sh` - System dependency validation + - `help.sh` - Help system +- **Game Scripts**: `game-scripts/` - Individual game update/launch scripts +- **Install Scripts**: `.install/` - Game installation scripts (100+ games supported) +- **Speech Integration**: `speech/` - Voice and TTS management + - `set-voice.sh` - Voice configuration with test functionality + - NVDA and Cepstral installers +- **Wine Integration**: `wine/` - Wine setup and dependency management + +### Wine Architecture + +The project uses dual Wine environments: +- **Wine32**: For SAPI-dependent games (stored in `~/.local/wine32`) +- **Wine64**: For modern games (stored in `~/.local/wine64`) + +Wine32 version is controlled by `wineThirtyTwoVersion` variable in main script and auto-manages installation/updates. + +### Interface System + +Dialog interface automatically detects environment: +- Console mode: Uses `dialog` for accessibility +- GUI mode: Uses `yad` when DISPLAY is available +- All UI functions are prefixed with `agm_` (audiogame manager) + +## Development Commands + +### System Check +```bash +./audiogame-manager.sh -c # Check system requirements and dependencies +``` + +### Installation and Usage +```bash +./audiogame-manager.sh -i # Install games (interactive menu) +./audiogame-manager.sh -h # Show help +./audiogame-manager.sh # Launch installed games menu +``` + +### Voice Testing +```bash +./speech/set-voice.sh # Configure and test voice settings +``` + +### Dependency Management +```bash +# Check all required packages +./.includes/checkup.sh packages + +# Install Wine dependencies for different distros +./wine/install-dependencies-arch.sh +./wine/install-dependencies-debian.sh +``` + +## Key Patterns and Conventions + +### Error Handling +- Functions return 0 for success, non-zero for failure +- Critical errors vs warnings are clearly distinguished in checkup system +- Progress feedback is provided for all long-running operations + +### File Structure +- Game installers follow naming convention: `.install/Game Name.sh` +- Cache directory: `~/.local/share/audiogame-manager/cache/` +- Wine bottles: `~/.local/wine32/` and `~/.local/wine64/` + +### UI Functions +All dialog functions in `.includes/dialog-interface.sh` follow pattern: +- `agm_menu()` - Selection menus +- `agm_msgbox()` - Message display +- `agm_yesno()` - Confirmation dialogs +- `agm_progressbox()` - Progress display +- Functions automatically adapt to console/GUI environment + +### Game Integration +- Each game has both an installer (`.install/`) and optional update script (`game-scripts/`) +- Games are categorized by engine type and requirements +- SAPI games automatically use Wine32, others use Wine64 + +### Accessibility Features +- Sound alerts using `sox` for important notifications +- Screen reader compatibility through proper dialog usage +- Keyboard navigation support throughout interface +- Voice testing integrated into setup process + +## Dependencies + +### Critical (Required) +- wine, curl, dialog, sox +- Archive tools: 7z, cabextract, unzip, xz +- winetricks (for Wine component management) + +### Optional (Warnings if missing) +- gawk (for game removal) +- ocrdesktop (installer debugging) +- qjoypad (gamepad support) +- translate-shell, sqlite3, perl (translation features) +- w3m (documentation viewing) +- xclip, xdotool (X11 integration) + +### Platform Support +- x86_64 Linux (primary) +- aarch64 with FEX-Emu (alternative Wine implementation) + +## Testing +- System requirements: `./audiogame-manager.sh -c` +- Voice functionality: Use built-in voice test in `set-voice.sh` +- Game installation: Test with simple games first before complex ones +- Wine bottle integrity: Check `~/.local/wine32/system.reg` and `~/.local/wine64/system.reg` exist \ No newline at end of file diff --git a/poop.log b/poop.log new file mode 100644 index 0000000..cfade2e --- /dev/null +++ b/poop.log @@ -0,0 +1,382 @@ +Updating /home/sektor/.local/wine64/drive_c/Program Files/shooter/accessible_output2/lib/nvdaControllerClient32.dll with nvdaControllerClient +Updating /home/sektor/.local/wine64/drive_c/Program Files/shooter/accessible_output2/lib/nvdaControllerClient64.dll with nvdaControllerClient +Updating /home/sektor/.local/wine32/drive_c/Program Files/DreamLand/app/DreamLand_Data/Plugins/x86/nvdaControllerClient32.dll with nvdaControllerClient32 +DEBUG: Using managed wine32 for LAUNCHER (WINE=/home/sektor/.local/share/audiogame-manager/wine32/bin/wine, PATH updated) +launching wine-9.0 +[UnityMemory] Configuration Parameters - Can be set up in boot.config + "memorysetup-bucket-allocator-granularity=16" + "memorysetup-bucket-allocator-bucket-count=8" + "memorysetup-bucket-allocator-block-size=4194304" + "memorysetup-bucket-allocator-block-count=1" + "memorysetup-main-allocator-block-size=16777216" + "memorysetup-thread-allocator-block-size=16777216" + "memorysetup-gfx-main-allocator-block-size=16777216" + "memorysetup-gfx-thread-allocator-block-size=16777216" + "memorysetup-cache-allocator-block-size=4194304" + "memorysetup-typetree-allocator-block-size=2097152" + "memorysetup-profiler-bucket-allocator-granularity=16" + "memorysetup-profiler-bucket-allocator-bucket-count=8" + "memorysetup-profiler-bucket-allocator-block-size=4194304" + "memorysetup-profiler-bucket-allocator-block-count=1" + "memorysetup-profiler-allocator-block-size=16777216" + "memorysetup-profiler-editor-allocator-block-size=1048576" + "memorysetup-temp-allocator-size-main=4194304" + "memorysetup-job-temp-allocator-block-size=2097152" + "memorysetup-job-temp-allocator-block-size-background=1048576" + "memorysetup-job-temp-allocator-reduction-small-platforms=262144" + "memorysetup-temp-allocator-size-background-worker=32768" + "memorysetup-temp-allocator-size-job-worker=262144" + "memorysetup-temp-allocator-size-preload-manager=262144" + "memorysetup-temp-allocator-size-nav-mesh-worker=65536" + "memorysetup-temp-allocator-size-audio-worker=65536" + "memorysetup-temp-allocator-size-cloud-worker=32768" + "memorysetup-temp-allocator-size-gfx=262144" +0124:fixme:ntdll:NtQuerySystemInformation info_class SYSTEM_PERFORMANCE_INFORMATION +0124:fixme:dxgi:DXGID3D10CreateDevice Ignoring flags 0x20. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:wbemprox:client_security_SetBlanket 74152850, 08CA8F68, 10, 0, (null), 3, 3, 00000000, 0 +0124:fixme:wbemprox:client_security_Release 74152850 +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Returning fake Options support data. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 29, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 61, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 49, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 28, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 63, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 51, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 31, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 62, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 50, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 30, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 64, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 52, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 32, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 56, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 35, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 11, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 58, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 37, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 13, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 57, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 36, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 12, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 59, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 38, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 14, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 42, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 17, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 7, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 3, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 43, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 18, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 8, format_support 0030F648 partial-stub! +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 4, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 54, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 34, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 10, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 41, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 16, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 6, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 2, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 61, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 65, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 56, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 91, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 87, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 115, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 85, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 86, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 67, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 26, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 24, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 25, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 89, format_support 0030F648 partial-stub! +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 29, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 28, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 2, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 55, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 45, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 40, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 20, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 62, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 72, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 71, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 75, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 74, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 78, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 77, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 80, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 81, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 83, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 84, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 95, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 96, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 99, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 98, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 107, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 45, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 56, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 107, format_support 0030F648 partial-stub! +0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Returning fake Options support data. +0124:fixme:dxgi:dxgi_factory_IsWindowedStereoEnabled iface 08CA6258 stub! +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Returning fake Options1 support data. +0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Returning fake threading support data. +0288:fixme:kernelbase:AppPolicyGetThreadInitializationType FFFFFFFA, 14DBFF18 +0288:fixme:avrt:AvSetMmThreadCharacteristicsW (L"Audio",14DBFEE4): stub +0124:fixme:dxgi:DXGID3D10CreateDevice Ignoring flags 0x820. +0124:fixme:d3d11:d3d10_multithread_SetMultithreadProtected iface 15A988B8, enable 0x1 stub! +027c:fixme:dxgi:dxgi_resource_GetSharedHandle iface 08CF2004, shared_handle 1473EB10 stub! +0124:fixme:system:NtUserGetDisplayConfigBufferSizes only returning active paths +0124:fixme:system:NtUserQueryDisplayConfig flags 0x4, paths_count 0x30fca4, paths 0x6a60010, modes_count 0x30fc84, modes 0x6a60070, topology_id 0x30fc08 semi-stub +0124:fixme:system:NtUserQueryDisplayConfig only returning active paths +0124:fixme:system:NtUserQueryDisplayConfig setting toplogyid to DISPLAYCONFIG_TOPOLOGY_INTERNAL +0124:fixme:dxgi:dxgi_output_GetDisplayModeList iface 15B2E970, format DXGI_FORMAT_R8G8B8A8_UNORM, flags 0, mode_count 0030FAF8, modes 00000000 partial stub! +0124:fixme:dxgi:dxgi_output_GetDisplayModeList iface 15B2E970, format DXGI_FORMAT_R8G8B8A8_UNORM, flags 0, mode_count 0030FAF8, modes 06A60010 partial stub! +0124:fixme:system:NtUserQueryDisplayConfig flags 0x2, paths_count 0x30faec, paths 0x6a60010, modes_count 0x30fae8, modes 0x6a60070, topology_id (nil) semi-stub +0124:fixme:dxgi:dxgi_output_GetDesc1 iface 15B2E950, desc 0030FA10 semi-stub! +0124:fixme:dxgi:d3d11_swapchain_GetDesc Ignoring ScanlineOrdering and Scaling. +0124:fixme:dxgi:d3d11_swapchain_ResizeBuffers Ignoring flags 0x2. +0124:fixme:win:RegisterTouchWindow hwnd 00020054, flags 0 stub! +0124:fixme:dxgi:dxgi_output_GetDesc1 iface 15B2B468, desc 0030F458 semi-stub! +0124:fixme:dxgi:dxgi_output_GetDesc1 iface 15B2B468, desc 0030F6B4 semi-stub! +027c:fixme:d3d11:d3d_rasterizer_state_init Ignoring MultisampleEnable 0x1. +0278:fixme:d3d:state_linepattern_w Setting line patterns is not supported in OpenGL core contexts. +0124:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0030E274, 0030E284 0030E278 +0124:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0030E274 0030E284 0030E278) returning a dummy value (current locale) +0124:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0030E274, 0030E284 0030E278 +0124:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0030E274 0030E284 0030E278) returning a dummy value (current locale) +0124:fixme:shell:InitNetworkAddressControl stub +02b4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 +02b4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) +02b4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C +02b4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) +02b4:fixme:process:RegisterApplicationRestart (L"65678 40 6 /RestartByRestartManager:D2FB8190-4834-4e28-ABA2-0D39FDDDBE0E",0) +02bc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 +02bc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) +02bc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C +02bc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) +02bc:fixme:process:RegisterApplicationRestart (L"65678 51 6 /RestartByRestartManager:B513C97F-A7C2-49c7-A963-1401DA4FFA22",0) +02c4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 +02c4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) +02c4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C +02c4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) +02c4:fixme:process:RegisterApplicationRestart (L"65678 39 6 /RestartByRestartManager:6DA40BBF-A25A-4ccb-93F2-077A5E1E8D51",0) +02cc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 +02cc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) +02cc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C +02cc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) +02cc:fixme:process:RegisterApplicationRestart (L"65678 38 6 /RestartByRestartManager:80C8293E-4C84-4eea-A97F-447C895526DA",0) +02b4:fixme:shell:InitNetworkAddressControl stub +02b4:err:ole:com_get_class_object class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered +02b4:err:ole:com_get_class_object class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered +02b4:err:ole:create_server class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered +02b4:fixme:ole:com_get_class_object CLSCTX_REMOTE_SERVER not supported +02b4:err:ole:com_get_class_object no class object {d67c0280-c743-11cd-80e5-00aa003e4b50} could be created for context 0x17 +02bc:fixme:shell:InitNetworkAddressControl stub +02d4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 +02d4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) +02d4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C +02d4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) +02d4:fixme:process:RegisterApplicationRestart (L"65724 40 6 /RestartByRestartManager:E3CF571C-FC88-4957-ADD4-CDADDAB8D7AA",0) +02c4:fixme:shell:InitNetworkAddressControl stub +02dc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 +02dc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) +02cc:fixme:shell:InitNetworkAddressControl stub +02dc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C +02dc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) +02dc:fixme:process:RegisterApplicationRestart (L"65724 51 6 /RestartByRestartManager:7C6827F0-8A29-4743-83F6-F185A0A2EF71",0) +02e4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 +02e4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) +02e4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C +02e4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) +02e4:fixme:process:RegisterApplicationRestart (L"65724 39 6 /RestartByRestartManager:863EE475-3E9A-46fc-96B5-505132EB24FF",0) +02ec:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 +02ec:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) +02ec:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C +02ec:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) +02ec:fixme:process:RegisterApplicationRestart (L"65724 38 6 /RestartByRestartManager:236AAAEA-DA0E-4c27-8335-596D85E44636",0) +02d4:fixme:shell:InitNetworkAddressControl stub +02d4:err:ole:com_get_class_object class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered +02d4:err:ole:com_get_class_object class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered +02d4:err:ole:create_server class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered +02d4:fixme:ole:com_get_class_object CLSCTX_REMOTE_SERVER not supported +02d4:err:ole:com_get_class_object no class object {d67c0280-c743-11cd-80e5-00aa003e4b50} could be created for context 0x17 +02dc:fixme:shell:InitNetworkAddressControl stub +02e4:fixme:shell:InitNetworkAddressControl stub +02ec:fixme:shell:InitNetworkAddressControl stub +02fc:fixme:ver:GetCurrentPackageId (0175FF10 00000000): stub +02bc:fixme:ntdll:NtQuerySystemInformation info_class SYSTEM_PERFORMANCE_INFORMATION +0308:fixme:ver:GetCurrentPackageId (0175FF10 00000000): stub +030c:fixme:avrt:AvSetMmThreadCharacteristicsW (L"Audio",14DBFEE4): stub +0124:fixme:nls:GetFileMUIPath stub: 0x10, L"C:\\windows\\system32\\tzres.dll", (null), 0030E5D8, 156E5310, 0030E5DC, 0030E5D0 +0124:fixme:nls:GetFileMUIPath stub: 0x10, L"C:\\windows\\system32\\tzres.dll", (null), 0030E5D8, 156E5310, 0030E5DC, 0030E5D0 +0124:fixme:nls:GetFileMUIPath stub: 0x10, L"C:\\windows\\system32\\tzres.dll", (null), 0030E5D8, 156E5310, 0030E5DC, 0030E5D0 +0124:fixme:system:NtUserQueryDisplayConfig flags 0x2, paths_count 0x30f91c, paths 0x6a60010, modes_count 0x30f918, modes 0x6a60070, topology_id (nil) semi-stub +0124:fixme:dxgi:dxgi_output_GetDesc1 iface 18605CC0, desc 0030F2C0 semi-stub! +0124:fixme:dxgi:dxgi_output_GetDesc1 iface 18605CC0, desc 0030F840 semi-stub! +0124:fixme:dxgi:d3d11_swapchain_GetDesc Ignoring ScanlineOrdering and Scaling. +0124:fixme:dxgi:d3d11_swapchain_ResizeBuffers Ignoring flags 0x2. +0124:fixme:dxgi:dxgi_output_GetDesc1 iface 1865EDC0, desc 0030FC08 semi-stub! +0124:fixme:dxgi:d3d11_swapchain_GetDesc Ignoring ScanlineOrdering and Scaling. +0124:fixme:dxgi:d3d11_swapchain_ResizeBuffers Ignoring flags 0x2. +012c:fixme:kernelbase:AppPolicyGetProcessTerminationMethod FFFFFFFA, 0031FECC +0368:fixme:kernelbase:AppPolicyGetProcessTerminationMethod FFFFFFFA, 0031FECC +02b4:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub +02c4:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub +02cc:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub +02d4:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub +02e4:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub +02ec:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub From c3411db0e9fff3573925ecd5790849d96943aca5 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Mon, 13 Oct 2025 13:39:17 -0400 Subject: [PATCH 64/77] More dreamland work. --- .install/Dreamland.sh | 152 ++--------------- audiogame-manager.sh | 4 + poop.log | 382 ------------------------------------------ 3 files changed, 16 insertions(+), 522 deletions(-) delete mode 100644 poop.log diff --git a/.install/Dreamland.sh b/.install/Dreamland.sh index 08e9568..a826ae9 100644 --- a/.install/Dreamland.sh +++ b/.install/Dreamland.sh @@ -1,150 +1,22 @@ export winVer="win10" export WINEARCH=win32 export WINEPREFIX="$HOME/.local/wine32" + download https://scwl-1251129685.cos.ap-shanghai.myqcloud.com/dreamland/Win/DreamLandSetup.exe install_wine_bottle + winetricks -q vcrun2019 d3dcompiler_47 -install_with_progress innoextract "Extracting game files..." --output-dir "$WINEPREFIX/drive_c/Program Files/DreamLand" "${cache}/DreamLandSetup.exe" +# Run installer silently (shows a dialog but completes successfully) +# Install to C:\DreamLand instead of Program Files to avoid potential permission issues +{ + echo "# Installing Dreamland..." + timeout 120 wine "${cache}/DreamLandSetup.exe" /VERYSILENT /NORESTART 2>&1 || true + echo "# Installation complete" +} | agm_progressbox "Installing Game" "Installing Dreamland (this may take a minute)..." -# Clean up malformed paths with literal {app}\ in filenames created by innoextract -find "$WINEPREFIX/drive_c/Program Files/DreamLand" -name '{app}\*' -type f -delete 2>/dev/null || true +# Kill any game processes that may have auto-launched +wineserver -k 2>/dev/null || true -# Create music directory with readme files for custom music support (in game root, not app subdir) -mkdir -p "$WINEPREFIX/drive_c/Program Files/DreamLand/music" -cat > "$WINEPREFIX/drive_c/Program Files/DreamLand/music/readme.txt" << 'EOF' -Placing background music files in this directory can replace some background music played in the game. It supports WAV and OGG formats, and it is recommended to use WAV format for smoother playback. -login = Login interface -fight1 = Fighting state 1 -fight2 = Fighting state 2 -fight3 = Fighting state 3 -linan = Lin'an City -longzangguyuan = Longcang Ancient Plain -xuanjingbingyuan = Xuanjing Ice Field -changjiangshuidao = Yangtze River Waterway -shenxiaotiangong = Shenxiao Heavenly Palace -hemingshan = Heming Mountain -chamagudao = Tea-horse Ancient Passage -dajianlu = Dajianlu -diexueshahai = Bloody Desert -guilinbashu = Bagui Forest -hanquan = Chilly Spring -sizhouyuan = Sizhou Temple -minhai = Min Sea -xueyugaoyuan = Snowy plateau -caiji = Collecting on Snowy plateau -legend = Dreamland Legend -douzhanjing = DouZhanJing -shengsijing = Alive-Dead Land -zhenwuhuanjing = Zhenwu Fairyland -juezhanzhigu = Valley of Decisive battle -wuzhezhidian = The end of martial -shanshuozhiyuan = Shining Abyss -fenzhengshengtan = Altar of Dispute -zhanzhengyaosai = War fortress -luorihuaguang = Sunset Valley - Light -luorianying = Sunset Valley - Shadow -luorihedao = Sunset Valley - River course -luorirongyan = Sunset Valley - Lava Behemoth -luorianmie = Sunset Valley - Dim ancient dragon -taoshadao = Washing Island -taoshadaow = Washing Island - Flood -bangpai = Gang -bangzhan = Gang War -huabingchang = Skating Rink -kuafudating = Cross Server Hall -shilianzhidi = Trial Land -lunhuizhidi = Land of Samsara -suoyaota = Demon Tower -taixuhuanjing = TaiXu HuanJing -yizuchaoxue = Ant Hole -guijingbingtan = Ghost Land -taohuadao = Peach Blossom Island -gaoshanliushui = High Mountain - Flowing Water -beidilangyan = BeiDiLangYan -quanzhenlundao = QuanZhenLunDao -haishangxianke = Sea Guest -wujiya = WuJiYa -ruoshuiyu = RuoShuiYu -ditaifu = DiTaiFu -qiseta = Seven Color Tower -huanlingzhen = Calling Array -shamomigong = Desert Maze -jingchanyuan = JingChanYuan -guajingmiyuan = Divination Mirror -lingyunhuanjing = LingYun Fairyland -chaoyindong = Chaoyin Cave -shengxiaoshiergong = Twelve Palaces of Zodiac -guanxingtai = Star Watching Platform -fushendian = FuShen Hall -EOF - -cat > "$WINEPREFIX/drive_c/Program Files/DreamLand/music/说明.txt" << 'EOF' -在此目录下放入背景音乐文件可替换游戏中播放的游戏背景音乐,支持wav和ogg格式,建议使用wav格式,播放更加流畅 -login=登录 -fight1=战斗1 -fight2=战斗2 -fight3=战斗3 -linan=临安城 -longzangguyuan=龙藏古原 -xuanjingbingyuan=玄镜冰原 -changjiangshuidao=长江水道 -shenxiaotiangong=神霄天宫 -hemingshan=鹤鸣山 -chamagudao=茶马古道 -dajianlu=打箭炉 -diexueshahai=喋血沙海 -guilinbashu=桂林八树 -hanquan=寒泉 -sizhouyuan=泗州院 -minhai=闽海 -xueyugaoyuan=雪域高原 -caiji=雪域高原自动采集 -legend=迷梦传说 -douzhanjing=斗战境 -shengsijing=生死境 -zhenwuhuanjing=真武幻境 -juezhanzhigu=决战之谷 -wuzhezhidian=武者之巅 -shanshuozhiyuan=闪烁之渊 -fenzhengshengtan=纷争圣坛 -zhanzhengyaosai=战争要塞 -luorihuaguang=落日谷华光 -luorianying=落日谷暗影 -luorihedao=落日谷河道 -luorirongyan=落日谷熔岩巨兽 -luorianmie=落日谷黯灭古龙 -taoshadao=淘沙岛 -taoshadaow=淘沙岛水域 -bangpai=帮派 -bangzhan=帮派战 -huabingchang=滑冰场 -kuafudating=跨服大厅 -shilianzhidi=试炼之地 -lunhuizhidi=轮回之地 -suoyaota=锁妖塔 -taixuhuanjing=太虚幻境 -yizuchaoxue=蚁族巢穴 -guijingbingtan=鬼境冰潭 -taohuadao=桃花岛 -gaoshanliushui=高山流水 -beidilangyan=北地狼烟 -quanzhenlundao=全真论道 -haishangxianke=海上仙客 -wujiya=无稽崖 -ruoshuiyu=弱水域 -ditaifu=帝台府 -qiseta=七色塔 -huanlingzhen=唤灵阵 -shamomigong=沙漠迷宫 -jingchanyuan=净禅院 -guajingmiyuan=卦镜迷渊 -lingyunhuanjing=凌云幻境 -chaoyindong=潮音洞 -shengxiaoshiergong=生肖十二宫 -guanxingtai=观星台 -fushendian=缚神殿 -EOF - -add_launcher "c:\Program Files\DreamLand\app\DreamLand.exe" +add_launcher "c:\DreamLand\DreamLand.exe" diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 132f650..a83b0c0 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -350,6 +350,10 @@ custom_launch_parameters() { popd exit 0 fi + #if [[ "${game[2]}" == "Dreamland" ]]; then + # (export WINEPREFIX && cd "$("${wine32%/*}/winepath" "${game[1]%\\*}")" && "$WINE" "${game[1]##*\\}") + # exit 0 + #fi # executioner's-rage: DLL replacement now handled by update_nvda_dlls() if [[ "${game[2]}" == "Laser Breakout" ]]; then "${scriptDir}/speech/speak_window_title.sh" play.exe & diff --git a/poop.log b/poop.log deleted file mode 100644 index cfade2e..0000000 --- a/poop.log +++ /dev/null @@ -1,382 +0,0 @@ -Updating /home/sektor/.local/wine64/drive_c/Program Files/shooter/accessible_output2/lib/nvdaControllerClient32.dll with nvdaControllerClient -Updating /home/sektor/.local/wine64/drive_c/Program Files/shooter/accessible_output2/lib/nvdaControllerClient64.dll with nvdaControllerClient -Updating /home/sektor/.local/wine32/drive_c/Program Files/DreamLand/app/DreamLand_Data/Plugins/x86/nvdaControllerClient32.dll with nvdaControllerClient32 -DEBUG: Using managed wine32 for LAUNCHER (WINE=/home/sektor/.local/share/audiogame-manager/wine32/bin/wine, PATH updated) -launching wine-9.0 -[UnityMemory] Configuration Parameters - Can be set up in boot.config - "memorysetup-bucket-allocator-granularity=16" - "memorysetup-bucket-allocator-bucket-count=8" - "memorysetup-bucket-allocator-block-size=4194304" - "memorysetup-bucket-allocator-block-count=1" - "memorysetup-main-allocator-block-size=16777216" - "memorysetup-thread-allocator-block-size=16777216" - "memorysetup-gfx-main-allocator-block-size=16777216" - "memorysetup-gfx-thread-allocator-block-size=16777216" - "memorysetup-cache-allocator-block-size=4194304" - "memorysetup-typetree-allocator-block-size=2097152" - "memorysetup-profiler-bucket-allocator-granularity=16" - "memorysetup-profiler-bucket-allocator-bucket-count=8" - "memorysetup-profiler-bucket-allocator-block-size=4194304" - "memorysetup-profiler-bucket-allocator-block-count=1" - "memorysetup-profiler-allocator-block-size=16777216" - "memorysetup-profiler-editor-allocator-block-size=1048576" - "memorysetup-temp-allocator-size-main=4194304" - "memorysetup-job-temp-allocator-block-size=2097152" - "memorysetup-job-temp-allocator-block-size-background=1048576" - "memorysetup-job-temp-allocator-reduction-small-platforms=262144" - "memorysetup-temp-allocator-size-background-worker=32768" - "memorysetup-temp-allocator-size-job-worker=262144" - "memorysetup-temp-allocator-size-preload-manager=262144" - "memorysetup-temp-allocator-size-nav-mesh-worker=65536" - "memorysetup-temp-allocator-size-audio-worker=65536" - "memorysetup-temp-allocator-size-cloud-worker=32768" - "memorysetup-temp-allocator-size-gfx=262144" -0124:fixme:ntdll:NtQuerySystemInformation info_class SYSTEM_PERFORMANCE_INFORMATION -0124:fixme:dxgi:DXGID3D10CreateDevice Ignoring flags 0x20. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:wbemprox:client_security_SetBlanket 74152850, 08CA8F68, 10, 0, (null), 3, 3, 00000000, 0 -0124:fixme:wbemprox:client_security_Release 74152850 -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Returning fake Options support data. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 29, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 61, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 49, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 28, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 63, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 51, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 31, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 62, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 50, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 30, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 64, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 52, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 32, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 56, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 35, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 11, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 58, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 37, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 13, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 57, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 36, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 12, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 59, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 38, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 14, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 42, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 17, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 7, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 3, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 43, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 18, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 8, format_support 0030F648 partial-stub! -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 4, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 54, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 34, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 10, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 41, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 16, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 6, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 2, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 61, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 65, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 56, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 91, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 87, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 115, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 85, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 86, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 67, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 26, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 24, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 25, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 89, format_support 0030F648 partial-stub! -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 29, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 28, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 2, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 55, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 45, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 40, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 20, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 62, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 72, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 71, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 75, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 74, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 78, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 77, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 80, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 81, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 83, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 84, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 95, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 96, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 99, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 98, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 107, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 45, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 56, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFormatSupport iface 00A1A128, format 107, format_support 0030F648 partial-stub! -0124:fixme:d3d:wined3d_check_device_multisample_type multisample_type 32 not handled yet. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Unhandled feature 0xe. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Returning fake Options support data. -0124:fixme:dxgi:dxgi_factory_IsWindowedStereoEnabled iface 08CA6258 stub! -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Returning fake Options1 support data. -0124:fixme:d3d11:d3d11_device_CheckFeatureSupport Returning fake threading support data. -0288:fixme:kernelbase:AppPolicyGetThreadInitializationType FFFFFFFA, 14DBFF18 -0288:fixme:avrt:AvSetMmThreadCharacteristicsW (L"Audio",14DBFEE4): stub -0124:fixme:dxgi:DXGID3D10CreateDevice Ignoring flags 0x820. -0124:fixme:d3d11:d3d10_multithread_SetMultithreadProtected iface 15A988B8, enable 0x1 stub! -027c:fixme:dxgi:dxgi_resource_GetSharedHandle iface 08CF2004, shared_handle 1473EB10 stub! -0124:fixme:system:NtUserGetDisplayConfigBufferSizes only returning active paths -0124:fixme:system:NtUserQueryDisplayConfig flags 0x4, paths_count 0x30fca4, paths 0x6a60010, modes_count 0x30fc84, modes 0x6a60070, topology_id 0x30fc08 semi-stub -0124:fixme:system:NtUserQueryDisplayConfig only returning active paths -0124:fixme:system:NtUserQueryDisplayConfig setting toplogyid to DISPLAYCONFIG_TOPOLOGY_INTERNAL -0124:fixme:dxgi:dxgi_output_GetDisplayModeList iface 15B2E970, format DXGI_FORMAT_R8G8B8A8_UNORM, flags 0, mode_count 0030FAF8, modes 00000000 partial stub! -0124:fixme:dxgi:dxgi_output_GetDisplayModeList iface 15B2E970, format DXGI_FORMAT_R8G8B8A8_UNORM, flags 0, mode_count 0030FAF8, modes 06A60010 partial stub! -0124:fixme:system:NtUserQueryDisplayConfig flags 0x2, paths_count 0x30faec, paths 0x6a60010, modes_count 0x30fae8, modes 0x6a60070, topology_id (nil) semi-stub -0124:fixme:dxgi:dxgi_output_GetDesc1 iface 15B2E950, desc 0030FA10 semi-stub! -0124:fixme:dxgi:d3d11_swapchain_GetDesc Ignoring ScanlineOrdering and Scaling. -0124:fixme:dxgi:d3d11_swapchain_ResizeBuffers Ignoring flags 0x2. -0124:fixme:win:RegisterTouchWindow hwnd 00020054, flags 0 stub! -0124:fixme:dxgi:dxgi_output_GetDesc1 iface 15B2B468, desc 0030F458 semi-stub! -0124:fixme:dxgi:dxgi_output_GetDesc1 iface 15B2B468, desc 0030F6B4 semi-stub! -027c:fixme:d3d11:d3d_rasterizer_state_init Ignoring MultisampleEnable 0x1. -0278:fixme:d3d:state_linepattern_w Setting line patterns is not supported in OpenGL core contexts. -0124:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0030E274, 0030E284 0030E278 -0124:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0030E274 0030E284 0030E278) returning a dummy value (current locale) -0124:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0030E274, 0030E284 0030E278 -0124:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0030E274 0030E284 0030E278) returning a dummy value (current locale) -0124:fixme:shell:InitNetworkAddressControl stub -02b4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 -02b4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) -02b4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C -02b4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) -02b4:fixme:process:RegisterApplicationRestart (L"65678 40 6 /RestartByRestartManager:D2FB8190-4834-4e28-ABA2-0D39FDDDBE0E",0) -02bc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 -02bc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) -02bc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C -02bc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) -02bc:fixme:process:RegisterApplicationRestart (L"65678 51 6 /RestartByRestartManager:B513C97F-A7C2-49c7-A963-1401DA4FFA22",0) -02c4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 -02c4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) -02c4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C -02c4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) -02c4:fixme:process:RegisterApplicationRestart (L"65678 39 6 /RestartByRestartManager:6DA40BBF-A25A-4ccb-93F2-077A5E1E8D51",0) -02cc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 -02cc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) -02cc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C -02cc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) -02cc:fixme:process:RegisterApplicationRestart (L"65678 38 6 /RestartByRestartManager:80C8293E-4C84-4eea-A97F-447C895526DA",0) -02b4:fixme:shell:InitNetworkAddressControl stub -02b4:err:ole:com_get_class_object class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered -02b4:err:ole:com_get_class_object class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered -02b4:err:ole:create_server class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered -02b4:fixme:ole:com_get_class_object CLSCTX_REMOTE_SERVER not supported -02b4:err:ole:com_get_class_object no class object {d67c0280-c743-11cd-80e5-00aa003e4b50} could be created for context 0x17 -02bc:fixme:shell:InitNetworkAddressControl stub -02d4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 -02d4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) -02d4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C -02d4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) -02d4:fixme:process:RegisterApplicationRestart (L"65724 40 6 /RestartByRestartManager:E3CF571C-FC88-4957-ADD4-CDADDAB8D7AA",0) -02c4:fixme:shell:InitNetworkAddressControl stub -02dc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 -02dc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) -02cc:fixme:shell:InitNetworkAddressControl stub -02dc:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C -02dc:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) -02dc:fixme:process:RegisterApplicationRestart (L"65724 51 6 /RestartByRestartManager:7C6827F0-8A29-4743-83F6-F185A0A2EF71",0) -02e4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 -02e4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) -02e4:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C -02e4:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) -02e4:fixme:process:RegisterApplicationRestart (L"65724 39 6 /RestartByRestartManager:863EE475-3E9A-46fc-96B5-505132EB24FF",0) -02ec:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031F23C, 0031F24C 0031F240 -02ec:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031F23C 0031F24C 0031F240) returning a dummy value (current locale) -02ec:fixme:nls:RtlGetThreadPreferredUILanguages 00000038, 0031FB48, 0031FB58 0031FB4C -02ec:fixme:nls:get_dummy_preferred_ui_language (0x38 0x409 0031FB48 0031FB58 0031FB4C) returning a dummy value (current locale) -02ec:fixme:process:RegisterApplicationRestart (L"65724 38 6 /RestartByRestartManager:236AAAEA-DA0E-4c27-8335-596D85E44636",0) -02d4:fixme:shell:InitNetworkAddressControl stub -02d4:err:ole:com_get_class_object class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered -02d4:err:ole:com_get_class_object class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered -02d4:err:ole:create_server class {d67c0280-c743-11cd-80e5-00aa003e4b50} not registered -02d4:fixme:ole:com_get_class_object CLSCTX_REMOTE_SERVER not supported -02d4:err:ole:com_get_class_object no class object {d67c0280-c743-11cd-80e5-00aa003e4b50} could be created for context 0x17 -02dc:fixme:shell:InitNetworkAddressControl stub -02e4:fixme:shell:InitNetworkAddressControl stub -02ec:fixme:shell:InitNetworkAddressControl stub -02fc:fixme:ver:GetCurrentPackageId (0175FF10 00000000): stub -02bc:fixme:ntdll:NtQuerySystemInformation info_class SYSTEM_PERFORMANCE_INFORMATION -0308:fixme:ver:GetCurrentPackageId (0175FF10 00000000): stub -030c:fixme:avrt:AvSetMmThreadCharacteristicsW (L"Audio",14DBFEE4): stub -0124:fixme:nls:GetFileMUIPath stub: 0x10, L"C:\\windows\\system32\\tzres.dll", (null), 0030E5D8, 156E5310, 0030E5DC, 0030E5D0 -0124:fixme:nls:GetFileMUIPath stub: 0x10, L"C:\\windows\\system32\\tzres.dll", (null), 0030E5D8, 156E5310, 0030E5DC, 0030E5D0 -0124:fixme:nls:GetFileMUIPath stub: 0x10, L"C:\\windows\\system32\\tzres.dll", (null), 0030E5D8, 156E5310, 0030E5DC, 0030E5D0 -0124:fixme:system:NtUserQueryDisplayConfig flags 0x2, paths_count 0x30f91c, paths 0x6a60010, modes_count 0x30f918, modes 0x6a60070, topology_id (nil) semi-stub -0124:fixme:dxgi:dxgi_output_GetDesc1 iface 18605CC0, desc 0030F2C0 semi-stub! -0124:fixme:dxgi:dxgi_output_GetDesc1 iface 18605CC0, desc 0030F840 semi-stub! -0124:fixme:dxgi:d3d11_swapchain_GetDesc Ignoring ScanlineOrdering and Scaling. -0124:fixme:dxgi:d3d11_swapchain_ResizeBuffers Ignoring flags 0x2. -0124:fixme:dxgi:dxgi_output_GetDesc1 iface 1865EDC0, desc 0030FC08 semi-stub! -0124:fixme:dxgi:d3d11_swapchain_GetDesc Ignoring ScanlineOrdering and Scaling. -0124:fixme:dxgi:d3d11_swapchain_ResizeBuffers Ignoring flags 0x2. -012c:fixme:kernelbase:AppPolicyGetProcessTerminationMethod FFFFFFFA, 0031FECC -0368:fixme:kernelbase:AppPolicyGetProcessTerminationMethod FFFFFFFA, 0031FECC -02b4:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub -02c4:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub -02cc:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub -02d4:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub -02e4:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub -02ec:fixme:ver:GetCurrentPackageId (0031FEAC 00000000): stub From 40d3b18ff7c7151f43f8166136c6791894d7b078 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Mon, 13 Oct 2025 14:30:19 -0400 Subject: [PATCH 65/77] It works. I had to really simplify how we're lauching Dreamland, but I did finally get it work now. My head hurts. --- .install/Dreamland.sh | 4 ++-- audiogame-manager.sh | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.install/Dreamland.sh b/.install/Dreamland.sh index a826ae9..1b3ddf3 100644 --- a/.install/Dreamland.sh +++ b/.install/Dreamland.sh @@ -9,10 +9,10 @@ install_wine_bottle winetricks -q vcrun2019 d3dcompiler_47 # Run installer silently (shows a dialog but completes successfully) -# Install to C:\DreamLand instead of Program Files to avoid potential permission issues +# Using C:\DreamLand instead of Program Files to avoid potential permission issues { echo "# Installing Dreamland..." - timeout 120 wine "${cache}/DreamLandSetup.exe" /VERYSILENT /NORESTART 2>&1 || true + timeout 120 wine "${cache}/DreamLandSetup.exe" /VERYSILENT /NORESTART /DIR="C:\DreamLand" 2>&1 || true echo "# Installation complete" } | agm_progressbox "Installing Game" "Installing Dreamland (this may take a minute)..." diff --git a/audiogame-manager.sh b/audiogame-manager.sh index a83b0c0..24b7faf 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -350,10 +350,10 @@ custom_launch_parameters() { popd exit 0 fi - #if [[ "${game[2]}" == "Dreamland" ]]; then - # (export WINEPREFIX && cd "$("${wine32%/*}/winepath" "${game[1]%\\*}")" && "$WINE" "${game[1]##*\\}") - # exit 0 - #fi + if [[ "${game[2]}" == "Dreamland" ]]; then + "$WINE" "${game[1]}" + exit 0 + fi # executioner's-rage: DLL replacement now handled by update_nvda_dlls() if [[ "${game[2]}" == "Laser Breakout" ]]; then "${scriptDir}/speech/speak_window_title.sh" play.exe & From 1e7cb8fd850e77a3ba54bf383f559c35ee4e3b83 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sat, 18 Oct 2025 21:08:59 -0400 Subject: [PATCH 66/77] Updated CLAUDE.md to be more comprehensive. --- CLAUDE.md | 123 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 104 insertions(+), 19 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index ea299bc..6fbe500 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,35 +2,43 @@ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. -## Overview +## Project Overview -Audiogame Manager is a bash-based installer and launcher for Windows audio games running under Wine on Linux. It provides an accessible interface for managing audio games specifically designed for blind and visually impaired users. +**Audiogame Manager** is a comprehensive bash-based installer and launcher system for Windows audio games running under Wine on Linux. The project focuses on accessibility, providing speech synthesis support and screen reader compatibility for audio games designed for blind and visually impaired users. ## Architecture ### Core Components -- **Main Script**: `audiogame-manager.sh` - Entry point with Wine32/64 bottle management and main menu system -- **Includes Directory**: `.includes/` - Shared functionality modules - - `functions.sh` - Core utilities (download, cache management, requirements checking) +- **Main Script**: `audiogame-manager.sh` - Entry point providing interactive menus for game installation, launching, and management with Wine32/64 bottle support +- **Includes Directory**: `.includes/` - Modular helper scripts containing core functionality + - `functions.sh` - Core utilities (download, cache management, validation, requirements checking) - `dialog-interface.sh` - UI abstraction layer supporting both console (dialog) and GUI (yad) modes - - `bottle.sh` - Wine prefix management + - `bottle.sh` - Wine bottle management, RHVoice installation, and prefix management - `checkup.sh` - System dependency validation - - `help.sh` - Help system + - `help.sh` - Documentation system + - `desktop.sh` - Desktop integration + - `update.sh` - Auto-update mechanisms - **Game Scripts**: `game-scripts/` - Individual game update/launch scripts - **Install Scripts**: `.install/` - Game installation scripts (100+ games supported) -- **Speech Integration**: `speech/` - Voice and TTS management +- **Speech Integration**: `speech/` - TTS and accessibility tools - `set-voice.sh` - Voice configuration with test functionality - - NVDA and Cepstral installers -- **Wine Integration**: `wine/` - Wine setup and dependency management + - Supports multiple TTS engines (RHVoice, SAPI, Cepstral) + - Per-bottle voice configuration system + - NVDA screen reader compatibility through custom DLL +- **Wine Integration**: `wine/` - Wine setup utilities including bottle creation and dependency installation + - `mkwine.sh` - Wine bottle creation + - Distribution-specific dependency installers ### Wine Architecture -The project uses dual Wine environments: -- **Wine32**: For SAPI-dependent games (stored in `~/.local/wine32`) -- **Wine64**: For modern games (stored in `~/.local/wine64`) - -Wine32 version is controlled by `wineThirtyTwoVersion` variable in main script and auto-manages installation/updates. +The project uses Wine with specific architectural requirements: +- **Modern approach**: Use WOW64 (wine64) for everything by default - it can run both 32-bit and 64-bit applications efficiently +- **Wine32**: Legacy 32-bit prefix (stored in `~/.local/wine32`) - only for SAPI-dependent games with WOW64 issues +- **Wine64**: Modern prefix (stored in `~/.local/wine64`) - primary target for all games +- Wine32 version is controlled by `wineThirtyTwoVersion` variable in main script and auto-manages installation/updates +- **Custom bottles**: Stored in `~/.local/share/audiogame-manager/wineBottles/` with per-bottle configurations in `~/.config/audiogame-manager/` +- **IMPORTANT**: Never create game-specific wine directories like `~/.local/winegamename` - use the standard bottle system ### Interface System @@ -44,18 +52,26 @@ Dialog interface automatically detects environment: ### System Check ```bash ./audiogame-manager.sh -c # Check system requirements and dependencies +bash -n audiogame-manager.sh # Basic syntax check ``` ### Installation and Usage ```bash -./audiogame-manager.sh -i # Install games (interactive menu) -./audiogame-manager.sh -h # Show help ./audiogame-manager.sh # Launch installed games menu +./audiogame-manager.sh -i # Install games (interactive menu) +./audiogame-manager.sh -I "Game Name" # Install a game noninteractively +./audiogame-manager.sh -h # Show help ``` -### Voice Testing +### Wine Bottle Management +```bash +./wine/mkwine.sh [bottle_name] [architecture] # Create a new Wine bottle +``` + +### Voice and Speech Testing ```bash ./speech/set-voice.sh # Configure and test voice settings +./speech/set-voice.sh [bottle_name] # Configure voice for a specific bottle ``` ### Dependency Management @@ -68,17 +84,45 @@ Dialog interface automatically detects environment: ./wine/install-dependencies-debian.sh ``` +### Testing All Include Files +```bash +for f in .includes/*.sh; do bash -n "$f"; done +``` + ## Key Patterns and Conventions +### Coding Style - **EXTREMELY IMPORTANT - MUST BE FOLLOWED** + +- **Variables**: Use camelCase for variable names (e.g., `gameTitle`, `wineBottle`, `installPath`) + - **CRITICAL**: ALL variables must use camelCase - no exceptions + - Examples: `selectedGame`, `wineArch`, `installPath`, `downloadUrl` + - Never use: `selected_game`, `wine_arch`, `install_path`, `download_url` +- **Functions**: Use snake_case for function names (e.g., `install_game`, `create_wine_bottle`, `check_dependencies`) + - **CRITICAL**: ALL functions must use snake_case - no exceptions + - Examples: `get_wine_bottle()`, `process_launcher_flags()`, `download_file()` + - Never use: `getWineBottle()`, `processLauncherFlags()`, `downloadFile()` +- **Shebang**: Use `#!/bin/bash` for all bash scripts +- **Sourcing pattern**: Use modular sourcing: `. "${0%/*}/.includes/file.sh"` +- **Indentation**: Use consistent indentation (tabs or spaces, follow existing file patterns) +- When fixing code, correct any indentation inconsistencies to match the established style + ### Error Handling - Functions return 0 for success, non-zero for failure +- Use consistent exit codes throughout scripts +- Provide clear error messages with context - Critical errors vs warnings are clearly distinguished in checkup system - Progress feedback is provided for all long-running operations +- Always clean up temporary files on exit +- Log important operations for debugging ### File Structure - Game installers follow naming convention: `.install/Game Name.sh` + - **IMPORTANT**: Games starting with hash (#) are commented out even if it's a comment + - First line of a game installer may not start with # unless we're excluding it - Cache directory: `~/.local/share/audiogame-manager/cache/` - Wine bottles: `~/.local/wine32/` and `~/.local/wine64/` +- Custom bottles: `~/.local/share/audiogame-manager/wineBottles/` +- Configuration: `~/.config/audiogame-manager/` ### UI Functions All dialog functions in `.includes/dialog-interface.sh` follow pattern: @@ -92,6 +136,16 @@ All dialog functions in `.includes/dialog-interface.sh` follow pattern: - Each game has both an installer (`.install/`) and optional update script (`game-scripts/`) - Games are categorized by engine type and requirements - SAPI games automatically use Wine32, others use Wine64 +- Games are tracked in configuration files with Wine bottle associations +- Each game can use different Wine bottles with specific configurations + +### Game Installation Pattern +1. Check system requirements and dependencies +2. Create or verify Wine bottle +3. Install Wine dependencies via winetricks +4. Download and validate game files (use checksums when available) +5. Configure speech synthesis (typically RHVoice) +6. Add game entry to launcher configuration ### Accessibility Features - Sound alerts using `sox` for important notifications @@ -122,4 +176,35 @@ All dialog functions in `.includes/dialog-interface.sh` follow pattern: - System requirements: `./audiogame-manager.sh -c` - Voice functionality: Use built-in voice test in `set-voice.sh` - Game installation: Test with simple games first before complex ones -- Wine bottle integrity: Check `~/.local/wine32/system.reg` and `~/.local/wine64/system.reg` exist \ No newline at end of file +- Wine bottle integrity: Check `~/.local/wine32/system.reg` and `~/.local/wine64/system.reg` exist +- Test with different Wine versions when modifying bottle creation +- Verify speech synthesis functionality after TTS changes +- Test game installation scripts in clean environments +- Check both 32-bit and 64-bit compatibility where applicable + +## Recent Refactor Notes (2025) + +### Major Refactor Status +The project has undergone a significant refactor to modularize functionality. **Status: Largely Complete** + +### Key Fixes Applied +1. **Function naming**: Fixed `process_launcher-flags()` → `process_launcher_flags()` in `audiogame-manager.sh:270` +2. **Variable scope**: Added `export game` in main script so `.includes/bottle.sh` functions can access it +3. **Installation logic**: Completed the `-I` option implementation for noninteractive game installation +4. **Code deduplication**: Removed duplicate `check_news` and launcher logic from `update.sh` + +### Critical Variable Handling +- **`$game` variable**: Must be exported when set (line 489 in main script) for bottle.sh functions to work +- **`agmNoLaunch` variable**: Used to prevent main script execution when sourced by other scripts +- **Bottle names**: Derived from game names, converted to lowercase with spaces replaced by hyphens + +### Important Patterns +- **Noninteractive installation**: The `-I` option sources the appropriate `.install/GameName.sh` script +- **Variable scope**: Include files rely on exported variables from main script +- **Wine bottle logic**: Game-specific wine versions are handled in `bottle.sh:get_bottle()` + +### Common Issues to Watch For +1. **Variable exports**: Ensure variables are exported when needed by include files +2. **Function naming**: Use snake_case for functions, camelCase for variables +3. **Path quoting**: Always quote paths that might contain spaces +4. **Duplicate logic**: Check main script vs includes to avoid redundant code From f7252e24edca491b1ed2dbc351f0d24337c6a4c2 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sat, 18 Oct 2025 21:10:50 -0400 Subject: [PATCH 67/77] One more directive in the CLAUDE.md file. --- CLAUDE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 6fbe500..2864314 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,6 +2,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. +**Critical**: Be sure to keep this file up to date with new changes. + ## Project Overview **Audiogame Manager** is a comprehensive bash-based installer and launcher system for Windows audio games running under Wine on Linux. The project focuses on accessibility, providing speech synthesis support and screen reader compatibility for audio games designed for blind and visually impaired users. From fe50e2be3edde84335085025b35803446e8604e7 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Wed, 22 Oct 2025 16:16:30 -0400 Subject: [PATCH 68/77] When launching Dreamland, put it into the background so as to not clog up the shell. --- audiogame-manager.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 24b7faf..48c5143 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -351,7 +351,7 @@ custom_launch_parameters() { exit 0 fi if [[ "${game[2]}" == "Dreamland" ]]; then - "$WINE" "${game[1]}" + "$WINE" "${game[1]}" &> /dev/null & exit 0 fi # executioner's-rage: DLL replacement now handled by update_nvda_dlls() From 6fe5e4fa170cbb1efa4ed5b791ad01d3843a6fc4 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Tue, 4 Nov 2025 18:01:49 -0500 Subject: [PATCH 69/77] When launching the script, actually source the right things. If I try to launch it via ~/projects/audiogame-manager/audiogame-manager.sh it will crap out because it isn't able to source its include files; it erroneously thinks they're in the current directory as I am, which is no exactly true unless I physically go to the audiogame manager directory. This also fixes launching from the desktop icon. --- CLAUDE.md | 6 +++++- audiogame-manager.sh | 32 ++++++++++++++++---------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 2864314..73e414e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -104,7 +104,10 @@ for f in .includes/*.sh; do bash -n "$f"; done - Examples: `get_wine_bottle()`, `process_launcher_flags()`, `download_file()` - Never use: `getWineBottle()`, `processLauncherFlags()`, `downloadFile()` - **Shebang**: Use `#!/bin/bash` for all bash scripts -- **Sourcing pattern**: Use modular sourcing: `. "${0%/*}/.includes/file.sh"` +- **Sourcing pattern**: + - **Main script** (`audiogame-manager.sh`): Use `source "${scriptDir}/.includes/file.sh"` (scriptDir is defined at line 4) + - **Subdirectory scripts** (game-scripts/, wine/, speech/): Use `source "${0%/*}/../.includes/file.sh"` + - **CRITICAL**: Never use relative paths like `source .includes/file.sh` - these fail when the current working directory differs from the script location - **Indentation**: Use consistent indentation (tabs or spaces, follow existing file patterns) - When fixing code, correct any indentation inconsistencies to match the established style @@ -194,6 +197,7 @@ The project has undergone a significant refactor to modularize functionality. ** 2. **Variable scope**: Added `export game` in main script so `.includes/bottle.sh` functions can access it 3. **Installation logic**: Completed the `-I` option implementation for noninteractive game installation 4. **Code deduplication**: Removed duplicate `check_news` and launcher logic from `update.sh` +5. **Include sourcing**: Fixed all relative path sourcing (e.g., `source .includes/bottle.sh`) to use `${scriptDir}` to ensure desktop launchers and execution from any working directory works correctly ### Critical Variable Handling - **`$game` variable**: Must be exported when set (line 489 in main script) for bottle.sh functions to work diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 48c5143..b8ceaab 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -235,7 +235,7 @@ game_installer() { # remove games game_removal() { - source .includes/bottle.sh + source "${scriptDir}/.includes/bottle.sh" # Modern wine is unified - no architecture-specific wine executables needed mapfile -t lines < <(sed -e '/^$/d' -e '/^[[:space:]]*#/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then @@ -273,7 +273,7 @@ game_removal() { create_game_array "$selectedGame" if [[ ${#game[@]} -gt 0 ]]; then # Set up wine environment for this game - source .includes/bottle.sh + source "${scriptDir}/.includes/bottle.sh" get_bottle "${game[0]}" if ! agm_yesno "Confirm Removal" "Audio Game Removal" "Are you sure you want to remove \"${game[2]}\"?"; then @@ -303,7 +303,7 @@ game_removal() { # kill games that are stuck kill_game() { - source .includes/bottle.sh + source "${scriptDir}/.includes/bottle.sh" # Modern wine is unified - no architecture-specific wine executables needed mapfile -t lines < <(sed '/^$/d' "${configFile}" 2> /dev/null) if [[ ${#lines} -eq 0 ]]; then @@ -447,7 +447,7 @@ create_game_array() { # Update NVDA controller client DLLs in wine bottles update_nvda_dlls() { # Ensure we have the replacement DLLs - source .includes/functions.sh + source "${scriptDir}/.includes/functions.sh" download "${nvdaControllerClientDll}" "${nvdaControllerClient64Dll}" # Update wine64 bottle (most common) @@ -493,7 +493,7 @@ update_nvda_dlls() { game_launcher() { # For use by update scripts that want to source functions in this file. [[ "$agmNoLaunch" == "true" ]] && return - source .includes/bottle.sh + source "${scriptDir}/.includes/bottle.sh" # Start nvda2speechd if available if [[ -x ${XDG_DATA_HOME:-$HOME/.local/share}/audiogame-manager/nvda2speechd ]]; then @@ -522,7 +522,7 @@ game_launcher() { if [[ $menuCode -eq 1 ]] || [[ $menuCode -eq 255 ]]; then exit 0 elif [[ $menuCode -eq 3 ]]; then - source .includes/help.sh # Make available in this function + source "${scriptDir}/.includes/help.sh" # Make available in this function documentation "$game" "$(echo "$game" | cut -d '|' -f2)" fi @@ -588,7 +588,7 @@ else fi # Source dialog interface early for progress display -source .includes/dialog-interface.sh +source "${scriptDir}/.includes/dialog-interface.sh" # If display isn't set assume we are launching from console and an X environment is running using display :0 if [[ -z "$DISPLAY" ]]; then @@ -633,12 +633,12 @@ export nvda2speechdBinary="${ipfsGateway}/ipfs/QmPxhoNsoFoJC7bCfioBBCcK8tEoSoYpm # Source helper functions -source .includes/bottle.sh # Also sourced in functions that need it -source .includes/desktop.sh +source "${scriptDir}/.includes/bottle.sh" # Also sourced in functions that need it +source "${scriptDir}/.includes/desktop.sh" # dialog-interface.sh already sourced earlier -source .includes/functions.sh -source .includes/help.sh -source .includes/update.sh +source "${scriptDir}/.includes/functions.sh" +source "${scriptDir}/.includes/help.sh" +source "${scriptDir}/.includes/update.sh" # Check minimum requirements check_requirements || exit 1 @@ -685,7 +685,7 @@ args="${!command[*]}" args="${args//[[:space:]]/}" while getopts "${args}" i ; do case "$i" in - c) ./.includes/checkup.sh;; + c) "${scriptDir}/.includes/checkup.sh";; C) clear_cache;; D) desktop_launcher;; d) @@ -711,7 +711,7 @@ while getopts "${args}" i ; do r) game_removal;; S) defaultRate="${OPTARG}";; t) - gameCount=$(find ".install" -type f -iname "*.sh" | wc -l) + gameCount=$(find "${scriptDir}/.install" -type f -iname "*.sh" | wc -l) agm_infobox "Linux Game Manager" "Linux Game Manager" "There are currently ${gameCount} games available." exit 0 ;; @@ -729,9 +729,9 @@ if [[ "$noninteractiveInstall" == "true" ]]; then [[ ${#game} -lt 1 ]] && exit 0 # Install the specified game noninteractively - if [[ -f ".install/${game}.sh" ]]; then + if [[ -f "${scriptDir}/.install/${game}.sh" ]]; then export LANG="en_US.UTF-8" - . ".install/${game}.sh" + . "${scriptDir}/.install/${game}.sh" # Show success message agm_msgbox "Installation Complete" "Audio Game Installer" "Game \"${game}\" has been successfully installed." else From fa597a9ca3211dfe876d084f4c5b7b19bda8afbc Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Wed, 5 Nov 2025 13:23:17 -0500 Subject: [PATCH 70/77] Initial work on Blades of Glory. Still trying to figure out why this is crashing though. --- .install/Blades of Glory.sh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .install/Blades of Glory.sh diff --git a/.install/Blades of Glory.sh b/.install/Blades of Glory.sh new file mode 100644 index 0000000..bd029f2 --- /dev/null +++ b/.install/Blades of Glory.sh @@ -0,0 +1,6 @@ +export winVer="win10" +download "https://nibblenerds.com/static/blades_of_glory.zip" +install_wine_bottle +install_wine_bottle "sapi" +install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Blades of Glory" "${cache}/blades_of_glory.zip" +add_launcher "c:\Program Files\Blades of Glory\blades_of_glory.exe" From 4d327409755a4b6094053cebc14edcece737e952 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Thu, 6 Nov 2025 12:24:28 -0500 Subject: [PATCH 71/77] Experimental way to launch a game with GDB. Useful for when you do indeed need a debugger. --- audiogame-manager.sh | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index b8ceaab..caf0ddc 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -569,7 +569,21 @@ game_launcher() { fi process_launcher_flags custom_launch_parameters - wine start /d "${game[1]%\\*}" "${game[1]##*\\}" /realtime + if [[ "$debugGdb" == "1" ]]; then + echo "Starting GDB server for debugging..." + echo "Connect from another terminal with:" + echo " gdb" + echo " (gdb) target remote localhost:1234" + echo "" + echo "Press Ctrl+C to stop the debugger." + echo "" + # Change to game directory before launching + pushd "$(winepath "${game[1]%\\*}")" > /dev/null + winedbg --gdb "${game[1]##*\\}" + popd > /dev/null + else + wine start /d "${game[1]%\\*}" "${game[1]##*\\}" /realtime + fi fi exit 0 } @@ -662,6 +676,7 @@ declare -A command=( [C]="Clear the cache. All game installers will be deleted." [D]="Create desktop shortcut. You can launch audiogame-manager from the desktop or applications menu." [d]="Debug mode, wine will be much more verbose when games are installed with this flag." + [g]="Debug with GDB. Launch game with winedbg --gdb for step-through debugging." [h]="This help screen." [i]="Install games." [I:]="Noninteractive game installation." @@ -692,6 +707,9 @@ while getopts "${args}" i ; do unset WINEDEBUG game_installer ;; + g) + debugGdb=1 + game_launcher;; h) help;; i) game_installer;; I) From 4de95e7a7c3d0a89e31704cf29f4cbfe14312bd9 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Thu, 6 Nov 2025 13:14:34 -0500 Subject: [PATCH 72/77] For games that need it, install the Discord bridge. --- .includes/bottle.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index e88f3a4..6ce4556 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -183,3 +183,14 @@ add_launcher() { fi fi } +# Install the Discord RPC bridge +install_discord_rpc_bridge() { + echo "Installing Discord RPC bridge for Wine compatibility..." + download "https://github.com/EnderIce2/rpc-bridge/releases/download/v1.4.0.1/bridge.zip" + if [[ -f "${cache}/bridge.zip && ! -f "${cache}/bridge.exe ]]; then + # the package is on the system, but not extracted just yet. + unzip bridge.zip + fi + + wine "${cache}/bridge.exe" --install +} From e8b0b97ac20702ae86474a53e8a6d99362e1b653 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Thu, 6 Nov 2025 13:14:52 -0500 Subject: [PATCH 73/77] Blades of Glory: try with the bridge. It's opening the window and it's staying open, but it's shitting the bed with the same error. Traceback (most recent call last): File "C:\users\sektor\AppData\Local\Temp\ONEF~3LZ\blades_of_glory.py", line 447, in File "C:\users\sektor\AppData\Local\Temp\ONEF~3LZ\blades_of_glory.py", line 114, in run File "C:\users\sektor\AppData\Local\Temp\ONEF~3LZ\discordmanager.py", line 25, in connect File "C:\users\sektor\AppData\Local\Temp\ONEF~3LZ\pypresence\presence.py", line 43, in connect File "C:\users\sektor\AppData\Local\Temp\ONEF~3LZ\asyncio\base_events.py", line 654, in run_until_complete File "C:\users\sektor\AppData\Local\Temp\ONEF~3LZ\pypresence\baseclient.py", line 106, in handshake File "C:\users\sektor\AppData\Local\Temp\ONEF~3LZ\pypresence\utils.py", line 42, in get_ipc_path OSError: [WinError 66] Bad device type: '\\\\?\\pipe\\' --- .install/Blades of Glory.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.install/Blades of Glory.sh b/.install/Blades of Glory.sh index bd029f2..60a17f8 100644 --- a/.install/Blades of Glory.sh +++ b/.install/Blades of Glory.sh @@ -1,6 +1,5 @@ -export winVer="win10" download "https://nibblenerds.com/static/blades_of_glory.zip" install_wine_bottle -install_wine_bottle "sapi" install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Blades of Glory" "${cache}/blades_of_glory.zip" +install_discord_rpc_bridge add_launcher "c:\Program Files\Blades of Glory\blades_of_glory.exe" From 01eb1f3e1ab26ea1792a35b5600aba968c5fb9fc Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sat, 8 Nov 2025 13:07:07 -0500 Subject: [PATCH 74/77] Fixed crash bug if yad is not installed and agm is launched from a gui. Insure AGM is not ran as the root users. If people who really should know better still need training wheels, actual newbies might need the protection as well. --- .includes/dialog-interface.sh | 4 +++- .includes/functions.sh | 17 ++++++++++++++--- audiogame-manager.sh | 4 +++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.includes/dialog-interface.sh b/.includes/dialog-interface.sh index c096c71..afda207 100644 --- a/.includes/dialog-interface.sh +++ b/.includes/dialog-interface.sh @@ -10,8 +10,10 @@ if [[ -z "$dialogType" ]]; then if [[ -z "$DISPLAY" ]]; then dialogType="dialog" - else + elif command -v yad &> /dev/null; then dialogType="yad" + else + dialogType="dialog" fi fi diff --git a/.includes/functions.sh b/.includes/functions.sh index b73ae3a..5a6d4a0 100644 --- a/.includes/functions.sh +++ b/.includes/functions.sh @@ -8,15 +8,26 @@ alert() { } check_requirements() { - # Make sure the minimum of curl, sox, wine, and winetricks are installed or fex-emu on aarch64 + # Make sure this is not ran as root + if [[ "$(whoami)" == "root" ]]; then + echo "Please do not run ${0##*/} as root." + return 1 + fi + + # Make sure the minimum dependencies are installed if [[ "$(uname -m)" == "aarch64" ]]; then minimumDependencies=("FEXLoader") wine="FEXLoader -- /usr/bin/wine" else - minimumDependencies=("curl" "sox" "wine") + minimumDependencies=( + "curl" + "dialog" + "sox" + "wine" + ) fi for i in "${minimumDependencies[@]}" ; do - if ! command -v $i &> /dev/null ; then + if ! command -v "$i" &> /dev/null ; then echo "Please install $i before continuing." return 1 fi diff --git a/audiogame-manager.sh b/audiogame-manager.sh index caf0ddc..2779f3b 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -597,8 +597,10 @@ trap "exit 0" SIGINT # This must happen before we modify DISPLAY to preserve console detection if [[ -z "$DISPLAY" ]]; then dialogType="dialog" +elif command -v yad &> /dev/null; then + dialogType="yad" else - dialogType="yad" + dialogType="dialog" fi # Source dialog interface early for progress display From 73126910ec7865961e18a179329f4444d4415fa0 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Sun, 9 Nov 2025 12:54:57 -0500 Subject: [PATCH 75/77] Disable Blades of Glory for now. There is a technical limitation where pypresence is trying to enumerate the available pipes in \\?\pipe\ but this is crashing because Wine doesn't properly support enumerating the \\?\pipe\ namespace. This causes pypresence to crash when trying to discover Discord IPC pipes. --- .includes/bottle.sh | 19 ++++++++++++++++--- .install/Blades of Glory.sh | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.includes/bottle.sh b/.includes/bottle.sh index 6ce4556..cedb6dd 100644 --- a/.includes/bottle.sh +++ b/.includes/bottle.sh @@ -187,10 +187,23 @@ add_launcher() { install_discord_rpc_bridge() { echo "Installing Discord RPC bridge for Wine compatibility..." download "https://github.com/EnderIce2/rpc-bridge/releases/download/v1.4.0.1/bridge.zip" - if [[ -f "${cache}/bridge.zip && ! -f "${cache}/bridge.exe ]]; then + if [[ -f "${cache}/bridge.zip" && ! -f "${cache}/bridge.exe" ]]; then # the package is on the system, but not extracted just yet. - unzip bridge.zip + unzip "${cache}/bridge.zip" -d "${cache}" fi - wine "${cache}/bridge.exe" --install + if [[ -f "${cache}/bridge.exe" ]]; then + wine "${cache}/bridge.exe" --install 2>&1 | grep -v "fixme:" || echo "Discord bridge installation attempted" + + # Copy required bridge.sh script to Wine prefix + if [[ -f "${cache}/bridge.sh" ]]; then + cp "${cache}/bridge.sh" "${WINEPREFIX}/drive_c/windows/" + echo "Copied bridge.sh to Wine prefix" + else + echo "WARNING: bridge.sh not found in cache!" + fi + else + echo "ERROR: bridge.exe not found after extraction!" + return 1 + fi } diff --git a/.install/Blades of Glory.sh b/.install/Blades of Glory.sh index 60a17f8..e339092 100644 --- a/.install/Blades of Glory.sh +++ b/.install/Blades of Glory.sh @@ -1,3 +1,4 @@ +#Disable download "https://nibblenerds.com/static/blades_of_glory.zip" install_wine_bottle install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Blades of Glory" "${cache}/blades_of_glory.zip" From 614f38d9ddef7b42421040abc80735aaba0d7280 Mon Sep 17 00:00:00 2001 From: Hunter Jozwiak Date: Mon, 10 Nov 2025 14:47:10 -0500 Subject: [PATCH 76/77] When launching the game in with -g, don't print those extra echo statements. You're already in a GDB session which is ready to rock and roll. --- audiogame-manager.sh | 7 ------- 1 file changed, 7 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 2779f3b..d615c1b 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -570,13 +570,6 @@ game_launcher() { process_launcher_flags custom_launch_parameters if [[ "$debugGdb" == "1" ]]; then - echo "Starting GDB server for debugging..." - echo "Connect from another terminal with:" - echo " gdb" - echo " (gdb) target remote localhost:1234" - echo "" - echo "Press Ctrl+C to stop the debugger." - echo "" # Change to game directory before launching pushd "$(winepath "${game[1]%\\*}")" > /dev/null winedbg --gdb "${game[1]##*\\}" From 0a22d007de7541485f8a86a7004ac23b91932f9d Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Fri, 14 Nov 2025 16:02:38 -0500 Subject: [PATCH 77/77] Updated bloodshed installer. --- .install/Bloodshed.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/.install/Bloodshed.sh b/.install/Bloodshed.sh index 735559c..6c31412 100644 --- a/.install/Bloodshed.sh +++ b/.install/Bloodshed.sh @@ -1,5 +1,4 @@ export WINEARCH="win32" download "${ipfsGateway}/ipfs/QmcTCTMep4zp5zTw8ZaXYpjtu9inNPn8bNzwhW6cX97egw?filename=bloodshed.exe" -install_wine_bottle cp "${cache}/bloodshed.exe" "$WINEPREFIX/drive_c/Program Files/" add_launcher "c:\Program Files\bloodshed.exe"