40 Commits

Author SHA1 Message Date
Storm Dragon f50b872f6a Redundancy for some downloads. 2026-04-28 19:46:15 -04:00
Storm Dragon b6d77279f7 tarted work on restoring Apple @e support. 2026-04-28 19:20:12 -04:00
Storm Dragon 1063f21c43 Initial pass at getting all the scripts and menus working with the new everything in home setup. Also unify speech settings. Not sure why I thought separate speech settings for all menus was a good idea lol. 2026-04-28 18:21:43 -04:00
Storm Dragon 20811bba1e Attempt to make wine installations more robust. 2026-04-26 02:41:06 -04:00
Storm Dragon 6a05a2e385 Avoid login shell in install X session 2026-04-23 16:30:57 -04:00
Storm Dragon 085ba2bcca Fix install-session startx wrapper 2026-04-23 16:08:20 -04:00
Storm Dragon c0ac5dbf4b Add X-backed Wine install wrapper 2026-04-23 15:45:41 -04:00
Storm Dragon ae4e43cabf Updated some games and some capatibility functions. 2026-04-23 13:37:23 -04:00
Storm Dragon a9387ddd6a Fix bug in menu so that first item in submenus gets read automatically. 2026-04-23 12:46:09 -04:00
Storm Dragon 6801613c99 More work on wine compatbility. 2026-04-23 02:23:55 -04:00
Storm Dragon a831d5f2d5 More careful about replacing dlls with the correct version. 2026-04-23 00:42:45 -04:00
Storm Dragon 0728a7eb01 Make sure dlls are downloaded and installed even if missed in an earlier step. 2026-04-23 00:31:08 -04:00
Storm Dragon 0586974de8 Make sure nvda dlls are used when launching games that need them. 2026-04-23 00:22:06 -04:00
Storm Dragon 077a6537df Launch browser with cthulhu running. 2026-04-23 00:00:27 -04:00
Storm Dragon 372bc878d4 Updated get_installer. 2026-04-22 23:33:15 -04:00
Storm Dragon 52cb38964d Implemented get_installer. 2026-04-22 23:28:17 -04:00
Storm Dragon 6512d71c60 Rename haunted Party so it's correctly placed in the menu. 2026-04-22 23:18:11 -04:00
Storm Dragon 10bcd1ea3a Fixed h reading help instead of navigating to items that begin with h. Help now bound to control+h. 2026-04-22 23:12:29 -04:00
Storm Dragon 97964682fb Updated wine installs. 2026-04-22 22:55:52 -04:00
Storm Dragon 1ea194baf6 Use Stormux IPFS gateway for game downloads 2026-04-22 22:44:46 -04:00
Storm Dragon 98ae684f7a RHVoice updates. 2026-04-22 22:16:11 -04:00
Storm Dragon 2f45f9edab Menu modifications. 2026-04-22 21:26:05 -04:00
Storm Dragon 0c4bbed905 Make installer alerts wait for speech 2026-04-22 16:51:39 -04:00
Storm Dragon 67eefc4d97 Remove obsolete root overlay scripts 2026-04-22 14:27:22 -04:00
Storm Dragon 153fbd90d2 Start nvda2speechd for Wine games 2026-04-22 13:53:43 -04:00
Storm Dragon 4c5e69649e Map Wine Program Files into local games 2026-04-22 12:38:40 -04:00
Storm Dragon 7c9f485962 Add basic Wine install and launch helpers 2026-04-22 12:06:02 -04:00
Storm Dragon e42edf2000 Improve install action menu feedback 2026-04-22 01:09:05 -04:00
Storm Dragon e052fb314e Define fex for game launch scripts 2026-04-21 23:35:28 -04:00
Storm Dragon 8aa2ac37e1 Support writable headless Xorg launch config 2026-04-21 20:23:25 -04:00
Storm Dragon b7473e99fe Clean up download progress monitor 2026-04-21 19:25:35 -04:00
Storm Dragon c6a182a47a Make sure expected directories exist in home. 2026-04-21 18:57:00 -04:00
Storm Dragon 038d2f4b62 Speech-dispatcher fixes. 2026-04-21 17:01:43 -04:00
Storm Dragon a8fe5d1eab More work on gettings things working. 2026-04-21 16:44:05 -04:00
Storm Dragon 93b7ad2ae5 Write ssh information in a writable area. 2026-04-21 16:18:23 -04:00
Storm Dragon 284662ff49 Debugging for menu. 2026-04-21 15:31:43 -04:00
Storm Dragon 6761f72338 game launcher updates. 2026-04-21 15:20:37 -04:00
Storm Dragon 2a8265a3b6 Start work on game installer and launcher actually working. 2026-04-21 14:47:09 -04:00
Storm Dragon b83b995cf0 Organize files into categories. Likely still a bit of cleanup left to do. 2026-04-21 12:50:36 -04:00
Storm Dragon c92d35a023 Reorganize files for new image. Add new paths in home directory. Start on game launchers and installers. 2026-04-21 12:21:31 -04:00
347 changed files with 5808 additions and 1283 deletions
+2
View File
@@ -2,6 +2,8 @@
image/*
*.img
*.img.xz
__pycache__/
tests/
# AI assistant files
AGENTS.md
+1
View File
@@ -0,0 +1 @@
/home/stormux/.local/etc/RHVoice
+1
View File
@@ -0,0 +1 @@
/home/stormux/.local/etc/speech-dispatcher/speechd.conf
@@ -0,0 +1,2 @@
HostKey /home/stormux/.local/etc/ssh/ssh_host_ed25519_key
HostKey /home/stormux/.local/etc/ssh/ssh_host_rsa_key
+1
View File
@@ -0,0 +1 @@
%wheel ALL=(ALL) NOPASSWD: /usr/lib/stormux/stormux_alsa_state.sh *
+1
View File
@@ -0,0 +1 @@
%wheel ALL=(ALL) NOPASSWD: /home/stormux/.local/bin/stormux_service_state.sh *
@@ -0,0 +1,8 @@
[Unit]
RequiresMountsFor=/home/stormux/.local/state/alsa
[Service]
ExecStart=
ExecStart=-/usr/lib/stormux/stormux_alsa_state.sh restore
ExecStop=
ExecStop=-/usr/lib/stormux/stormux_alsa_state.sh store
@@ -0,0 +1,8 @@
[Unit]
Wants=user@1000.service
After=user@1000.service
[Service]
Environment=HOME=/home/stormux
Environment=XDG_RUNTIME_DIR=/run/user/1000
Environment=SPEECHD_ADDRESS=unix_socket:/run/user/1000/speech-dispatcher/speechd.sock
@@ -0,0 +1,5 @@
[Unit]
Wants=
Wants=stormux-sshd-hostkeys.service ssh-access.target
After=
After=network.target stormux-sshd-hostkeys.service
@@ -0,0 +1,11 @@
[Unit]
Description=Apply persistent Stormux service state
After=local-fs.target
RequiresMountsFor=/home/stormux/.local/.services
[Service]
Type=oneshot
ExecStart=/home/stormux/.local/bin/stormux_service_state.sh apply
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,7 @@
[Unit]
Description=Generate persistent Stormux SSH host keys
RequiresMountsFor=/home/stormux/.local/etc/ssh
[Service]
Type=oneshot
ExecStart=/usr/lib/stormux/stormux_sshd_hostkeys.sh
@@ -0,0 +1,13 @@
[Unit]
Description=Create Stormux user directories
RequiresMountsFor=/home/stormux
After=local-fs.target user@1000.service
[Service]
Type=oneshot
User=stormux
Environment=HOME=/home/stormux
ExecStart=/usr/bin/xdg-user-dirs-update
[Install]
WantedBy=multi-user.target
+2 -2
View File
@@ -41,7 +41,7 @@ if ! [[ -e "/tmp/startup_complete" ]]; then
play -qV0 /usr/share/sounds/stormux/start.opus
fi
if [[ "$(tty)" == "/dev/tty1" ]]; then
/usr/local/bin/diagnostics.sh
exec /usr/local/bin/game_launcher.py
/home/stormux/.local/bin/diagnostics.sh
exec /home/stormux/.local/bin/game_launcher.py
exit
fi
+2 -2
View File
@@ -109,10 +109,10 @@ case "$GAME" in
nmtui-connect
;;
"Install to Disk")
/usr/local/bin/install_to_disk.sh
/home/stormux/.local/bin/install_to_disk.sh
;;
"Set Timezone")
sudo /usr/local/bin/set-timezone.sh
sudo /home/stormux/.local/bin/set-timezone.sh
;;
*".md") /usr/bin/markdown -toc "$GAME" | /usr/bin/w3m -T text/html ;;
"/usr/bin/"*) $GAME ;;
+2 -2
View File
@@ -19,7 +19,7 @@ sound = "play -qV0 \"|sox -np synth .07 sq 400\" \"|sox -np synth .5 sq 800\" fa
# Escape always exits without action (built-in)
# Unbound keys are ignored - the mode waits for a valid key
a = "/usr/local/bin/select_audio_convert.sh"
a = "/home/stormux/.local/bin/select_audio_convert.sh"
i = "/usr/bin/access-irc"
r = "/usr/local/bin/record.sh"
r = "/home/stormux/.local/bin/record.sh"
w = "brave"
+318
View File
@@ -0,0 +1,318 @@
#!/usr/bin/env bash
# shellcheck disable=SC2154
download_with_fallback() {
local outputPath="$1"
local sourceUrl="$2"
local errorFile=""
local curlArgs=(
--fail
--show-error
--location
--connect-timeout 20
--speed-limit 1024
--speed-time 30
--retry 3
--retry-connrefused
--retry-delay 2
)
local curlExitCode=0
local retryExitCode=0
local fallbackExitCode=0
local wgetExitCode=0
local totalBytes=0
downloadAttemptExitCodes=""
downloadErrorLog=""
errorFile="$(mktemp)" || return 1
totalBytes="$(get_remote_file_size "${sourceUrl}")"
printf 'Trying curl with resume support: %s\n' "${sourceUrl}" >&2
run_download_command "${outputPath}" "${totalBytes}" "${errorFile}" curl -4 -C - "${curlArgs[@]}" --output "${outputPath}" "${sourceUrl}"
curlExitCode=$?
if [[ "${curlExitCode}" -eq 0 ]]; then
rm -f "${errorFile}"
return 0
fi
rm -f "${outputPath}"
printf 'Trying fresh IPv4 curl download: %s\n' "${sourceUrl}" >&2
run_download_command "${outputPath}" "${totalBytes}" "${errorFile}" curl -4 "${curlArgs[@]}" --output "${outputPath}" "${sourceUrl}"
retryExitCode=$?
if [[ "${retryExitCode}" -eq 0 ]]; then
rm -f "${errorFile}"
return 0
fi
rm -f "${outputPath}"
printf 'Trying fresh curl download with any address family: %s\n' "${sourceUrl}" >&2
run_download_command "${outputPath}" "${totalBytes}" "${errorFile}" curl "${curlArgs[@]}" --output "${outputPath}" "${sourceUrl}"
fallbackExitCode=$?
if [[ "${fallbackExitCode}" -eq 0 ]]; then
rm -f "${errorFile}"
return 0
fi
if command -v wget > /dev/null 2>&1; then
rm -f "${outputPath}"
printf 'Trying wget fallback: %s\n' "${sourceUrl}" >&2
run_download_command "${outputPath}" "${totalBytes}" "${errorFile}" wget --tries=3 --timeout=20 --read-timeout=30 --output-document="${outputPath}" "${sourceUrl}"
wgetExitCode=$?
if [[ "${wgetExitCode}" -eq 0 ]]; then
rm -f "${errorFile}"
return 0
fi
fi
downloadAttemptExitCodes="curl: ${curlExitCode}, ${retryExitCode}, ${fallbackExitCode}"
if [[ "${wgetExitCode}" -ne 0 ]]; then
downloadAttemptExitCodes+="; wget: ${wgetExitCode}"
fi
if cp -f "${errorFile}" "${cache}/curl-error.log" 2> /dev/null; then
downloadErrorLog="${cache}/curl-error.log"
rm -f "${errorFile}"
else
downloadErrorLog="${errorFile}"
fi
return 1
}
internet_available() {
local targetUrl
local targetUrls=(
"https://www.gnu.org/"
"https://1.1.1.1/"
)
for targetUrl in "${targetUrls[@]}"; do
if curl -fsS --connect-timeout 5 --max-time 8 "$targetUrl" > /dev/null 2>&1; then
return 0
fi
done
return 1
}
require_internet_connection() {
local message="No internet connection detected. Configure a connection from System Settings, Internet Configuration, then try again."
if internet_available; then
return 0
fi
ui_msgbox "Game Installer" "Game Installer" "$message"
return 1
}
get_remote_file_size() {
local sourceUrl="$1"
local headerOutput
headerOutput="$(curl --fail --silent --show-error --location --head --max-redirs 10 --max-time 20 "${sourceUrl}" 2> /dev/null || true)"
awk '
BEGIN { IGNORECASE = 1 }
/^content-length:/ {
gsub("\r", "", $2)
if ($2 ~ /^[0-9]+$/) {
contentLength = $2
}
}
END {
if (contentLength != "") {
print contentLength
} else {
print 0
}
}
' <<< "${headerOutput}"
}
beep_download_progress() {
local percent="$1"
local frequency
[[ "${STORMUX_DOWNLOAD_BEEPS:-1}" == "1" ]] || return 0
command -v play > /dev/null 2>&1 || return 0
frequency="$((220 + (percent * 7)))"
play -q -n synth 0.06 sine "${frequency}" vol 0.25 > /dev/null 2>&1 || true
}
monitor_download_progress() {
local outputPath="$1"
local totalBytes="$2"
local doneFile="$3"
local currentBytes=0
local percent=0
local lastAnnouncedPercent=0
local lastAnnouncedBytes=0
local tickCount=0
while [[ ! -e "$doneFile" ]]; do
if [[ -f "$outputPath" ]]; then
currentBytes="$(stat -c '%s' "$outputPath" 2> /dev/null || printf '0')"
else
currentBytes=0
fi
if [[ "$totalBytes" -gt 0 ]]; then
percent="$(((currentBytes * 100) / totalBytes))"
if [[ "$percent" -gt 100 ]]; then
percent=100
fi
if [[ "$percent" -gt 0 && "$percent" -ge $((lastAnnouncedPercent + 10)) ]]; then
printf 'Downloaded %s%% (%s/%s bytes)\n' "$percent" "$currentBytes" "$totalBytes" >&2
beep_download_progress "$percent"
lastAnnouncedPercent="$percent"
fi
else
tickCount="$((tickCount + 1))"
if [[ "$currentBytes" -gt "$lastAnnouncedBytes" && "$tickCount" -ge 5 ]]; then
printf 'Downloaded %s bytes\n' "$currentBytes" >&2
beep_download_progress 50
lastAnnouncedBytes="$currentBytes"
tickCount=0
fi
fi
sleep 2
done
}
stop_download_processes() {
local doneFile="$1"
local monitorPid="$2"
local downloadPid="${3:-}"
touch "$doneFile" 2> /dev/null || true
if [[ -n "$downloadPid" ]] && kill -0 "$downloadPid" 2> /dev/null; then
kill "$downloadPid" 2> /dev/null || true
wait "$downloadPid" 2> /dev/null || true
fi
if [[ -n "$monitorPid" ]] && kill -0 "$monitorPid" 2> /dev/null; then
kill "$monitorPid" 2> /dev/null || true
wait "$monitorPid" 2> /dev/null || true
fi
rm -f "$doneFile"
}
run_download_command() {
local outputPath="$1"
local totalBytes="$2"
local errorFile="$3"
local doneFile
local downloadPid=""
local monitorPid
local commandStatus=0
shift 3
doneFile="$(mktemp)" || return 1
rm -f "$doneFile"
monitor_download_progress "$outputPath" "$totalBytes" "$doneFile" &
monitorPid="$!"
trap 'stop_download_processes "$doneFile" "$monitorPid" "$downloadPid"; trap - INT TERM HUP; exit 130' INT TERM HUP
"$@" 2> >(tee -a "$errorFile" >&2) &
downloadPid="$!"
if wait "$downloadPid"; then
commandStatus=0
else
commandStatus="$?"
fi
stop_download_processes "$doneFile" "$monitorPid"
trap - INT TERM HUP
return "$commandStatus"
}
validate_downloaded_cache_file() {
local dest="$1"
local downloadError=0
if [[ "${STORMUX_SKIP_DOWNLOAD_VALIDATION:-0}" == "1" ]]; then
return 0
fi
case "${dest##*.}" in
pk3|zip)
unzip -tq "${cache}/${dest}" | ui_progressbox "Game Installer" "Validating ${dest}"
downloadError=${PIPESTATUS[0]}
;;
7z)
7z t "${cache}/${dest}" | ui_progressbox "Game Installer" "Validating ${dest}"
downloadError=${PIPESTATUS[0]}
;;
exe)
if ! hexdump -n 2 -v -e '/1 "%02X"' "${cache}/${dest}" | grep -q "4D5A"; then
downloadError=1
fi
;;
wad)
if [[ "$(file -b --mime-type "${cache}/${dest}")" != "application/octet-stream" ]]; then
downloadError=1
fi
;;
*)
if file -b "${cache}/${dest}" | grep -q "HTML document"; then
downloadError=1
fi
;;
esac
if [[ "${downloadError}" -ne 0 ]]; then
rm -fv "${cache:?}/${dest}"
alert "Game Installer" "Game Installer" "Error downloading ${dest}. Installation cannot continue."
exit 1
fi
}
download() {
local sourceUrls=("$@")
local sourceUrl
local dest
for sourceUrl in "${sourceUrls[@]}"; do
dest="${sourceUrl##*/}"
dest="${dest//%20/ }"
dest="${dest#*\?filename=}"
dest="${dest#*\?file=}"
dest="${dest%\?*}"
[[ -s "${cache}/${dest}" ]] || rm -f "${cache:?}/${dest}" 2> /dev/null
if [[ "${redownload}" == "true" && -e "${cache}/${dest}" ]]; then
rm -v "${cache:?}/${dest}"
fi
if [[ -e "${cache}/${dest}" ]]; then
continue
fi
ui_progressbox "Game Installer" "Downloading ${dest}" < /dev/null
if ! download_with_fallback "${cache}/${dest}" "${sourceUrl}"; then
ui_msgbox "Game Installer" "Game Installer" "Could not download ${sourceUrl}.\n\nDownload exit codes: ${downloadAttemptExitCodes}\nError details: ${downloadErrorLog}"
exit 1
fi
validate_downloaded_cache_file "${dest}"
done
}
download_named() {
local dest="$1"
local sourceUrl="$2"
[[ -n "${dest}" && -n "${sourceUrl}" ]] || return 1
[[ -s "${cache}/${dest}" ]] || rm -f "${cache:?}/${dest}" 2> /dev/null
if [[ "${redownload}" == "true" && -e "${cache}/${dest}" ]]; then
rm -v "${cache:?}/${dest}"
fi
if [[ -e "${cache}/${dest}" ]]; then
return 0
fi
if ! download_with_fallback "${cache}/${dest}" "${sourceUrl}"; then
ui_msgbox "Game Installer" "Game Installer" "Could not download ${dest}.\n\nDownload exit codes: ${downloadAttemptExitCodes}\nError details: ${downloadErrorLog}"
exit 1
fi
validate_downloaded_cache_file "${dest}"
}
+499
View File
@@ -0,0 +1,499 @@
#!/usr/bin/env bash
# shellcheck disable=SC2154
scriptDir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
installSessionScript="${scriptDir%/.functions}/bin/stormux_install_session.sh"
# shellcheck disable=SC1091
source "${scriptDir}/download.sh"
# shellcheck disable=SC1091
source "${scriptDir}/ipfs.sh"
speak() {
local message="$1"
local waitForSpeech="${2:-0}"
local speechMessage="${message//\\n/ }"
printf '%s\n' "${message}"
if [[ "$waitForSpeech" == "1" ]]; then
spd-say -Cw "${speechMessage}" 2> /dev/null || true
else
spd-say "${speechMessage}" 2> /dev/null || true
fi
}
ui_msgbox() {
local _title="$1"
local _backTitle="$2"
local message="$3"
speak "${message}" 1
}
ui_infobox() {
ui_msgbox "$@"
}
ui_yesno() {
local _title="$1"
local _backTitle="$2"
local message="$3"
speak "${message}"
return 1
}
ui_progressbox() {
local _title="$1"
local message="$2"
speak "${message}"
cat
}
alert() {
local title="Game Installer"
local backTitle="Game Installer"
local message="Press enter to continue."
if [[ $# -eq 1 ]]; then
message="$1"
elif [[ $# -eq 2 ]]; then
title="$1"
backTitle="$1"
message="$2"
elif [[ $# -ge 3 ]]; then
title="$1"
backTitle="$2"
shift 2
message="$*"
fi
ui_msgbox "${title}" "${backTitle}" "${message}"
}
check_architecture() {
local architecture
local supportedArch
architecture="$(uname -m)"
for supportedArch in "$@"; do
if [[ "${architecture}" == "${supportedArch}" ]]; then
return 0
fi
done
if [[ "${architecture}" == "aarch64" && -d "${HOME}/.fex-emu/RootFS/ArchLinux" && "$*" == *"x86_64"* ]]; then
export fex="FEXLoader -- "
return 0
fi
ui_infobox "Game Installer" "Game Installer" "This game is not compatible with ${architecture}."
exit 1
}
check_dependencies() {
local missingDependencies=()
local dependency
for dependency in "$@"; do
if [[ "${dependency}" == python-* ]]; then
if ! python3 -c "import ${dependency#*:}" > /dev/null 2>&1; then
missingDependencies+=("${dependency%:*}")
fi
elif ! command -v "${dependency}" > /dev/null 2>&1; then
missingDependencies+=("${dependency}")
fi
done
if [[ "${#missingDependencies[@]}" -eq 0 ]]; then
return 0
fi
ui_msgbox "Game Installer" "Game Installer" "Missing dependencies: ${missingDependencies[*]}"
exit 1
}
open_url() {
local targetUrl="$1"
check_dependencies brave cthulhu
env GAME="$targetUrl" startx
}
run_install_x_command() {
local quotedCommand=""
check_dependencies startx
if [[ ! -x "$installSessionScript" ]]; then
ui_msgbox "Game Installer" "Game Installer" "Missing install session helper: ${installSessionScript}"
exit 1
fi
printf -v quotedCommand '%q ' "$@"
quotedCommand="${quotedCommand% }"
env -u DISPLAY \
STORMUX_INSTALL_COMMAND="$quotedCommand" \
startx "$installSessionScript"
}
run_wine_headless() {
local commandName="$1"
shift
command "$commandName" "$@"
}
wine() {
run_install_x_command command wine "$@"
}
winetricks() {
run_install_x_command command winetricks "$@"
}
wait_for_enter() {
local message="$1"
printf '%s\n' "$message"
if [[ -r /dev/tty ]]; then
read -r < /dev/tty || true
else
read -r || true
fi
}
collect_installer_file() {
local installerName="$1"
local sourceDir
for sourceDir in "${cache}" "${HOME}/Downloads" "${HOME}/Desktop"; do
[[ -d "$sourceDir" ]] || continue
find "$sourceDir" -maxdepth 1 -type f -name "$installerName" -exec mv -v {} "${cache}/" \; 2> /dev/null || true
done
[[ -f "${cache}/${installerName}" ]]
}
get_installer() {
local installerName="$1"
local downloadUrl="${2:-}"
local instructions
if collect_installer_file "$installerName"; then
return 0
fi
if [[ -n "$downloadUrl" ]]; then
instructions="Opening game download page.
When the download finishes, please close your browser window to continue. You can do this by pressing control+w.
Press enter to continue."
speak "$instructions" 1
wait_for_enter "Press enter to continue."
if ! open_url "$downloadUrl"; then
ui_msgbox "Game Installer" "Game Installer" "Could not open the browser for ${installerName}. Check the install log for details."
exit 1
fi
if collect_installer_file "$installerName"; then
return 0
fi
fi
ui_msgbox "Game Installer" "Game Installer" "Could not find ${installerName}. Make sure the download completed and the file name is ${installerName}."
exit 1
}
install_with_progress() {
local operation="$1"
local message="$2"
shift 2
case "$operation" in
unzip)
unzip -o "$@" | ui_progressbox "Game Installation" "$message"
;;
7z)
7z -y "$@" | ui_progressbox "Game Installation" "$message"
;;
cp|copy)
cp -fv "$@" | ui_progressbox "Game Installation" "$message"
;;
*)
"$operation" "$@" | ui_progressbox "Game Installation" "$message"
;;
esac
}
ensure_wine_accessibility_files() {
local accessibilityDir="${HOME}/.local/share/stormux/wine-accessibility"
local nvdaControllerClient32Dll="${ipfsGateway}/ipfs/QmTrRrT4QFKSkZ8ivfUawA6iJ6adEyyogccE3nLDTfSK8u?filename=nvdaControllerClient32.dll"
local nvdaControllerClient64Dll="${ipfsGateway}/ipfs/QmaYE7RFDtwHCiXCVLcuA3esfFx6E7koidtvrck9AwPuuN?filename=nvdaControllerClient64.dll"
local nvda2speechdBinary="${ipfsGateway}/ipfs/QmPxhoNsoFoJC7bCfioBBCcK8tEoSoYpm342z6u7KjFsVz?filename=nvda2speechd"
download_named "nvdaControllerClient32.dll" "$nvdaControllerClient32Dll"
download_named "nvdaControllerClient64.dll" "$nvdaControllerClient64Dll"
download_named "nvda2speechd" "$nvda2speechdBinary"
mkdir -p "$accessibilityDir"
cp -f "${cache}/nvdaControllerClient32.dll" "${accessibilityDir}/nvdaControllerClient32.dll"
cp -f "${cache}/nvdaControllerClient64.dll" "${accessibilityDir}/nvdaControllerClient64.dll"
cp -f "${cache}/nvda2speechd" "${accessibilityDir}/nvda2speechd"
chmod 755 "${accessibilityDir}/nvda2speechd"
}
replace_wine_nvda_dlls() {
local accessibilityDir="${HOME}/.local/share/stormux/wine-accessibility"
local scanRoots=("${HOME}/.local/games/Wine" "${WINEPREFIX:-}/drive_c")
local scanRoot
local dllFile
local dllName
local replacement
local fileInfo
[[ -d "${WINEPREFIX:-}" ]] || return 0
ensure_wine_accessibility_files
for scanRoot in "${scanRoots[@]}"; do
[[ -d "$scanRoot" ]] || continue
find "$scanRoot" -type f -iname 'nvdaControllerClient*.dll' -print0
done | while IFS= read -r -d '' dllFile; do
dllName="${dllFile##*/}"
replacement=""
fileInfo="$(file "$dllFile" 2> /dev/null || true)"
if grep -q 'PE32+' <<< "$fileInfo"; then
replacement="${accessibilityDir}/nvdaControllerClient64.dll"
elif grep -q 'PE32' <<< "$fileInfo"; then
replacement="${accessibilityDir}/nvdaControllerClient32.dll"
else
case "${dllName,,}" in
nvdacontrollerclient32.dll)
replacement="${accessibilityDir}/nvdaControllerClient32.dll"
;;
nvdacontrollerclient64.dll)
replacement="${accessibilityDir}/nvdaControllerClient64.dll"
;;
esac
fi
if [[ -n "$replacement" && -f "$replacement" ]]; then
cp -f "$replacement" "$dllFile"
fi
done
}
prepare_wine_game_dirs() {
local driveC="${WINEPREFIX}/drive_c"
local gamesWineRoot="${HOME}/.local/games/Wine"
local programName
local sourceDir
local targetDir
local item
[[ -d "$driveC" ]] || return 0
for programName in "Program Files" "Program Files (x86)"; do
sourceDir="${driveC}/${programName}"
targetDir="${gamesWineRoot}/${programName}"
mkdir -p "$targetDir"
if [[ -L "$sourceDir" ]]; then
continue
fi
if [[ -d "$sourceDir" ]]; then
shopt -s dotglob nullglob
for item in "$sourceDir"/*; do
mv -n "$item" "$targetDir/"
done
shopt -u dotglob nullglob
rmdir "$sourceDir" 2> /dev/null || true
fi
if [[ ! -e "$sourceDir" ]]; then
ln -s "$targetDir" "$sourceDir"
fi
done
}
wine_dependency_state_dir() {
printf '%s\n' "${WINEPREFIX}/.stormux-installed-winetricks"
}
wine_dependency_marker() {
local dependency="$1"
local safeDependency
safeDependency="${dependency//[^[:alnum:]._-]/_}"
printf '%s/%s.done\n' "$(wine_dependency_state_dir)" "$safeDependency"
}
wine_dependency_installed() {
local dependency="$1"
[[ -f "$(wine_dependency_marker "$dependency")" ]]
}
mark_wine_dependencies_installed() {
local dependency
local stateDir
stateDir="$(wine_dependency_state_dir)"
mkdir -p "$stateDir"
for dependency in "$@"; do
: > "$(wine_dependency_marker "$dependency")"
done
}
install_missing_wine_dependencies() {
local progressMessage="$1"
local forceWinetricks="${2:-false}"
local dependency
local missingDeps=()
shift 2
for dependency in "$@"; do
if ! wine_dependency_installed "$dependency"; then
missingDeps+=("$dependency")
fi
done
if [[ "${#missingDeps[@]}" -eq 0 ]]; then
return 0
fi
if [[ "$forceWinetricks" == "true" ]]; then
WINETRICKS_FORCE=1 winetricks -q "${missingDeps[@]}" \
| ui_progressbox "Wine Setup" "$progressMessage"
else
winetricks -q "${missingDeps[@]}" \
| ui_progressbox "Wine Setup" "$progressMessage"
fi
mark_wine_dependencies_installed "${missingDeps[@]}"
}
install_wine_bottle() {
local dep
local missingCommonDeps=()
local regularDeps=()
local needsSpeechsdk=false
local winetricksOptions=()
check_dependencies wine wineserver winepath winetricks
if [[ -z "${WINEARCH:-}" ]]; then
export WINEARCH="win64"
fi
case "$WINEARCH" in
win64) export WINEPREFIX="${HOME}/.local/wine64" ;;
*)
ui_msgbox "Game Installer" "Game Installer" "Unsupported Wine architecture: ${WINEARCH}"
exit 1
;;
esac
mkdir -p "$WINEPREFIX"
if [[ ! -f "${WINEPREFIX}/system.reg" ]]; then
ui_progressbox "Wine Setup" "Initializing Wine bottle" < /dev/null
DISPLAY="${DISPLAY:-}" wine wineboot -u
fi
prepare_wine_game_dirs
for dep in isolate_home corefonts vcrun2019; do
if ! wine_dependency_installed "$dep"; then
missingCommonDeps+=("$dep")
fi
done
if [[ "${#missingCommonDeps[@]}" -gt 0 ]]; then
winetricks -q "${missingCommonDeps[@]}" win10 \
| ui_progressbox "Wine Setup" "Installing common Wine dependencies"
mark_wine_dependencies_installed "${missingCommonDeps[@]}"
fi
install_missing_wine_dependencies "Installing Wine speech support" true speechsdk
install_missing_wine_dependencies "Restoring Wine Windows version" false win10
for dep in "$@"; do
case "$dep" in
sapi|speechsdk)
needsSpeechsdk=true
;;
corefonts|vcrun2019|isolate_home)
regularDeps+=("$dep")
;;
win7|win8|win10)
:
;;
*)
regularDeps+=("$dep")
;;
esac
done
if [[ -n "${winetricksSettings:-}" ]]; then
read -r -a winetricksOptions <<< "$winetricksSettings"
fi
if [[ "${#regularDeps[@]}" -gt 0 ]]; then
local missingRegularDeps=()
for dep in "${regularDeps[@]}"; do
if ! wine_dependency_installed "$dep"; then
missingRegularDeps+=("$dep")
fi
done
if [[ "${#missingRegularDeps[@]}" -gt 0 ]]; then
winetricks -q isolate_home "${missingRegularDeps[@]}" "${winetricksOptions[@]}" \
| ui_progressbox "Wine Setup" "Installing Wine dependencies"
mark_wine_dependencies_installed isolate_home "${missingRegularDeps[@]}"
fi
elif [[ "${#winetricksOptions[@]}" -gt 0 ]]; then
winetricks -q "${winetricksOptions[@]}" \
| ui_progressbox "Wine Setup" "Applying Wine settings"
fi
if [[ "$needsSpeechsdk" == "true" ]]; then
install_missing_wine_dependencies "Installing Wine speech support" true speechsdk
install_missing_wine_dependencies "Restoring Wine Windows version" false win10
fi
if [[ -n "${winVer:-}" ]]; then
export gameWinVer="$winVer"
fi
}
set_app_winver() {
local exePath="$1"
local winVersion="$2"
local exeName="${exePath##*\\}"
local regFile
[[ -n "$exePath" && -n "$winVersion" ]] || return 0
regFile="$(mktemp)"
cat > "$regFile" <<REGEDIT
REGEDIT4
[HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\${exeName}]
"Version"="${winVersion}"
REGEDIT
wine regedit "$regFile"
rm -f "$regFile"
}
add_launcher() {
local wineTarget="$1"
local launcherRecipe="${launchRoot}/${gameName}.game"
[[ -n "$wineTarget" ]] || return 1
if [[ -n "${gameWinVer:-}" ]]; then
set_app_winver "$wineTarget" "$gameWinVer"
unset gameWinVer
fi
replace_wine_nvda_dlls
cat > "$launcherRecipe" <<LAUNCHER
run_wine_path '${wineTarget}'
LAUNCHER
chmod 755 "$launcherRecipe"
}
+82
View File
@@ -0,0 +1,82 @@
#!/usr/bin/env bash
set -euo pipefail
scriptDir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
installerPath="${1:-}"
logRoot="${STORMUX_LOG_ROOT:-${HOME}/Logs}"
logDir="${logRoot}/installs"
logFile=""
if [[ -z "${installerPath}" || ! -f "${installerPath}" ]]; then
printf 'Usage: %s installer.sh\n' "${0##*/}" >&2
exit 2
fi
gameName="${installerPath##*/}"
gameName="${gameName%.sh}"
game="${game:-${gameName}}"
installPath="${installPath:-${HOME}/.local/games}"
cache="${cache:-${XDG_CACHE_HOME:-${HOME}/.cache}/stormux-game-install}"
launchRoot="${launchRoot:-${HOME}/.local/.launch}"
redownload="${redownload:-false}"
ipfsGateway="${ipfsGateway:-https://ipfs.stormux.org}"
fex="${fex:-}"
DISPLAY="${DISPLAY:-:0}"
export installPath cache launchRoot redownload ipfsGateway fex gameName game DISPLAY
safe_log_name() {
local name="$1"
name="${name//\//_}"
name="${name//[^[:alnum:]. _-]/_}"
printf '%s\n' "$name"
}
prune_old_logs() {
find "$logDir" -type f -name '*.log' -mtime +7 -delete 2> /dev/null || true
}
setup_logging() {
local safeName
mkdir -p "$logDir"
prune_old_logs
safeName="$(safe_log_name "$gameName")"
logFile="${logDir}/${safeName}.log"
exec > >(tee "$logFile") 2>&1
printf 'Installing %s [%s]\n' "$gameName" "$(date)"
printf 'Installer path: %s\n' "$installerPath"
}
finish_logging() {
local exitCode=$?
if [[ "$exitCode" -eq 0 ]]; then
printf '%s installed [%s]\n' "$gameName" "$(date)"
else
printf '%s installation failed with exit code %s [%s]\n' "$gameName" "$exitCode" "$(date)"
speak "${gameName} installation failed. Check ${logFile} for details." 1
fi
exit "$exitCode"
}
mkdir -p "${installPath}" "${cache}" "${launchRoot}"
setup_logging
trap finish_logging EXIT
# shellcheck disable=SC1091
source "${scriptDir}/game_install_functions.sh"
require_internet_connection
speak "Installing ${gameName}"
# shellcheck source=/dev/null
source "${installerPath}"
if [[ -f "${launchRoot}/${gameName}.game" ]]; then
ln -sf "${gameName}.game" "${launchRoot}/${gameName}.sh"
fi
speak "${gameName} installed"
+63
View File
@@ -0,0 +1,63 @@
# shellcheck shell=bash disable=SC2034,SC2154
# Central repository for IPFS game download URLs
# This file is sourced by functions.sh
declare -Ag ipfs=(
# Core System Files
[nvdaControllerClient32]="${ipfsGateway}/ipfs/QmTrRrT4QFKSkZ8ivfUawA6iJ6adEyyogccE3nLDTfSK8u?filename=nvdaControllerClient32.dll"
[nvdaControllerClient64]="${ipfsGateway}/ipfs/QmaYE7RFDtwHCiXCVLcuA3esfFx6E7koidtvrck9AwPuuN?filename=nvdaControllerClient64.dll"
[nvda2speechd]="${ipfsGateway}/ipfs/QmPxhoNsoFoJC7bCfioBBCcK8tEoSoYpm342z6u7KjFsVz?filename=nvda2speechd"
# Games (alphabetical order)
[BG 15 Puzzle]="${ipfsGateway}/ipfs/QmQiocMpMXoxejDftKKvmrR5xxpj1qcWcgkhBBwTcyijXg?filename=FPB32Setup10a.exe"
[BG 2048]="${ipfsGateway}/ipfs/QmPNt3c78UBgEMrTH3eJ5eD2mCMdth6jwes1iDKGW24Uj5?filename=BG204832Setup10a.exe"
[BG Aces Up Solitaire]="${ipfsGateway}/ipfs/QmTshtHBEV9dh7wFtaQpNUEYHZ3fBpuhSRZqc7k8HwmtPM?filename=ASB32Setup10.exe"
[BG Alchemy]="${ipfsGateway}/ipfs/Qma76HXBhmKgMDeHH1XLePsaWzzzLsBS2HRL3c7MVwDokg?filename=BAC32Setup10.exe"
[BG Battleship]="${ipfsGateway}/ipfs/Qmaq9P9fxdLTEFMGg4mhHrRuUbPg6HgU3eYVJNqZUimHjo?filename=BGB32Setup10.exe"
[BG Boggle]="${ipfsGateway}/ipfs/QmQwWiJw9hDiPdfwDyL4XepeoD66ztVRi3HwbSjFFP4CNg?filename=BGB32Setup10a.exe"
[BG Boxes]="${ipfsGateway}/ipfs/QmRn21tREXxXVSaDe9i54zEPzPSespjJAFBqu4DWocuagD?filename=BXB32Setup10.exe"
[BG Brainiac]="${ipfsGateway}/ipfs/QmWEdmTkQsjSqBgWUgnDajMf8QvQBbEF4Nxo6mhkXYzBtQ?filename=BRN32Setup10a.exe"
[BG Chess Challenge]="${ipfsGateway}/ipfs/QmT2yBpU5Jqna18FxYtyWzi4xMGAY9PyJWStAskxCHqBDw?filename=BGC32Setup10d.exe"
[BG Code Breaker]="${ipfsGateway}/ipfs/QmU486SssAdM7kPKwDyAKDLQs3Z92bG6wFjaLhzqDZCxAF?filename=BCB32Setup10.exe"
[BG Cribbage]="${ipfsGateway}/ipfs/QmeFud3EPHy7wQe8UENgvh96HdAazEkwqA2AutCNkYvB3t?filename=BGC32Setup12e.exe"
[BG Cribbage Solitaire]="${ipfsGateway}/ipfs/QmbRUiknnNcibWD3NwK4DFZGNHWswBgsFidUzU1TFGJ5Ra?filename=BCS32Setup10.exe"
[BG Crossword Puzzle]="${ipfsGateway}/ipfs/QmZQGY9CeATEiWrSqsKBz4AN6jPgQuvbBZSpQoLiMjoDr2?filename=BGX32Setup10h.exe"
[BG Draw Dominoes]="${ipfsGateway}/ipfs/QmZQGY9CeATEiWrSqsKBz4AN6jPgQuvbBZSpQoLiMjoDr2?filename=BDD32Setup.exe"
[BG Elevens Solitaire]="${ipfsGateway}/ipfs/QmWWZByYL5CsDSi6gQLGcMyBL7zqD5hWXbPXJr3shRt5AQ?filename=ESB32Setup10.exe"
[BG Fives Dominoes]="${ipfsGateway}/ipfs/QmSZt6dz7WQkNrFBmYq9n4WdYrrZyQAebTBPo46uHqCuNi?filename=BFD32Setup10.exe"
[BG Free Cell Solitaire]="${ipfsGateway}/ipfs/QmVfQMMnqTD9Zm8Xwv7rGrUTdS9FXToq7Fv6wtQQVgbQGR?filename=BGF32Setup20.exe"
[BG Golf Solitaire]="${ipfsGateway}/ipfs/QmfAp9EYou1pndLwYSdpYdUCHBv2DR94oFccQh1ii9JVLD?filename=GSB32Setup10a.exe"
[BG Hangman]="${ipfsGateway}/ipfs/QmXTPMmvw7JE2eLuPBLGSpkZqUn12TX7QEQZbX8qtp7GBx?filename=HMB32Setup10.exe"
[BG Hearts]="${ipfsGateway}/ipfs/QmdU5ag1PRjvG28wNX7aNuJqZSVxaqEEKjgG6GoRoDT8k4?filename=BGH32Setup10b.exe"
[BG Klondike Solitaire]="${ipfsGateway}/ipfs/QmctBDvhQWwER94LvgauR7sMDxv9D1mS9cToV47orTCdzU?filename=BGK32Setup10b.exe"
[BG LAP]="${ipfsGateway}/ipfs/Qma5WeCC9B2P5abRGX9nGYV8Zi9F8vfCCr4ehejP2bgmNm?filename=LAP32Setup10.exe"
[BG Master Mind]="${ipfsGateway}/ipfs/QmP6cwMbirbBqAaG9JLfNRnD2dvJfh6nq74kfwxs5hN2RQ?filename=BMM32Setup10.exe"
[BG Mine Sweeper]="${ipfsGateway}/ipfs/QmRa54HroWjwxHYfKr6hdmP34sHW5G3ecuzcjMA5UBBVKa?filename=MSB32Setup10.exe"
[BG Nomination Whist]="${ipfsGateway}/ipfs/Qmb7eGTMDgiaDC9muMW9n8bHoistGcNm1VgHc6sr7dRyHU?filename=BNW32Setup10a.exe"
[BG Penguin Solitaire]="${ipfsGateway}/ipfs/QmXKvQ6WNNSnDiSyYmvAhZXVdALnuhUGK7dSMQVkQNReJr?filename=BPS32Setup10c.exe"
[BG Poker Solitaire]="${ipfsGateway}/ipfs/QmPLv74LiDgVGuiGhu9HuPhx3uoMm9QyCYk6jgeFUHjj3S?filename=BPS32Setup10.exe"
[BG Pyramid Solitaire]="${ipfsGateway}/ipfs/QmaqXaBKD3xY2smhU2LcejXRTPnWZHqaTW9se8yRepLsHu?filename=PSB32Setup10a.exe"
[BG Scorpion Solitaire]="${ipfsGateway}/ipfs/QmSxJs2MiLQ61Fgx6vCpSD7GmQziLiCEU3sZ3mgWc7RsJ8?filename=BSS32Setup10.exe"
[BG Scrabble]="${ipfsGateway}/ipfs/QmVrwyPdJBnmc4wLW7oT2hexxXnXxs8bA7gfiqbnJsWJ16?filename=BGS32Setup20.exe"
[BG Simon]="${ipfsGateway}/ipfs/QmXtBCqB6VCFPaDYuLaFNP1BDtJSLCJdJZzgm61zMtrsQt?filename=BGS32Setup10.exe"
[BG Spider Solitaire]="${ipfsGateway}/ipfs/QmdWBaDnLVbKCJSpiqF675ew6nJ6KHUVXA5FEH3t3E7UAu?filename=SPB32Setup10b.exe"
[BG Sudoku]="${ipfsGateway}/ipfs/QmXCAHEVRGZBc8t45Jgn2vkxicwF9Aox6yz9XrQBdkv7WY?filename=SDB32Setup10a.exe"
[BG Tablic Solitaire]="${ipfsGateway}/ipfs/QmYoiFQ6JuSXfZfZXT3SQDsYzMWLBu9rW9yivi1xiPjqZx?filename=SDB32Setup10a.exe"
[BG Tri-Peaks Solitaire]="${ipfsGateway}/ipfs/QmWJGvSR6iaQfMHM3XuGCkWxx285jkzSDdNSvvk3bSCH8S?filename=TPB32Setup10a.exe"
[BG Twenty 20 Cricket]="${ipfsGateway}/ipfs/QmWAk2TMHMvW6Kjc1sZBEPsxmCNHfY3nF1K723PCqaTa57?filename=T20B32Setup10.exe"
[BG Uno]="${ipfsGateway}/ipfs/QmVsfPkebSoTDwYSXF1n7y4P9eGJTgTcGXdrEjpcV8A3Dv?filename=BGU32Setup11a.exe"
[BG Word Builder]="${ipfsGateway}/ipfs/QmXtR49EZShyj15Tc9CXQpBYVmKNfZpp4515Epm16bviuH?filename=BWB32Setup10.exe"
[BG Word Candy]="${ipfsGateway}/ipfs/QmfTgfRzd4JMRqKSfDiz76iMorkaG19BqH1K7nRCCDwo4H?filename=WCB32Setup10a.exe"
[BG Word Jumble]="${ipfsGateway}/ipfs/QmYQWZZifzKJSuVRCC1SabwRmEDz95GdFvbzRvsBMmTt6e?filename=BWJ32Setup10.exe"
[BG Word Maze]="${ipfsGateway}/ipfs/QmXPtj5PkVZjXpU3m6FAfm8MwVL6bQCvhEDoR385u6FGTL?filename=BWM32Setup10.exe"
[BG Word Solitaire]="${ipfsGateway}/ipfs/QmZp73ARDPqgnCz7zxfKeBHjNoHrgZSgg2NdQZR2sMyZGD?filename=WSB32Setup10.exe"
[BG Word Target]="${ipfsGateway}/ipfs/QmWWZFXVHNtmNkH55oermWWtrMcQ8qVqL687B7kGFyeezq?filename=WTB32Setup10a.exe"
[BG Word Yahtzee]="${ipfsGateway}/ipfs/QmdicAVDegDktY3euVAC2PPn4YBGz96KedxYXNe4WDQaoq?filename=BWY32Setup10.exe"
[BG Yahtzee]="${ipfsGateway}/ipfs/QmZebvkKgFAADnb1cgW6Bz7wTYdUh82X61QdtW66KcvmpF?filename=BGY32Setup10a.exe"
[Bloodshed]="${ipfsGateway}/ipfs/QmcTCTMep4zp5zTw8ZaXYpjtu9inNPn8bNzwhW6cX97egw?file=bloodshed.exe"
[Chopper Challenge]="${ipfsGateway}/ipfs/QmY1jmwVkmwEcqBs84i4mpancD3R1W4Vu6w1RdcrFUnbGx?filename=chopper%20challenge.zip"
[Christmas Chaos]="${ipfsGateway}/ipfs/QmYx11vsMDBgjPd1coZPGHxMXf2qtf4icqmB3Q9iUazyQv?filename=ChristmasChaos.zip"
[Kitchensinc Games]="${ipfsGateway}/ipfs/QmdkLPig6Kp3AZTwKAhjrhhsEuvhFCFhm6SHLUQVeNNYCb?filename=kitchen.tar.xz"
[Oh Shit]="${ipfsGateway}/ipfs/QmQnAJJrt5uABFziQc7enXYrJ74J9GKQSMi8Ry8ebsxfPV?filename=OhShit.zip"
[Villains From Beyond]="${ipfsGateway}/ipfs/QmWx271xuk3Mv9XTBoVu5BDJvXFZdasawC2nhtV21WAaUU?filename=villains_en.zip"
)
+1
View File
@@ -0,0 +1 @@
@@ -0,0 +1,4 @@
download "https://agarchive.net/games/mt/adrian's%20doom.exe"
install_wine_bottle
wine "${cache}/adrian's doom.exe" /silent
add_launcher "c:\Program Files (x86)\Two Caring Citizens\Adrian's Doom!\adrian.exe"
@@ -0,0 +1,12 @@
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 quartz
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.
# 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 (x86)\Draconis Entertainment\Alien Outback\ao.exe"
@@ -0,0 +1,4 @@
download "https://agarchive.net/games/other/AngelGift.zip"
install_wine_bottle
install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/Angel Gift" "$cache/AngelGift.zip"
add_launcher 'c:\Program Files\Angel Gift\ag.exe'
@@ -0,0 +1,3 @@
check_architecture x86_64
download "https://michaels.world/aq-linux.zip"
unzip -d "${installPath}/AudioQuake" "${cache}/aq-linux.zip"
@@ -0,0 +1,4 @@
download "https://agarchive.net/games/other/audiodisc.zip"
install_wine_bottle
install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/audiodisc.zip"
add_launcher "c:\Program Files\audiodisc\disco.exe"
@@ -0,0 +1,8 @@
# shellcheck shell=bash disable=SC2154 # cache and WINEPREFIX are set by audiogame-manager
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
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"
alert "After you launch the game, press tab then enter and it should begin speaking."
@@ -0,0 +1,4 @@
check_architecture x86_64
get_installer "Audo-linux-x64.zip" "https://shiftbacktick.itch.io/audo"
mkdir -p "${installPath}/Audo"
unzip -d "${installPath}/Audo" "${cache}/Audo-linux-x64.zip"
@@ -0,0 +1,4 @@
check_architecture x86_64
get_installer "Auroboros-linux-x64.zip" "https://shiftbacktick.itch.io/auroboros"
mkdir -p "${installPath}/Auroboros"
unzip -d "${installPath}/Auroboros" "${cache}/Auroboros-linux-x64.zip"
@@ -0,0 +1,5 @@
version=1.3.5
check_architecture x86_64
download "https://files.sooslandia.ru/BallBouncer/${version}/BallBouncer-linux-${version}.zip"
unzip -d "${installPath}/" "${cache}/BallBouncer-linux-${version}.zip"
chmod +x "${installPath}/BallBouncer/BallBouncer"
@@ -0,0 +1,5 @@
download "https://www.agarchive.net/games/gameMadnessInteractive/battle%20zone%2013.5%20setup.exe"
export winVer="win7"
install_wine_bottle
wine "${cache}/battle zone 13.5 setup.exe" /silent
add_launcher "c:\Program Files (x86)\Battle Zone\ss.exe"
@@ -0,0 +1,6 @@
download "http://files.tunmi13.com/projects_archive/bth.zip"
# Uses standard wine path based on architecture (win32/win64)
export winVer="win7"
install_wine_bottle
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"
@@ -0,0 +1,7 @@
get_installer "bf.zip" "https://tunmi13.itch.io/battlefield-2d"
export WINEARCH=win64
export winVer="win8"
# Uses standard wine path based on architecture (win32/win64)
install_wine_bottle
install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/bf.zip"
add_launcher "c:\Program Files\bf\bf.exe"
@@ -0,0 +1,6 @@
#//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"
install_discord_rpc_bridge
add_launcher "c:\Program Files\Blades of Glory\blades_of_glory.exe"
@@ -0,0 +1,4 @@
check_architecture x86_64
get_installer "Bladius-linux-x64.zip" "https://shiftbacktick.itch.io/bladius"
mkdir -p "${installPath}/Bladius"
unzip -d "${installPath}/Bladius" "${cache}/Bladius-linux-x64.zip"
@@ -0,0 +1,9 @@
get_installer "Blind Drive 1.1.112.00i-win64.zip" "https://lofipeople.itch.io/blind-drive"
export WINEARCH=win64
export winVer="win8"
install_wine_bottle
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
add_launcher "c:\Program Files\blind-drive\Blind Drive.exe"
@@ -0,0 +1,5 @@
export WINEARCH="win64" # Migrated to wine64
download "${ipfs[Bloodshed]}"
install_wine_bottle
cp "${cache}/bloodshed.exe" "$WINEPREFIX/drive_c/Program Files/"
add_launcher "c:\Program Files\bloodshed.exe"
@@ -0,0 +1,6 @@
download "http://oriolgomez.com/games/bombercats_en.zip"
# Uses standard wine path based on architecture (win32/win64)
export winVer="win7"
install_wine_bottle
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"
@@ -0,0 +1,5 @@
export WINEARCH=win64
get_installer "bounce_bounce.rar" "https://kavyapriya.itch.io/bounce-bounce"
install_wine_bottle
unrar x "${cache}/bounce_bounce.rar" -op"$WINEPREFIX/drive_c/Program Files"
add_launcher "c:\Program Files\bounce_bounce\bounce.exe"
@@ -0,0 +1,6 @@
get_installer "breu2.zip" "https://breu.itch.io/shadowhunt"
export WINEARCH=win64
export winVer="win8"
install_wine_bottle
install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/breu2.zip"
add_launcher "c:\Program Files\breu2\breu2.exe"
@@ -0,0 +1,5 @@
download "http://files.tunmi13.com/projects_archive/coth.zip"
export winVer="win7"
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"
@@ -0,0 +1,12 @@
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 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"
# 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 (x86)\Draconis Entertainment\Change Reaction\ChangeReactionGui.exe"
@@ -0,0 +1,4 @@
download "https://stormgames.wolfe.casa/downloads/chillingham.zip"
install_wine_bottle vb6run mfc42
install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "$cache/chillingham.zip"
add_launcher "c:\Program Files\chillingham\Chillingham.exe"
@@ -0,0 +1,4 @@
check_architecture x86_64
get_installer "Chimera-linux-x64.zip" "https://shiftbacktick.itch.io/chimera"
mkdir -p "${installPath}/Chimera"
unzip -d "${installPath}/Chimera" "${cache}/Chimera-linux-x64.zip"
@@ -0,0 +1,4 @@
download "${ipfs[Chopper Challenge]}"
install_wine_bottle vb6run dx8vb
install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/chopper challenge.zip"
add_launcher "c:\Program Files\chopper challenge\Chopper.exe"
@@ -0,0 +1,7 @@
export WINEARCH=win64
export winVer="win7"
download "${ipfs[Christmas Chaos]}" "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 -fv "${cache}/Tolk.dll" "{}" \;
add_launcher "c:\Program Files\ChristmasChaos\ChristmasChaos.exe"
@@ -0,0 +1,9 @@
check_architecture x86_64
get_installer "christmas_dash_linux.zip" "https://tunmi13.itch.io/christmas-dash"
unzip -d "${installPath}" "${cache}/christmas_dash_linux.zip"
if [[ -d "${installPath}/Christmas Dash/christmas_dash_linux" ]]; then
rm -rf "${installPath}/christmas_dash_linux"
mv -v "${installPath}/Christmas Dash/christmas_dash_linux" "${installPath}/christmas_dash_linux"
rmdir "${installPath}/Christmas Dash" 2> /dev/null || true
fi
chmod +x "${installPath}/christmas_dash_linux/game.bin"
@@ -0,0 +1,4 @@
download "https://www.agarchive.net/games/draconis/christmas%20whoopass%20setup.exe"
install_wine_bottle vb6run dx8vb
wine "${cache}/christmas whoopass setup.exe" /sp- /silent
add_launcher "c:\Program Files (x86)\Draconis Entertainment\Christmas Whoop Ass\wa.exe"
@@ -0,0 +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
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'
@@ -0,0 +1,7 @@
check_architecture x86_64
installPath="${installPath:-${HOME}/.local/games}"
cache="${cache:-${XDG_CACHE_HOME:-$HOME/.cache}/linux-game-manager}"
download "https://samtupy.com/games/cm.tar.gz"
mkdir -p "${installPath}/Constant Motion"
tar -xzf "${cache}/cm.tar.gz" -C "${installPath}/Constant Motion"
chmod +x "${installPath}/Constant Motion/cm"
@@ -0,0 +1,5 @@
export winVer="win7"
download "http://oriolgomez.com/games/copter_en.zip"
install_wine_bottle
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"
@@ -0,0 +1,7 @@
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
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 -fv "${cache}/Tolk.dll" "{}" \;
add_launcher "c:\Program Files\Crazy-Party-beta82\Crazy Party.exe"
@@ -0,0 +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"
@@ -0,0 +1,6 @@
check_architecture x86_64
get_installer "critter-sanctuary-linux.zip" "https://punishedfelix.itch.io/critter-sanctuary"
mkdir -p "${installPath}/critter-sanctuary"
unzip -d "${installPath}/critter-sanctuary" "${cache}/critter-sanctuary-linux.zip"
mkdir -p "${XDG_DATA_HOME:-${HOME}/.local}/share/godot/app_userdata/OverworldMovementEngine"
cp -v "${installPath}/critter-sanctuary/blind_options.save" "${XDG_DATA_HOME:-${HOME}/.local}/share/godot/app_userdata/OverworldMovementEngine/options.save"
@@ -0,0 +1,9 @@
download "https://www.agarchive.net/games/xl/DangerCityBeta2.exe"
install_wine_bottle vb6run dx8vb
wine "$cache/DangerCityBeta2.exe" /silent &
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
wineserver -w
add_launcher 'c:\Program Files\Danger City\dc.exe'
@@ -0,0 +1,5 @@
export winVer="win7"
download "http://oriolgomez.com/games/road_en.zip"
install_wine_bottle
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"
@@ -0,0 +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
wine "${cache}/death match project alpha setup.exe" /silent
add_launcher "c:\Program Files (x86)\reality software\death match project alpha\dm1.exe"
@@ -0,0 +1,9 @@
export WINEARCH="win64" # Migrated to wine64 with WINETRICKS_FORCE=1
export winVer="win7"
export winetricksSettings="vd=1024x768"
download "https://www.kaldobsky.com/audiogames/dogwhohatestoast.zip"
install_wine_bottle sapi 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"
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
@@ -0,0 +1,22 @@
export winVer="win10"
export WINEARCH="win64" # Migrated to wine64
# WINEPREFIX will be set automatically by install_wine_bottle to ~/.local/wine64
download https://scwl-1251129685.cos.ap-shanghai.myqcloud.com/dreamland/Win/DreamLandSetup.exe
install_wine_bottle
winetricks -q vcrun2019 d3dcompiler_47
# Run installer silently (shows a dialog but completes successfully)
# Using C:\DreamLand instead of Program Files to avoid potential permission issues
{
echo "# Installing Dreamland..."
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)..."
# Kill any game processes that may have auto-launched
wineserver -k 2>/dev/null || true
add_launcher "c:\DreamLand\DreamLand.exe"
@@ -0,0 +1,4 @@
download "http://files.l-works.net/dhsetup.exe"
install_wine_bottle vb6run dx8vb
wine "${cache}/dhsetup.exe" /silent
add_launcher "c:\Program Files (x86)\Lworks\Duck Hunt\duckhunt.exe"
@@ -0,0 +1,12 @@
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 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"
# 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 (x86)\Draconis Entertainment\DynaMan\dm.exe"
@@ -0,0 +1,4 @@
check_architecture x86_64
get_installer "EXO-linux-x64.zip" "https://shiftbacktick.itch.io/exo"
mkdir -p "${installPath}/E.X.O."
unzip -d "${installPath}/E.X.O." "${cache}/EXO-linux-x64.zip"
@@ -0,0 +1,12 @@
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 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"
# 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 (x86)\Draconis Entertainment\ESP Pinball Classic\pbc.exe"
@@ -0,0 +1,12 @@
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 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"
# 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 (x86)\Draconis Entertainment\ESP Pinball Xtreme\pbx.exe"
@@ -0,0 +1,13 @@
export winVer="win7"
# Uses standard wine path based on architecture (win32/win64)
download "http://download.dracoent.com/Windows/classic/PP1Setup.exe"
install_wine_bottle vb6run dx8vb quartz
# Only works in conjunction with esp pinball extreme.
if ! [ -f "$WINEPREFIX/drive_c/Program Files (x86)/Draconis Entertainment/ESP Pinball Xtreme/pbx.exe" ] ; then
echo "Error: You need to install ESP Pinball Extreme first to use this game. Please do so before continuing." >&2
exit 1
fi
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 (x86)\Draconis Entertainment\ESP Pinball Xtreme\pbx.exe"
@@ -0,0 +1,4 @@
download "https://agarchive.net/games/mt/easter%20quest%20setup.exe"
install_wine_bottle
wine "${cache}/easter quest setup.exe" /silent
add_launcher "c:\Program Files (x86)\MTGames\Easter Quest\easter.exe"
@@ -0,0 +1,5 @@
check_architecture x86_64
get_installer "Echo Command.tar.xz" "https://pancakedev.itch.io/echo-command"
mkdir -p "${installPath}/Echo-Command"
tar xf "${cache}/Echo Command.tar.xz" -C "${installPath}/Echo-Command"
ln -sr "${installPath}/Echo-Command/Echo Command.x86_64" "${installPath}/Echo-Command/Echo_Command.x86_64"
@@ -0,0 +1,4 @@
download "http://www.masonasons.me/softs/EndlessRunner.7z"
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"
@@ -0,0 +1,14 @@
# shellcheck shell=bash disable=SC2154 # cache, WINEPREFIX, and game are set by audiogame-manager
gameVersion=2.4.1
download "https://dl.tweesecake.app/rage/rage${gameVersion}.zip"
export WINEARCH=win64
export winVer="win10"
install_wine_bottle
install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/rage${gameVersion}.zip"
add_launcher "c:\Program Files\rage\rage.exe"
url="https://techcake.games/games/executioners-rage/"
message="Before you can login, you need to create an account at:\n${url}"
if echo "$url" | xclip -selection clipboard 2> /dev/null ; then
message+="\n\nThe URL has been copied to the clipboard."
fi
alert "Executioner's Rage" "Executioner's Rage" "$message"
@@ -0,0 +1,4 @@
download "https://agarchive.net/games/other/extant.zip"
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"
@@ -0,0 +1,4 @@
download "http://www.agarchive.net/games/bsc/FingerPanicSetup.exe"
install_wine_bottle dx8vb vb6run
wine "${cache}/FingerPanicSetup.exe" /sp- /silent
add_launcher "c:\Program Files (x86)\Finger Panic 1.0\FingerPanic.exe"
@@ -0,0 +1,45 @@
tobyVersion="9.0"
mkdir -p "${installPath}/doom"
doomPath="$(find /usr/share -type d -name "doom" 2> /dev/null)"
if [[ ${#doomPath} -lt 5 ]]; then
ui_yesno "Linux Game Manager" "Linux Game Manager" "Do you want Linux Game Manager to install freedoom and gzdoom for you? If you want to do this manually, select no." || exit 0
if command -v yay &> /dev/null ; then
yay -Sy --noconfirm --sudoloop freedoom gzdoom freedm blasphemer-wad
elif command -v slapt-src &> /dev/null ; then
su -c 'slapt-src -i freedoom gzdoom'
elif command -v dnf &> /dev/null ; then
sudo dnf copr -y enable nalika/gzdoom
sudo dnf -q -y install freedoom
sudo dnf -q -y install gzdoom
else
ui_msgbox "Linux Game Manager" "Linux Game Manager" "No supported package managers found. Please install the freedoom and gzdoom packages manually."
exit 0
fi
fi
doomPath="$(find /usr/share -type d -name "doom" 2> /dev/null | head -1)"
# The url breaks the normal download function
download_named "keyshare-universal.pk3" "https://forum.zdoom.org/download/file.php?id=42262"
download "${ipfsGateway}/ipfs/QmU6REFot8CGVSBy2YWQxnmXoh7M4EF74RxFtLzvtJxoGC?filename=toby_doom_${tobyVersion}_full.zip"
unzip -n -d "${installPath}/doom" "${cache}/toby_doom_${tobyVersion}_full.zip"
# Move contents from nested folder up one directory (including hidden files)
shopt -s dotglob
mv "${installPath}/doom/TobyAccessibilityMod_Version9"*/* "${installPath}/doom/"
shopt -u dotglob
# Remove the now-empty nested folder
rmdir "${installPath}/doom/TobyAccessibilityMod_Version9"*
#unzip -n -d "${installPath}/doom" "${cache}/OpMDK_ForV${tobyVersion}.zip"
cp -v "${cache}/keyshare-universal.pk3" "${installPath}/doom"
rm -fv "${installPath}/doom/"*.{bat,exe,dll,ps1}
rm -rfv "${installPath}/doom/_internal"
#if [[ -e /usr/share/doom/blasphem.wad ]]; then
#ln -s /usr/share/doom/blasphem.wad "${installPath}/doom/"
#fi
mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/gzdoom"
cp "${installPath}/doom/TobyConfig.ini" "${XDG_CONFIG_HOME:-$HOME/.config}/gzdoom/gzdoom.ini"
cp "${installPath}/doom/zcajun/bots.cfg" "${XDG_CONFIG_HOME:-$HOME/.config}/gzdoom/"
sed -i "s;^\[IWADSearch.Directories\]$;[IWADSearch.Directories]\nPath=${doomPath}\nPath=${installPath}/doom;" "${XDG_CONFIG_HOME:-$HOME/.config}/gzdoom/gzdoom.ini"
sed -i "s;^\[FileSearch.Directories\]$;[FileSearch.Directories]\nPath=${doomPath}\nPath=${installPath}/doom;" "${XDG_CONFIG_HOME:-$HOME/.config}/gzdoom/gzdoom.ini"
sed -i "s;^\[SoundfontSearch.Directories\]$;[SoundfontSearch.Directories]\nPath=${doomPath}/fm_banks\nPath=${doomPath}/soundfonts\nPath=${installPath}/doom/soundfonts\nPath=${installPath}/doom/fm_banks;" "${XDG_CONFIG_HOME:-$HOME/.config}/gzdoom/gzdoom.ini"
# sed -i 's/Mouse1=+attack/CTRL=+attack/' "${XDG_CONFIG_HOME:-$HOME/.config}/gzdoom/gzdoom.ini"
launcherPath="$(readlink -f "$0")"
launcherPath="${launcherPath%/*}"
@@ -0,0 +1,5 @@
export winVer="win7"
download "http://oriolgomez.com/games/bird_en.zip"
install_wine_bottle
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"
@@ -0,0 +1,20 @@
download "http://www.gmagames.com/gtc120.exe"
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
xdotool key --clearmodifiers Tab 2> /dev/null
xdotool sleep 10 type --clearmodifiers --delay 100 "${HOSTNAME^}" 2> /dev/null
xdotool key --clearmodifiers Tab 2> /dev/null
xdotool sleep 10 type --clearmodifiers --delay 100 "na@na.na" 2> /dev/null
xdotool key --clearmodifiers Tab 2> /dev/null
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
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:"
echo -e "\"Firstname Lastname\"\n\"Email address\"\n\"Country code\""
add_launcher "c:\Program Files (x86)\GMA Tank Commander\gtc.exe"
@@ -0,0 +1,7 @@
# shellcheck shell=bash disable=SC2154 # cache and WINEPREFIX are set by audiogame-manager
get_installer "Galactic Strike 1.2.zip" "https://fusion-forged-games.itch.io/galactic-strike"
export winVer="win10"
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"
alert "Use controls wasd to movi and navigate the menu.\nUse m to fire and select items from the menu."
@@ -0,0 +1,5 @@
export winVer="win7"
download "http://oriolgomez.com/games/hammer_en.zip"
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"
@@ -0,0 +1,7 @@
get_installer "hp.zip" "https://tunmi13.itch.io/haunted-party"
export WINEARCH=win64
export winVer="win8"
# Uses standard wine path based on architecture (win32/win64)
install_wine_bottle
install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files/" "${cache}/hp.zip"
add_launcher "c:\Program Files\hp\hp.exe"
@@ -0,0 +1,40 @@
download "http://www.agarchive.net/games/bsc/HunterSetup.exe" "https://www.agarchive.net/games/bsc/BSC%20unlock%20code%20generator.7z"
install_wine_bottle vb6run dx8vb
# FIXME: Hacky, but it works. Install dotnet35 by itself so it actually doesn't hang.
winetricks -q dotnet35sp1
wineserver -k # Damn you, dotnet.
wine "${cache}/HunterSetup.exe" /silent &
xdotool sleep 10 key --clearmodifiers alt+y 2> /dev/null
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"
unix2dos "$WINEPREFIX/drive_c/Program Files/Hunter/config.dat"
if command -v xclip &> /dev/null && command -v xdotool &> /dev/null ; then
wine "c:\Program Files\Hunter\HunterRegistration.exe" &
xdotool sleep 10 key Return sleep 2 key Return sleep 2 key Alt+n
sleep 1
regcode="$(xclip -selection clipboard -o)"
xdotool sleep 1 key Shift+Tab sleep 1 key Return
# FIXME: Kind of hacky, but let's make sure it actually exitted.
sleep 5
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
xdotool sleep 1 key Tab sleep 1 key Return
sleep 2
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
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
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
add_launcher "c:\Program Files (x86)\Hunter\HunterRun.exe"
@@ -0,0 +1,9 @@
get_installer "Inquisitor_windows_ENG.zip" "https://www.audiogame.store/en/products/inquisitors-heartbeat--windows/ios-only"
export WINEARCH=win64
export winVer="win8"
install_wine_bottle
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
add_launcher "c:\Program Files\Inquisitor_windows_ENG\Inquisitor's Heartbeat.exe"
@@ -0,0 +1,5 @@
export winVer="win7"
download "http://oriolgomez.com/games/insect_en.zip"
install_wine_bottle
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"
@@ -0,0 +1,4 @@
download "http://www.valiantgalaxy.com/interceptor/Interceptor0.0.2.0Installer.exe"
install_wine_bottle
wine "${cache}/Interceptor0.0.2.0Installer.exe" /silent
add_launcher "c:\Program Files (x86)\VGA\interceptor\launch_interceptor.exe"
@@ -0,0 +1,13 @@
# shellcheck shell=bash disable=SC2154 # cache is set by audiogame-manager
download "https://www.l-works.net/files/judgmentdayfullsetup.exe"
install_wine_bottle vb6run dx8vb quartz
wine "${cache}/judgmentdayfullsetup.exe" /silent
cat << EOF > /tmp/judgementday.reg
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\judgmentday\config]
"name"="$USER"
EOF
wine regedit /s /tmp/judgementday.reg
rm /tmp/judgementday.reg
add_launcher "c:\Program Files (x86)\Lworks\Judgment Day\judgmentday.exe"
@@ -0,0 +1,8 @@
export WINEARCH="win64" # Migrated to wine64 with WINETRICKS_FORCE=1
export winVer="win7"
export winetricksSettings="vd=1024x768"
download "${ipfs[Kitchensinc Games]}"
install_wine_bottle sapi 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"
@@ -0,0 +1,4 @@
download "https://www.agarchive.net/games/blastbay/kringle%20crash%20setup.exe"
install_wine_bottle
wine "${cache}/kringle crash setup.exe" /silent
add_launcher "c:\Program Files (x86)\Kringle Crash\kringlecrash.exe"
@@ -0,0 +1,6 @@
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 -fv "$cache/laser-breakout-options.dat" "$WINEPREFIX/drive_c/nyanchangame/laser breakout/options.dat"
add_launcher "c:\nyanchangame\laser breakout\play.exe"
@@ -0,0 +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"
@@ -0,0 +1,8 @@
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
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"
@@ -0,0 +1,4 @@
download "http://files.l-works.net/lockpicksetup.exe"
install_wine_bottle vb6run dx8vb
wine "${cache}/lockpicksetup.exe" /silent
add_launcher "c:\Program Files (x86)\lWorks\Lockpick\lockpick.exe"
@@ -0,0 +1,15 @@
download "http://www.gmagames.com/lw350.exe"
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
xdotool key --clearmodifiers Tab 2> /dev/null
xdotool type --clearmodifiers --delay 100 "$HOSTNAME" 2> /dev/null
xdotool key --clearmodifiers Tab 2> /dev/null
xdotool type --clearmodifiers --delay 100 "na@na.na" 2> /dev/null
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
wineserver -w
add_launcher "c:\Program Files (x86)\Lone Wolf\lw.exe"
@@ -0,0 +1,4 @@
download "https://agarchive.net/games/danZ/lost.zip"
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'
@@ -0,0 +1,15 @@
download "http://www.danielzingaro.com/maze_craze_setup.exe"
install_wine_bottle vb6run dx8vb
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
xdotool key --delay 250 space 2> /dev/null
xdotool key --delay 250 alt+n 2> /dev/null
xdotool key --delay 250 alt+n 2> /dev/null
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
wineserver -k
add_launcher "c:\Program Files\Maze Craze 1.4\mazecraze.exe"
@@ -0,0 +1,12 @@
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 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"
# 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 (x86)\Draconis Entertainment\Monkey Business\mb.exe"
@@ -0,0 +1,2 @@
check_dependencies python-pygame:pygame python-xdg:xdg python-pyperclip:pyperclip python-requests:requests python-setproctitle:setproctitle
git -C "${installPath}" clone --recurse-submodules https://gitlab.com/stormdragon2976/monkeyspank.git
@@ -0,0 +1,2 @@
check_dependencies python-pygame:pygame python-xdg:xdg python-pyperclip:pyperclip python-requests:requests python-setproctitle:setproctitle
git -C "${installPath}" clone --recurse-submodules https://gitlab.com/stormdragon2976/numnastics.git
@@ -0,0 +1,7 @@
export WINEARCH="win64" # Migrated to wine64 with WINETRICKS_FORCE=1
export winVer="win7"
export norh="true" # Requires sapi even though uses nvda
download "${ipfs[Oh Shit]}"
install_wine_bottle sapi
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"
@@ -0,0 +1,5 @@
check_architecture x86_64
get_installer "onslaught.AppImage" "https://lightsoutgames.itch.io/onslaught"
mkdir -p "${installPath}/Onslaught"
cp -v "${cache}/onslaught.AppImage" "${installPath}/Onslaught/onslaught.AppImage"
chmod +x "${installPath}/Onslaught/onslaught.AppImage"
@@ -0,0 +1,5 @@
export winVer="win7"
download "https://www.iamtalon.me/games/blacksquare.zip"
install_wine_bottle
install_with_progress unzip "Extracting game files..." -d "$WINEPREFIX/drive_c/Program Files" "${cache}/blacksquare.zip"
add_launcher "c:\Program Files\blacksquare\OperationBlackSquare.exe"
@@ -0,0 +1,4 @@
download "http://www.gmagames.com/pmt101.exe"
install_wine_bottle
wine "${cache}/pmt101.exe" /sp- /silent
add_launcher "c:\Program Files (x86)\Pacman Talks\pmt.exe"
@@ -0,0 +1,4 @@
download "https://www.agarchive.net/games/blastbay/palace%20punch-up%20setup.exe"
install_wine_bottle
wine "${cache}/palace punch-up setup.exe" /silent
add_launcher "c:\Program Files (x86)\Palace Punch-up\palace.exe"
@@ -0,0 +1,7 @@
export winVer="win7"
export winetricksSettings="vd=1024x768"
download "https://www.kaldobsky.com/audiogames/pawprints.zip"
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"

Some files were not shown because too many files have changed in this diff Show More