From 38353f83aea6effb8a2646360504ea39472b301a Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 19 Sep 2021 07:09:41 -0400 Subject: [PATCH 01/11] Game "Crime Hunter" added, but not working because of problems with 64 bit nvdaControllerClient64.dll replacement. --- audiogame-manager.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 7aa446d..e6b9efe 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -835,6 +835,7 @@ gameList=( "Copter Mission" "Crazy Party" "Crazy Tennis" + "Crime Hunter" "Danger on the Wheel" "Death on the Road" "Deathmatch" @@ -1499,6 +1500,15 @@ case "${game}" in wine "${cache}/crazy tennis setup.exe" /sp- /silent add_launcher "c:\Program Files\Crazytennis\crazytennis.exe" ;; + "Crime Hunter") + export WINEARCH=win64 + export winVer="win7" + install_wine_bottle speechsdk + download "http://masonasons.me/softs/CH2.0Win.zip" "https://stormgames.wolfe.casa/downloads/nvdaControllerClient64.dll" + unzip -d "$WINEPREFIX/drive_c/Program Files/crime-hunter" "${cache}/CH2.0Win.zip" + find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvdaControllerClient64.dll" "{}" \; + add_launcher "c:\Program Files\crime-hunter\ch.exe" + ;; "Danger on the Wheel") export bottle="oriol-gomez" export winVer="win7" From 132fb50cacc0e256679194219b34b2058bf40120 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 23 Sep 2021 14:48:53 -0400 Subject: [PATCH 02/11] Try to fix mudsplat french. --- audiogame-manager.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index e6b9efe..631f36d 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -867,7 +867,7 @@ gameList=( "Lunimals" "Manamon" "Manamon 2" - #"MudSplat French" + "MudSplat French" "MudSplat English" #"MudSplat Swedish" "Oh Shit!" @@ -1837,7 +1837,7 @@ EOF ;& "MudSplat French") # Variables may be already set for English installation, so make sure not to overwrite them. - a="${a:-a}" + a="${a:-j}" f="${f:-t}" i="${i:-i}" n="${n:-s}" From fe77c7735fdcf6460165a8def1305b53bb1858e6 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sat, 25 Sep 2021 15:47:38 -0400 Subject: [PATCH 03/11] Fix bugs in Crazy Party installer. --- audiogame-manager.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 631f36d..0cb7b3e 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -1490,9 +1490,9 @@ case "${game}" in export winVer="win7" install_wine_bottle speechsdk download "http://pragmapragma.free.fr/crazy-party/Crazy-Party-beta76.zip" - unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/Crazy-Party-beta75.zip" - add_launcher "c:\Program Files\Crazy-Party-beta75\Crazy Party.exe" - rm -f "${WINEPREFIX}/drive_c/Program Files/Crazy-Party-beta75/nvdaControllerClient32.dll" + unzip -d "$WINEPREFIX/drive_c/Program Files" "${cache}/Crazy-Party-beta76.zip" + add_launcher "c:\Program Files\Crazy-Party-beta76\Crazy Party.exe" + rm -f "${WINEPREFIX}/drive_c/Program Files/Crazy-Party-beta76/nvdaControllerClient32.dll" ;; "Crazy Tennis") install_wine_bottle speechsdk From f628b8e61f65722c504b5a4738ebbcc31f041386 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 30 Sep 2021 07:36:24 -0400 Subject: [PATCH 04/11] Updated the installer for the game "Oh Shit". --- audiogame-manager.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 0cb7b3e..d3d60f5 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -870,7 +870,7 @@ gameList=( "MudSplat French" "MudSplat English" #"MudSplat Swedish" - "Oh Shit!" + "Oh Shit" "Pacman Talks" "Palace Punch Up" "Paladin of the Sky" @@ -1859,7 +1859,7 @@ EOF mudsplatLauncher="${mudsplatLauncher##*/}" add_launcher "c:\Program Files\TiM\MudSplat\\${mudsplatLauncher}" ;; - "Oh Shit!") + "Oh Shit") export winVer="win7" install_wine_bottle speechsdk download "http://samtupy.com/stevend/oh_shit.zip" "https://stormgames.wolfe.casa/downloads/nvdaControllerClient32.dll" From 0221f4c7eb7bde76a54d80626215f6efcc8abddb Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Tue, 5 Oct 2021 23:07:23 -0400 Subject: [PATCH 05/11] Working toward Raspberry Pi compatibility. --- audiogame-manager.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index d3d60f5..0724dce 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -759,6 +759,8 @@ mkdir -p "${cache}" mkdir -p "${configFile%/*}" # Turn off debug messages export 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" From 0c05d98bc922ace3ef47ec09ec6a88194d90c117 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sat, 9 Oct 2021 04:16:35 -0400 Subject: [PATCH 06/11] Download and cache latest version of winetricks. This insures that the latest version is being used, yes, even on Debian. lol This change should be considered experimental currently, it seems stable but if it proves otherwise it will be reverted. --- audiogame-manager.sh | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 0724dce..4af4133 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -181,12 +181,6 @@ checklist() { errorList+=("Critical: Wine is not installed. You will not be able to play any games.") fi packageList+=("wine") - if command -v winetricks &> /dev/null ; then - [[ $# -eq 0 ]] && echo "Winetricks is installed." - else - errorList+=("Critical: Winetricks is not installed. This means wine cannot be configured, dependancies cannot be installed, and only self-voicing games have any chance of working.") - fi - packageList+=("winetricks") if command -v curl &> /dev/null ; then [[ $# -eq 0 ]] && echo "Curl is installed." else @@ -442,6 +436,22 @@ echo "Loading documentation, please wait..." exit 0 } +winetricks() { + # Download or update agm's copy of winetricks + if [[ ! -e "${cache}/winetricks" ]]; then + checkWinetricksUpdate="true" + download "https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks" + chmod 700 "${cache}/winetricks" + else + if [[ "$checkWinetricksUpdate" != "true" ]]; then + checkWinetricksUpdate="true" + ${cache}/winetricks --self-update + fi + fi + # Run the requested winetricks parameters + ${cache}/winetricks "$@" +} + 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}" @@ -757,6 +767,7 @@ cache="${XDG_CONFIG_HOME:-$HOME/.config}/storm-games/audiogame-manager/cache" configFile="${XDG_CONFIG_HOME:-$HOME/.config}/storm-games/audiogame-manager/games.conf" mkdir -p "${cache}" mkdir -p "${configFile%/*}" +checkWinetricksUpdate="false" # Turn off debug messages export WINEDEBUG="-all" # Compatibility with box86 From 64a6fa04ad6bdde4bf45bbe0ce3efb1e170b39ba Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 14 Oct 2021 23:17:40 -0400 Subject: [PATCH 07/11] Removed game "Revenge of the Undead". This game has proven to be quite unstable as far as admin goes. Also, when it does work, server lag tends to render it unplayable. Unless something extremely drastic changes, I seriously doube this one will be coming back to AGM. --- audiogame-manager.sh | 9 ---- game-scripts/revenge-of-the-undead-update.sh | 49 -------------------- 2 files changed, 58 deletions(-) delete mode 100755 game-scripts/revenge-of-the-undead-update.sh diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 4af4133..0d73395 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -892,7 +892,6 @@ gameList=( "Pontes Kickups!" #"Psycho Strike" "Q9" - #"Revenge of the Undead" "Rhythm Rage" #"River raiders" "RS Games" @@ -1926,14 +1925,6 @@ EOF wine "${cache}/q9_english_installer.exe" /silent add_launcher "c:\Program Files\Q9 Action Game\q9.exe" ;; - "Revenge of the Undead") - export winVer="win7" - install_wine_bottle speechsdk - download "https://ims-productions.com/downloads/rotu.zip" - unzip -d "$WINEPREFIX/drive_c/Program Files/revenge of the undead" "${cache}/rotu.zip" - find "${WINEPREFIX}" -type f -name "nvdaControllerClient32.dll" -exec rm -fv "{}" \; - add_launcher "c:\Program Files\revenge of the undead\rotu.exe" - ;; "Rhythm Rage") export bottle="oriol-gomez" export winVer="win7" diff --git a/game-scripts/revenge-of-the-undead-update.sh b/game-scripts/revenge-of-the-undead-update.sh deleted file mode 100755 index 90db87a..0000000 --- a/game-scripts/revenge-of-the-undead-update.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/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 -# 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 â 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. -# -# 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. -# -# Contributor Jeremiah Ticket. -# -# 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. - -cache="${XDG_CONFIG_HOME:-$HOME/.config}/storm-games/audiogame-manager/cache" -url="https://ims-productions.com/downloads/rotu.zip" -(rm -v "${cache}/rotu.zip" -wget -O "${cache}/rotu.zip" "$url" || exit 1 -unzip -od "$HOME/.local/wine/revenge-of-the-undead/drive_c/Program Files/revenge of the undead" "${cache}/rotu.zip" -find "$HOME/.local/wine/revenge-of-the-undead" -type f -name 'nvdaControllerClient32.dll' -exec rm -fv {} \; ) | dialog --progressbox "updating Revenge of the undead, please wait..." -1 -1 - -exit 0 From 51aacb9d123f6047620e4def7a646b6a8f6968bf Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Thu, 14 Oct 2021 23:26:36 -0400 Subject: [PATCH 08/11] Arm version of binary should work with future updates. --- audiogame-manager.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 0d73395..fa32af9 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -79,7 +79,11 @@ update() { if [[ "$(uname)" == "Darwin" ]]; then local downloadFile="audiogame-manager.mac" else + if [[ "$(uname -m)" == "armv7l" ]]; then + local downloadFile="audiogame-manager.arm" + else local downloadFile="audiogame-manager" + fi fi if [[ "$(wget --quiet -O - https://stormgames.wolfe.casa/downloads/${downloadFile} | sha256sum | cut -d ' ' -f1)" == "$(sha256sum "${filePath}" | cut -d ' ' -f1)" ]]; then return From 0538ac5b8a6d8acb6805437f770792156c1cba26 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 17 Oct 2021 14:41:20 -0400 Subject: [PATCH 09/11] Added nvdaControllerClient.dll source code to speech directory. Added game "shooter" which is not enabled yet because of problems with the 64 bit version of the nvdaControllerClient64.dll. --- audiogame-manager.sh | 11 +++++++ speech/nvda-dll/Makefile | 16 ++++++++++ speech/nvda-dll/Makefile.test | 17 +++++++++++ speech/nvda-dll/nvdaControllerClient32.c | 28 ++++++++++++++++++ speech/nvda-dll/nvdaControllerClient32.cpp | 34 ++++++++++++++++++++++ 5 files changed, 106 insertions(+) create mode 100644 speech/nvda-dll/Makefile create mode 100644 speech/nvda-dll/Makefile.test create mode 100644 speech/nvda-dll/nvdaControllerClient32.c create mode 100644 speech/nvda-dll/nvdaControllerClient32.cpp diff --git a/audiogame-manager.sh b/audiogame-manager.sh index fa32af9..c7a8b28 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -908,6 +908,7 @@ gameList=( "Shades of Doom" "Silver Dollar" "Slender Lost Vision" + #"Shooter" "Sonic Zoom" #"Space Defender" "Super Dogs Bone Hunt" @@ -2030,6 +2031,16 @@ EOF unzip -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/slender.zip" add_launcher "c:\Program Files\slender\slender.exe" ;; + "Shooter") + export WINEARCH=win64 + export winVer="win7" + install_wine_bottle + download "http://masonasons.me/softs/Shooter.zip" "https://stormgames.wolfe.casa/downloads/nvdaControllerClient32.dll" "https://stormgames.wolfe.casa/downloads/nvdaControllerClient64.dll" + unzip -d "$WINEPREFIX/drive_c/Program Files/shooter" "${cache}/Shooter.zip" + find "${WINEPREFIX}" -type f -name 'nvdaControllerClient32.dll' -exec cp -v "${cache}/nvdaControllerClient32.dll" "{}" \; + find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvdaControllerClient64.dll" "{}" \; + add_launcher "c:\Program Files\shooter\shooter.exe" + ;; "Sonic Zoom") export winVer="win7" install_wine_bottle speechsdk diff --git a/speech/nvda-dll/Makefile b/speech/nvda-dll/Makefile new file mode 100644 index 0000000..b14f292 --- /dev/null +++ b/speech/nvda-dll/Makefile @@ -0,0 +1,16 @@ +CXX = i686-w64-mingw32-g++ +DLLTOOL = i686-w64-mingw32-dlltool + +all: nvdaControllerClient32.dll + +nvdaControllerClient32.dll: nvdaControllerClient32.o exports.o + @$(CXX) -shared -o nvdaControllerClient32.dll nvdaControllerClient32.o exports.o + +exports.o: nvdaControllerClient32.o + @$(DLLTOOL) -e exports.o nvdaControllerClient32.o + +nvdaControllerClient32.o: nvdaControllerClient32.cpp + @$(CXX) -c nvdaControllerClient32.cpp + +clean: + @rm -f nvdaControllerClient32.o exports.o diff --git a/speech/nvda-dll/Makefile.test b/speech/nvda-dll/Makefile.test new file mode 100644 index 0000000..fce3472 --- /dev/null +++ b/speech/nvda-dll/Makefile.test @@ -0,0 +1,17 @@ +CXX = i686-w64-mingw32-g++ +DLLTOOL = i686-w64-mingw32-dlltool +CC = i686-w64-mingw32-gcc + +all: nvdaControllerClient32.dll + +nvdaControllerClient32.dll: nvdaControllerClient32.o exports.o + @$(CC) -shared -o nvdaControllerClient32.dll nvdaControllerClient32.o exports.o + +exports.o: nvdaControllerClient32.o + @$(DLLTOOL) -e exports.o nvdaControllerClient32.o + +nvdaControllerClient32.o: nvdaControllerClient32.c + @$(CC) -c nvdaControllerClient32.cpp + +clean: + @rm -f nvdaControllerClient32.o exports.o diff --git a/speech/nvda-dll/nvdaControllerClient32.c b/speech/nvda-dll/nvdaControllerClient32.c new file mode 100644 index 0000000..3f4acd4 --- /dev/null +++ b/speech/nvda-dll/nvdaControllerClient32.c @@ -0,0 +1,28 @@ +#include + +#ifdef __cplusplus +extern "C" { +#endif +unsigned long __stdcall __declspec(dllexport) nvdaController_speakText(const wchar_t* text); +unsigned long __stdcall __declspec(dllexport) nvdaController_cancelSpeech(); +unsigned long __stdcall __declspec(dllexport) nvdaController_brailleMessage(const wchar_t* text); +unsigned long __stdcall __declspec(dllexport) nvdaController_testIfRunning(); +#ifdef __cplusplus +} +#endif + +unsigned long __stdcall __declspec(dllexport) nvdaController_speakText(const wchar_t* text) { + return 420; +} + +unsigned long __stdcall __declspec(dllexport) nvdaController_cancelSpeech() { + return 420; +} + +unsigned long __stdcall __declspec(dllexport) nvdaController_brailleMessage(const wchar_t* text) { + return 420; +} + +unsigned long __stdcall __declspec(dllexport) nvdaController_testIfRunning() { + return 420; +} diff --git a/speech/nvda-dll/nvdaControllerClient32.cpp b/speech/nvda-dll/nvdaControllerClient32.cpp new file mode 100644 index 0000000..0949512 --- /dev/null +++ b/speech/nvda-dll/nvdaControllerClient32.cpp @@ -0,0 +1,34 @@ +#include + +#ifdef __cplusplus +extern "C" { +#endif +unsigned long __stdcall __declspec(dllexport) nvdaController_speakText(const wchar_t* text); +unsigned long __stdcall __declspec(dllexport) nvdaController_cancelSpeech(); +unsigned long __stdcall __declspec(dllexport) nvdaController_brailleMessage(const wchar_t* text); +unsigned long __stdcall __declspec(dllexport) nvdaController_testIfRunning(); +#ifdef __cplusplus +} +#endif + +asm (".section .drectve"); +asm (".ascii \"-export:nvdaController_speakText\""); +asm (".ascii \"-export:nvdaController_cancelSpeech\""); +asm (".ascii \"-export:nvdaController_brailleMessage\""); +asm (".ascii \"-export:nvdaController_testIfRunning\""); + +unsigned long __stdcall __declspec(dllexport) nvdaController_speakText(const wchar_t* text) { + return 420; +} + +unsigned long __stdcall __declspec(dllexport) nvdaController_cancelSpeech() { + return 420; +} + +unsigned long __stdcall __declspec(dllexport) nvdaController_brailleMessage(const wchar_t* text) { + return 420; +} + +unsigned long __stdcall __declspec(dllexport) nvdaController_testIfRunning() { + return 420; +} From 0eec14f9f3681a438aaad0ac9443464851a96193 Mon Sep 17 00:00:00 2001 From: Michael Taboada Date: Sun, 17 Oct 2021 11:54:50 -0700 Subject: [PATCH 10/11] Add monkey business --- audiogame-manager.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index c7a8b28..3b97fb3 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -884,6 +884,7 @@ gameList=( "Lunimals" "Manamon" "Manamon 2" + "Monkey Business" "MudSplat French" "MudSplat English" #"MudSplat Swedish" @@ -1846,6 +1847,17 @@ EOF wine "${cache}/manamon2_installer.exe" /silent add_launcher "c:\Program Files\VGStorm.com\Manamon 2\rpg.exe" ;; + "Monkey Business") + export winVer="win7" + install_wine_bottle vb6run dx8vb speechsdk quartz + download "http://download.dracoent.com/Windows/classic/MBSetup.exe" + wine "${cache}/MBSetup.exe" /sp- /silent + # 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 + wineserver -k # Damn you, dotnet. + add_launcher "c:\Program Files\Draconis Entertainment\Monkey Business\mb.exe" + ;; "MudSplat English") a="a" f="f" From a9cedbf3408224e2642113f92d8b7c8cb1157561 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 24 Oct 2021 09:33:50 -0400 Subject: [PATCH 11/11] Do not show errors while xdg-open tries to find a suitable browser. --- audiogame-manager.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/audiogame-manager.sh b/audiogame-manager.sh index 3b97fb3..a9f0992 100755 --- a/audiogame-manager.sh +++ b/audiogame-manager.sh @@ -107,9 +107,9 @@ update() { # Function to open urls across OS. open_url() { if [[ "$(uname)" == "Darwin" ]]; then - open "${*}" + open "${*}" 2> /dev/null else - xdg-open "${*}" + xdg-open "${*}" 2> /dev/null fi } @@ -470,8 +470,8 @@ install_wine_bottle() { 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/mono -name "wine-mono*x86.msi")" - geckoPath="$(find /usr/share/wine/gecko -name "wine-gecko*x86.msi")" + monoPath="$(find /usr/share/wine/mono -name "wine-mono*x86.msi" 2> /dev/null)" + geckoPath="$(find /usr/share/wine/gecko -name "wine-gecko*x86.msi" 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" @@ -1521,7 +1521,7 @@ case "${game}" in "Crime Hunter") export WINEARCH=win64 export winVer="win7" - install_wine_bottle speechsdk + install_wine_bottle download "http://masonasons.me/softs/CH2.0Win.zip" "https://stormgames.wolfe.casa/downloads/nvdaControllerClient64.dll" unzip -d "$WINEPREFIX/drive_c/Program Files/crime-hunter" "${cache}/CH2.0Win.zip" find "${WINEPREFIX}" -type f -name 'nvdaControllerClient64.dll' -exec cp -v "${cache}/nvdaControllerClient64.dll" "{}" \;