Compare commits

..

30 Commits

Author SHA1 Message Date
Storm Dragon
df6470e22f Properly use new line characters so new lines show up instead of \n 2025-08-06 15:10:40 -04:00
Storm Dragon
90fd40fb4a Switch to text-info for informational dialogs in yad. 2025-08-06 15:04:41 -04:00
Storm Dragon
94d9caa707 Confirmation messages added when a task has been completed, e.g. install, upgrade, remove. 2025-08-06 14:37:27 -04:00
Storm Dragon
17e7cac021 Improved accessibility of some yad dialogues. 2025-08-06 14:32:41 -04:00
Storm Dragon
59d3d288da More work on the new dialogue system. Game installers updated. 2025-08-06 14:28:56 -04:00
Storm Dragon
93f92b3c7b Stop error when exiting menus without making a selection. 2025-08-06 14:11:23 -04:00
Storm Dragon
7548db668a More improvements to ui dialogs. 2025-08-06 13:59:12 -04:00
Storm Dragon
502caea79c Add yad as a dependency to run LGM. 2025-08-06 13:44:40 -04:00
Storm Dragon
37a731bab6 Experimental: use yad for graphical menus that should work better with orca and Cthulhu screen readers. 2025-08-04 18:02:58 -04:00
Storm Dragon
6fcfdeca09 Updated ipfs hash for TobyAccessibilityMod_V8-0.zip. 2025-05-25 14:58:52 -04:00
Storm Dragon
6a4d73ba1e Version bump for BallBouncer, 1.3.5 2025-05-19 22:58:34 -04:00
Storm Dragon
15a348f6d0 Added game Wheels of Prio. 2025-05-19 15:23:28 -04:00
Storm Dragon
fb65c927b2 Updated Ball Bouncer installer to 1.3.4. 2025-03-15 23:55:50 -04:00
Storm Dragon
0e9b8df949 Updated Ball Bouncer installer to latest version 1.3.3 2025-03-12 19:35:53 -04:00
Storm Dragon
f61ec51c5e Moved steam dependency check to steam specific install section. 2025-03-12 13:21:45 -04:00
247f0079c4 Fixed all the other mud installers as well 2025-03-11 13:10:12 -07:00
c164895e22 Fix alter aeon installer 2025-03-11 13:02:44 -07:00
700a0274e8 Update version of ball bouncer 2025-03-11 12:47:20 -07:00
Storm Dragon
61d9c0f177 Updated Ball Bouncer download link. 2025-03-06 16:18:41 -05:00
Storm Dragon
6e3188d86a Game Echo Commander added. This is not the same as the existing game Echo Command. 2025-02-18 21:58:58 -05:00
Storm Dragon
e00c16a5cc Updated README.md merged the Doom Launcher changes. 2025-01-14 00:43:25 -05:00
Storm Dragon
91d1e29092 Removed old Yadoom script. It's functionality is in the launcher. 2025-01-13 13:05:08 -05:00
Storm Dragon
02b8a3e5a2 Removed the old TobyCustom that was shell script based. 2025-01-13 13:04:01 -05:00
Storm Dragon
4509448c61 Migrate to the new Toby Doom Launcher. 2025-01-13 13:02:52 -05:00
Storm Dragon
771fe5d956 Updated Tornado Chicken. 2025-01-08 12:51:42 -05:00
Storm Dragon
4a0e6c83b8 Updated MUD launchers. Added Legends of Kallisti. 2024-12-31 11:33:08 -05:00
Storm Dragon
69631769f8 Updated terminal emulator function. Fixed End of Time Launcher. 2024-12-31 00:08:18 -05:00
Storm Dragon
06c3d87db0 Updated GMOTA launcher. 2024-12-29 22:17:31 -05:00
Storm Dragon
c556aa73ee Merge branch 'master' of git.stormux.org:storm/linux-game-manager 2024-12-29 21:26:32 -05:00
Storm Dragon
6a0fa006d9 Updated WolfenDoom launcher. 2024-12-29 21:26:15 -05:00
36 changed files with 468 additions and 1170 deletions

View File

@@ -1,3 +1,3 @@
check_dependencies git sox tt++
git -C "${installPath}/" clone --recurse-submodules https://github.com/lilmike/tintin-alteraeon.git | \
dialog --progressbox "Installing \"${game}\", please wait..." -1 -1
ui_progressbox "Game Installer" "Installing \"${game}\", please wait..."

View File

@@ -1,4 +1,5 @@
version=1.3.5
check_architecture x86_64
download "https://files.sooslandia.ru/BallBouncer/1.2.1/BallBouncer-linux-1.2.1.zip"
unzip -d "${installPath}/" "${cache}/BallBouncer-linux-1.2.1.zip"
download "https://files.sooslandia.ru/BallBouncer/${version}/BallBouncer-linux-${version}.zip"
unzip -d "${installPath}/" "${cache}/BallBouncer-linux-${version}.zip"
chmod +x "${installPath}/BallBouncer/BallBouncer"

View File

@@ -1,3 +1,3 @@
check_dependencies git sox tt++
git -C "${installPath}/" clone --recurse-submodules https://github.com/lilmike/tintin-empiremud.git | \
dialog --progressbox "Installing \"${game}\", please wait..." -1 -1
ui_progressbox "Game Installer" "Installing \"${game}\", please wait..."

View File

@@ -1,3 +1,3 @@
check_dependencies git opusdec sox tt++
git -C "${installPath}/" clone https://git.2mb.codes/~stormdragon2976/tintin-endoftime | \
dialog --progressbox "Installing \"${game}\", please wait..." -1 -1
ui_progressbox "Game Installer" "Installing \"${game}\", please wait..."

View File

@@ -2,8 +2,7 @@ tobyVersion="8-0"
mkdir -p "${installPath}/doom"
doomPath="$(find /usr/share -type d -name "doom" 2> /dev/null)"
if [[ ${#doomPath} -lt 5 ]]; then
dialog --backtitle "Linux Game Manager" \
--yesno "Do you want Linux Game Manager to install freedoom and gzdoom for you? If you want to do this manually, select no." -1 -1 --stdout || exit 0
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
@@ -13,31 +12,26 @@ if [[ ${#doomPath} -lt 5 ]]; then
sudo dnf -q -y install freedoom
sudo dnf -q -y install gzdoom
else
dialog --backtitle "Linux Game Manager" --msgbox "No supported package managers found. Please install the freedoom and gzdoom packages manually." -1 -1
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)"
if ! [[ -e "${installPath}/doom/DoomMetalVol6.wad" ]] && ! [[ -e "${installPath}/doom/DoomMetalVol7.wad" ]]; then
alert
dialog --backtitle "Linux Game manager" \
--extra-button \
--yes-label "6" \
--no-label "7" \
--extra-label "None" \
--yesno "Would you like Doom Metal Volume 6 or 7? Use arrow keys to select your answer." \
-1 -1 --stdout
buttonCode=$?
if [[ $buttonCode -eq 0 ]]; then
download "${ipfsGateway}/ipfs/QmSzWKtP3wPvzn5GNd9F7n4RAhkFHxh2UHxXGefiAufwQW?filename=DoomMetalVol6.wad"
fi
if [[ $buttonCode -eq 1 ]]; then
download "${ipfsGateway}/ipfs/QmfXkz3tzicKGfhcYSiWUZkjkDKP2aVp53Y49n127wMr7D?filename=DoomMetalVol7.wad"
fi
alert
choice=$(ui_menu "Doom Metal Selection" "Doom Metal Selection" "Would you like Doom Metal Volume 6 or 7?" "6" "Doom Metal Volume 6" "7" "Doom Metal Volume 7" "none" "None")
case "$choice" in
"6")
download "${ipfsGateway}/ipfs/QmSzWKtP3wPvzn5GNd9F7n4RAhkFHxh2UHxXGefiAufwQW?filename=DoomMetalVol6.wad"
;;
"7")
download "${ipfsGateway}/ipfs/QmfXkz3tzicKGfhcYSiWUZkjkDKP2aVp53Y49n127wMr7D?filename=DoomMetalVol7.wad"
;;
esac
fi
# The url breaks the normal download function
download_named "keyshare-universal.pk3" "https://forum.zdoom.org/download/file.php?id=42262"
download "${ipfsGateway}/ipfs/QmT6FEqeGTkf3Uv1dYqQ4LGYeRSjLk1R1FeyaFJwRFBocF?filename=TobyAccessibilityMod_V${tobyVersion}.zip"
download "${ipfsGateway}/ipfs/QmRSyAGQPaRtWwH9aT87Q8rKini9GYXac92B9EkBZJtbJ1?filename=TobyAccessibilityMod_V${tobyVersion}.zip"
[[ -e "${cache}/DoomMetalVol6.wad" ]] && mv "${cache}/DoomMetalVol6.wad" "${installPath}/doom"
[[ -e "${cache}/DoomMetalVol7.wad" ]] && mv "${cache}/DoomMetalVol7.wad" "${installPath}/doom"
unzip -n -d "${installPath}/doom" "${cache}/TobyAccessibilityMod_V${tobyVersion}.zip"

View File

@@ -0,0 +1,3 @@
check_dependencies git sox tt++
git -C "${installPath}/" clone --recurse-submodules https://github.com:hjozwiak/tintin-kallisti-pack | \
ui_progressbox "Game Installer" "Installing \"${game}\", please wait..."

View File

@@ -1,24 +1,21 @@
check_architecture x86_64
check_dependencies steamcmd
alert
dialog --backtitle "Linux Game manager" \
--msgbox \
"Please note this requires the game to be available either in your Steam library\nor as the installer purchased from gog.com.\nIf using the gog.com installer, please use the default path when prompted." -1 -1 --stdout
dialog --backtitle "Linux Game Manager" \
--yes-label "GOG" \
--no-label "Steam" \
--yesno "Select installation method" -1 -1 --stdout
installationMethod=$?
ui_msgbox "Game Installer" "Game Installer" "Please note this requires the game to be available either in your Steam library or as the installer purchased from gog.com.\n\nIf using the gog.com installer, please use the default path when prompted."
installMethod=$(ui_menu "Installation Method" "Installation Method" "Select installation method" "gog" "GOG" "steam" "Steam")
if [[ "$installMethod" == "steam" ]]; then
installationMethod=1
else
installationMethod=0
fi
appId="646570"
gogFileName="slay_the_spire_2020_12_15_8735c9fe3cc2280b76aa3ec47c953352a7df1f65_43444.sh"
if [[ $installMethod -eq 1 ]]; then
# Steam Installation
echo "Please enter Steam user name:"
read -er steamUser
check_dependencies steamcmd
steamUser=$(ui_inputbox "Game Installer" "Game Installer" "Please enter Steam user name:" "")
steamcmd +@sSteamCmdForcePlatformType linux +force_install_dir "${HOME}/.local/games/SlayTheSpire" +login "$steamUser" +app_update "$appId" +quit
if [[ $? -ne 0 ]]; then
dialog --backtitle "Linux Game Manager" \
--msgbox "Error installing game through Steam." -1 -1 --stdout
ui_msgbox "Game Installer" "Game Installer" "Error installing game through Steam."
exit 1
fi
else
@@ -28,20 +25,17 @@ else
DISPLAY="" find ~/Desktop -maxdepth 1 -type f -name "$gogFileName" -exec bash "{}" \;
if [[ $? -eq 0 ]]; then
ln -sf "${HOME}/GOG Games/Slay the Spire/game" "${installPath}/SlayTheSpire" ||
{ dialog --backtitle "Linux Game Manager" \
--msgbox "Error creating link to game directory." -1 -1 --stdout
{ ui_msgbox "Game Installer" "Game Installer" "Error creating link to game directory."
exit 1; }
else
dialog --backtitle "Linux Game Manager" \
--msgbox "Error installing game from GOG installer." -1 -1 --stdout
ui_msgbox "Game Installer" "Game Installer" "Error installing game from GOG installer."
exit 1
fi
fi
# Move files into place
mkdir -p "${HOME}/.config/ModTheSpire"
if [[ -f ~"/.config/ModTheSpire/mod_lists.json" ]]; then
dialog --backtitle "Linux Game manager" \
--yesno "Existing mod_lists.json file found. Would you like to replace it?" -1 -1 --stdout &&
ui_yesno "Game Installer" "Game Installer" "Existing mod_lists.json file found. Would you like to replace it?" &&
cp -v .files/SlayTheSpire/mod_lists.json "${HOME}/.config/ModTheSpire/mod_lists.json"
else
cp -v .files/SlayTheSpire/mod_lists.json "${HOME}/.config/ModTheSpire/mod_lists.json"
@@ -62,8 +56,7 @@ for modId in ${modsMap[@]} ; do
done
steamcmd +@sSteamCmdForcePlatformType linux +force_install_dir "${HOME}/.local/games/SlayTheSpire/" +login anonymous $installString +quit
if [[ $? -ne 0 ]]; then
dialog --backtitle "Linux Game Manager" \
--msgbox "Error installing required mods. Some accessibility features may not be available." -1 -1 --stdout
ui_msgbox "Game Installer" "Game Installer" "Error installing required mods. Some accessibility features may not be available."
exit 1
fi
mkdir -p "$HOME/.local/games/SlayTheSpire/mods"
@@ -74,8 +67,7 @@ for modName in "${!modsMap[@]}" ; do
ln -sr "$HOME/.local/games/SlayTheSpire/steamapps/workshop/content/$appId/${modsMap[$modName]}"/* "$HOME/.local/games/SlayTheSpire/mods/"
fi
if [[ $? -ne 0 ]] && [[ "$modName" == "say the spire" ]]; then
dialog --backtitle "Linux Game Manager" \
--msgbox "Error installing SayTheSpire mod. Screen reader support will not be available." -1 -1 --stdout
ui_msgbox "Game Installer" "Game Installer" "Error installing SayTheSpire mod. Screen reader support will not be available."
exit 1
fi
done

View File

@@ -1,3 +1,3 @@
check_dependencies python-ansimarkup:ansimarkup
git -C "${installPath}/" clone https://github.com/Difio3333/slaythetext.git | \
dialog --progressbox "Installing \"${game}\", please wait..." -1 -1
ui_progressbox "Game Installer" "Installing \"${game}\", please wait..."

View File

@@ -1,18 +1,17 @@
check_architecture x86_64
DISPLAY=""
echo "Please select the default path when prompted by the installer."
alert
ui_msgbox "Game Installer" "Game Installer" "Please select the default path when prompted by the installer."
get_installer "stardew_valley_1_5_6_1988831614_53040.sh" "https://www.gog.com/game/stardew_valley"
bash "${cache}/stardew_valley_1_5_6_1988831614_53040.sh" ||
{ echo "Error installing game."
{ ui_msgbox "Game Installer" "Game Installer" "Error installing game."
exit 1; }
smapiVersion="3.18.4"
download "https://github.com/Pathoschild/SMAPI/releases/download/${smapiVersion}/SMAPI-${smapiVersion}-installer.zip" "https://stormgames.wolfe.casa/downloads/stardew-valley/Mods.tar.xz"
smapiTmp="$(mktemp -d)"
unzip "${cache}/SMAPI-${smapiVersion}-installer.zip" -d "$smapiTmp"
echo "Preparing to install mods. Please select the same path as before when prompted."
echo "When it says SMAPI has been installed, press enter to finish installation."
alert
ui_msgbox "Game Installer" "Game Installer" "Preparing to install mods. Please select the same path as before when prompted.\n\nWhen it says SMAPI has been installed, press enter to finish installation."
bash "${smapiTmp}/SMAPI ${smapiVersion} installer/install on Linux.sh"
ln -sf "${HOME}/GOG Games/Stardew Valley/game" "${installPath}/StardewValley"
tar -xvf "${cache}/Mods.tar.xz" -C "${installPath}/StardewValley/"

View File

@@ -1,3 +1,3 @@
check_dependencies git sox tt++
git -C "${installPath}/" clone --recurse-submodules https://github.com/stormdragon2976/tintin-stickmud.git | \
dialog --progressbox "Installing \"${game}\", please wait..." -1 -1
ui_progressbox "Game Installer" "Installing \"${game}\", please wait..."

View File

@@ -1,8 +1,6 @@
check_architecture x86_64
get_installer "Ttc v3.0 linux.zip" "https://renzivan.itch.io/the-tornado-chicken"
unzip -d "${installPath}/The Tornado Chicken" "${cache}/Ttc v3.0 linux.zip"
get_installer "Ttc v3.2 linux.zip" "https://renzivan.itch.io/the-tornado-chicken"
unzip -d "${installPath}/The Tornado Chicken" "${cache}/Ttc v3.2 linux.zip"
chmod +x "${installPath}/The Tornado Chicken/Ttc"
echo "Note: When the game first starts it will be playing very loud music with the built in suboptimal voice."
echo "You are recommended to press page down several times to turn down the music, then go to settings and enable speech with screen reader, using speech dispatcher."
echo "You may then press page up to set the music to your liking."
alert
ui_msgbox "Game Installer" "Game Installer" "Note: When the game first starts it will be playing very loud music with the built in suboptimal voice.\n\nYou are recommended to press page down several times to turn down the music, then go to settings and enable speech with screen reader, using speech dispatcher.\n\nYou may then press page up to set the music to your liking."

View File

@@ -3,5 +3,5 @@ check_dependencies dmidecode
get_installer "upheaval-linux.zip" "https://leonegaming.itch.io/upheaval"
mkdir -p "${installPath}/Upheaval_Gui"
unzip -d "${installPath}/Upheaval_Gui" "${cache}/upheaval-linux.zip"
echo "To enable accessibility, press shift t when the game starts."
alert
ui_msgbox "Game Installer" "Game Installer" "To enable accessibility, press shift t when the game starts."

View File

@@ -0,0 +1,6 @@
check_architecture x86_64
get_installer "Wp v3.0 linux.zip" "https://psyra-productions.itch.io/wheels-of-prio"
unzip -d "${installPath}/Wheels of Prio" "${cache}/Wp v3.0 linux.zip"
chmod +x "${installPath}/Wheels of Prio/Wp"
alert
ui_msgbox "Game Installer" "Game Installer" "Note: When the game first starts it will be playing very loud music with the built in suboptimal voice.\n\nYou are recommended to press page down several times to turn down the music, then go to settings and enable speech with screen reader, using speech dispatcher.\n\nYou may then press page up to set the music to your liking."

View File

@@ -4,7 +4,7 @@ if [[ "${architecture}" == "aarch64" ]]; then
elif [[ "${architecture}" == "x86_64" ]]; then
pkgname="Zombowl-Linux-X86_64.zip"
else
echo "Architecture ${architecture} is not supported."
ui_msgbox "Game Installer" "Game Installer" "Architecture ${architecture} is not supported."
exit 1
fi
get_installer "${pkgname}" "https://stormdragon2976.itch.io/zombowl"

View File

@@ -3,7 +3,7 @@ pushd "${mudPath%/*}"
git pull | \
dialog --progressbox "Checking for updates, please wait..." -1 -1
if [[ -n "${COLORTERM}" ]]; then
terminal_emulator tt++ ${mudPath##*/}
terminal_emulator "${mudPath%/*}" "tt++" "${mudPath##*/}"
else
tt++ ${mudPath##*/}
tt++ ${mudPath##*/}
fi

View File

@@ -0,0 +1 @@
open_url "https://echo-commander.vercel.app/"

View File

@@ -3,7 +3,7 @@ pushd "${mudPath%/*}"
git pull | \
dialog --progressbox "Checking for updates, please wait..." -1 -1
if [[ -n "${COLORTERM}" ]]; then
terminal_emulator tt++ ${mudPath##*/}
terminal_emulator "${mudPath%/*}" "tt++" "${mudPath##*/}"
else
tt++ ${mudPath##*/}
tt++ ${mudPath##*/}
fi

View File

@@ -3,7 +3,7 @@ pushd "${mudPath%/*}"
git pull | \
dialog --progressbox "Checking for updates, please wait..." -1 -1
if [[ -n "${COLORTERM}" ]]; then
terminal_emulator tt++ ${mudPath##*/}
terminal_emulator "${mudPath%/*}" "tt++" "${mudPath##*/}"
else
tt++ ${mudPath##*/}
tt++ "${mudPath##*/}"
fi

View File

@@ -1,417 +1,11 @@
#!/usr/bin/env bash
launch_game() {
pushd "${gamePath}"
#echo "exec stdbuf -oL ${gzdoom} ${@} | speak"
exec stdbuf -oL ${gzdoom} ${@} | speak
popd
}
speak() {
if pgrep cthulhu ; then
speechProvider="socat - UNIX-CLIENT:/tmp/cthulhu.sock"
else
speechProvider="spd-say -e ${spd_module} ${spd_pitch} ${spd_rate} ${spd_voice} ${spd_volume} --"
fi
startSpeech=1
while IFS= read -r line; do
echo "$line"
if [[ $startSpeech -eq 1 ]] && [[ "$line" =~ ^-{5,}$ ]]; then
startSpeech=0
continue
fi
if [[ $startSpeech -eq 0 ]]; then
line=$(echo "${line}" |
grep "${antiGrepStrings[@]}" |
sed "${sedStrings[@]}")
if [[ "$doomLanguage" != "en" ]]; then
line=$(translate_text "$line")
fi
echo "${line}" | $speechProvider
fi
done
}
audio_manual() {
if command -v mpv &> /dev/null ; then
mediaPlayer=("mpv" "--really-quiet" "--no-video")
else
mediaPlayer=("play" "-qV0")
fi
local manualPath="${gamePath}/Manual"
declare -a menuList
for i in "${manualPath}"/*/ ; do
local path="${i%/}"
local name="${i/${manualPath}\//}"
local name="${name% *}"
menuList+=("$path" "$name")
done
manualPath="$(dialog --backtitle "Select a Manual" \
--clear \
--no-tags \
--menu "Please select one" 0 0 0 "${menuList[@]}" --stdout)"
[[ $? -ne 0 ]] && exit 0
# If user selected a manual, show the audio file menu
if [[ -n "$manualPath" ]]; then
declare -a audioList=("all" "Play All") # Start with "All" option
# Add all mp3 files to the menu
while IFS= read -r file; do
local filename="${file##*/}"
local menuname="${filename%.mp3}"
audioList+=("$file" "$menuname")
done < <(find "$manualPath" -name "*.mp3" | sort)
local selection
selection="$(dialog --backtitle "Select Audio Track" \
--clear \
--no-tags \
--menu "Please select one" 0 0 0 "${audioList[@]}" --stdout)"
[[ $? -ne 0 ]] && exit 0
if [[ -n "$selection" ]]; then
if [[ "$selection" == "all" ]]; then
# Play all files in order
find "$manualPath" -name "*.mp3" -print0 | sort -z | \
while IFS= read -r -d '' file; do
"${mediaPlayer[@]}" "$file"
done
else
# Play selected file
"${mediaPlayer[@]}" "$selection"
return
fi
fi
fi
}
# Dialog setup:
DIALOG_ITEM_HELP=""
export DIALOGOPTS='--no-lines --visit-items'
# Toby games path
export gamePath=~/.local/games/doom
# Path where doom wads are stored
export doomPath="$(find /usr/share -type d -name "doom" 2> /dev/null | head -1)"
# Path to gzdoom or yadoom.
if [[ -x "${BASH_SOURCE[0]%/*}/yadoom" ]]; then
export gzdoom="$(readlink -f "${BASH_SOURCE[0]%/*}/yadoom")"
gamePath=~/.local/games/doom
check_dependencies python-pyside6:PySide6 python-setproctitle:setproctitle
pushd "${gamePath}"
if ! [[ -d "toby-doom-launcher" ]]; then
git clone https://git.stormux.org/storm/toby-doom-launcher.git
else
export gzdoom="$(command -v gzdoom)"
git -C "${gamePath}/toby-doom-launcher" pull
fi
# Version of the accessibility mod
export tobyVersion="8-0"
# Doom Addons
mapfile -t doomAddons < <(find "$gamePath/Addons/DOOM/" -type f -name "Toby*.pk3"
find "$gamePath/Addons/MENU/" -type f -name "Toby*.pk3"
)
# Heretic Addons
mapfile -t hereticAddons < <(find "$gamePath/Addons/HERETIC/" -type f -name "TobyHeretic*.pk3"
find "$gamePath/Addons/MENU/" -type f -name "Toby*.pk3"
)
# Hexen Addons
mapfile -t hexenAddons < <(find "$gamePath/Addons/HEXEN/" -type f -name "TobyHexen*.pk3"
find "$gamePath/Addons/MENU/" -type f -name "Toby*.pk3"
)
doomGames=(
# Toby demo map
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3 ${gamePath}/Addons/MAPS/Toby-Demo-Level.wad ${doomAddons[*]}" "Freedoom Toby Demo Map"
# Unmodified Doom with accessibility.
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3 ${doomAddons[*]}" "Freedoom"
# Toby accessibility mods
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3 ${gamePath}/Addons/MAPS/TobyDoomLevels.wad ${doomAddons[*]}" "Freedoom Toby Delux Map Pack"
# OperationMDK
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3 ${gamePath}/OpMDK.wad ${doomAddons[*]}" "Freedoom OperationMDK"
# Unmodified Heretic with accessibility
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3 ${hereticAddons[*]}" "Classic Heretic"
# Heretic accessibility mods
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3 ${gamePath}/Addons/MAPS/TobyHereticLevels.wad ${hereticAddons[*]}" "Toby Heretic"
# Unmodified Hexen with accessibility
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3 ${hexenAddons[*]}" "Classic Hexen"
# Heretic accessibility mods
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3 ${gamePath}/Addons/MAPS/TobyHexen.pk3 ${hexenAddons[*]}" "Toby Hexen"
"custom_game" "Custom Game"
)
export antiGrepStrings=(
'-E' '-v'
'-e' '^----+$'
'-e' '^$'
'-e' '^[0-9]'
'-e' '^P_StartScript:'
'-e' '^(Facing |fluidsynth |INTRO|MAP[0-9]+|Music "|Unknown)'
'-e' '^(\[Toby Accessibility Mod\] )?READ.*'
'-e' '^ *TITLEMAP'
'-e' '^\[Toby Accessibility Mod\] (INTRO|READMe)([0-9]+).*'
'-e' 'key card'
'-e' '^New PDA Entry:'
'-e' "^(As |Computer Voice:|Holy|I |I've|Monorail|Sector |Ugh|What|Where)"
'-e' 'Script warning, "'
'-e' 'Tried to define'
)
export sedStrings=('-E'
'-e' 's/^\[Toby Accessibility Mod\] M_/[Toby Accessibility Mod] /'
'-e' 's/^\[Toby Accessibility Mod\] //'
'-e' 's/^MessageBoxMenu$/Confirmation menu: Press Y for yes or N for no/'
'-e' 's/^Mainmenu$/Main menu/'
'-e' 's/^Skillmenu$/Difficulty menu/'
'-e' 's/^NGAME$/New game/'
'-e' 's/^(LOAD|SAVE|QUIT)G$/\1 game/'
'-e' 's/"cl_run" = "true"/run/'
'-e' 's/"cl_run" = "false"/walk/'
#'-e' 's:.*/:Game saved. \(:'
'-e' 's/UAC/U A C/'
'-e' 's/^\+//'
'-e' 's/ ?\*+ ?//g'
)
# Translation stuff
doomLanguage="${doomLanguage:-en}"
cache="${cache:-${XDG_CACHE_HOME:-$HOME/.cache}/linux-game-manager}"
translationDB="${cache}/doom_${doomLanguage}.sqlite"
# Function to initialize SQLite database
init_translation_db() {
mkdir -p "$cache"
if [[ ! -f "$translationDB" ]]; then
sqlite3 "$translationDB" <<EOF
CREATE TABLE translations (
original TEXT PRIMARY KEY,
translated TEXT
);
EOF
fi
}
# Function to translate text
translate_text() {
local text="$1"
local translatedText
# Check if translation exists in database
translatedText=$(sqlite3 "$translationDB" "SELECT translated FROM translations WHERE original = ?;" "$text")
if [[ -n "$translatedText" ]]; then
echo "$translatedText"
return 0
fi
translatedText=$(trans -b -t "$doomLanguage" "$text")
# Store new translation in database
sqlite3 "$translationDB" "INSERT INTO translations (original, translated) VALUES (?, ?);" "$text" "$translatedText"
echo "$translatedText"
}
custom_game() {
mapfile -t customGames < <(find "${BASH_SOURCE[0]%/*}/TobyCustom/" -type f -iname '*.sh')
declare -a customMenu
for i in "${customGames[@]}" ; do
customMenu+=("$i")
title="${i##*/}"
title="${title//_/ }"
title="${title%.*}"
customMenu+=("$title")
done
customGame="$(dialog --backtitle "Select your Custom Doom!" \
--clear \
--no-tags \
--menu "Please select one" 0 0 0 "${customMenu[@]}" --stdout)"
buttonCode=$?
if [[ $buttonCode -eq 1 ]]; then
exit 0
fi
source "${customGame}"
}
if [[ "$doomLanguage" != "en" ]]; then
init_translation_db
fi
doomGames+=("manual" "Audio Manual")
while [[ -z "${gameOption}" ]] || [[ "${gameOption}" == "manual" ]]; do
gameOption="$(dialog --backtitle "Select your Doom!" \
--clear \
--no-tags \
--ok-label "Single Player" \
--cancel-label "Death Match" \
--extra-button \
--extra-label "co-op" \
--help-button \
--help-label "Exit" \
--menu "Please select one" 0 0 0 "${doomGames[@]}" --stdout)"
buttonCode=$?
[[ $buttonCode -ne 0 ]] && break
if [[ "${gameOption}" == "manual" ]]; then
audio_manual
fi
done
if [[ -e "${gamePath}/DoomMetalVol7.wad" ]]; then
gameOption+=" DoomMetalVol7.wad"
elif [[ -e "${gamePath}/DoomMetalVol6.wad" ]]; then
gameOption+=" DoomMetalVol6.wad"
fi
case ${buttonCode} in
1)
# Death match setup
# Ignore the choice of map made above
gameOption="${gamePath}/TobyAccMod_V${tobyVersion}.pk3 ${gamePath}/Addons/MAPS/TobyDeathArena_V1-5.wad ""$gamePath/Addons/DOOM/TobyV*_"*
ipAddress="$(dialog --backtitle "Deathmatch Options" \
--clear \
--no-tags \
--ok-label "Join" \
--cancel-label "Exit" \
--extra-button \
--extra-label "Host" \
--inputbox "Enter ip or URL, required for join." -1 -1 --stdout)"
buttonCode=$?
[[ $buttonCode -eq 1 ]] && exit 0
if [[ $buttonCode -eq 0 ]]; then
if [[ "${#ipAddress}" -lt 3 ]]; then
dialog --backtitle "Deathmatch" --clear --msgbox "No ip address or URL given." -1 -1 --stdout
exit 1
fi
flags=('-join' "${ipAddress}" '+Toby_SnapToTargetTargetingMode' '0')
else
# List of maps included:
maps=(
"1" "Com Station (2-4 players)"
"2" "Warehouse (2-4 players)"
"3" "Sector 3 (2-4 players)"
"4" "Dungeon of Doom (2-4 players)"
"5" "Ocean Fortress (2-4 players)"
"6" "Water Treatment Facility (2-4 players)"
"7" "Phobos Base Site 4 (2-4 players)"
"8" "Hangar Bay 18 (2-4 players)"
"9" "Garden of Demon (2-4 players)"
"10" "Outpost 69 (2-4 players)")
# Array of how many players a given map supports in dialog rangebox syntax
declare -a mapPlayers=(
[1]="2 4"
[2]="2 4"
[3]="2 4"
[4]="2 4"
[5]="2 4"
[6]="2 4"
[7]="2 4"
[8]="2 4"
[9]="2 4"
[10]="2 4")
map="$(dialog --backtitle "Select Map" \
--clear \
--no-tags \
--cancel-label "Exit" \
--ok-label "Next" \
--menu "Please select one" 0 0 0 "${maps[@]}" --stdout)"
fraglimit="$(dialog --backtitle "Fraglimit" \
--clear \
--ok-label "Next" \
--cancel-label "Exit" \
--rangebox "Select Fraglimit" -1 -1 1 500 20 --stdout)"
[[ $? -eq 1 ]] && exit 0
# Get ip address
yourIpAddress="$(curl -4s https://icanhazip.com)"
players="$(dialog --backtitle "Host Deathmatch Game" \
--clear \
--ok-label "Next" \
--cancel-label "Exit" \
--rangebox "Select number of players. Remember to give them your IP address: ${yourIpAddress}" -1 -1 ${mapPlayers[$map]} --stdout)"
[[ $? -eq 1 ]] && exit 0
skillLevel="$(dialog --backtitle "Host Deathmatch Game" \
--clear \
--ok-label "Start" \
--cancel-label "Exit" \
--extra-button \
--extra-label "Bots Only" \
--rangebox "Select difficulty. 1 easiest, 5 hardest." -1 -1 1 5 3 --stdout)"
code=$?
[[ $code -eq 1 ]] && exit 0
if [[ $code -eq 3 ]]; then
players=1
dialog --backtitle "Preparing to Launch" \
--msgbox "When the game starts, press \` to open the console. Type addbot, press enter. Repeat addbot for as many bots as you would like. Press \` again to close the console." -1 -1 --stdout
fi
flags=(
'-host' "${players}"
'-skill' "${skillLevel}"
'-deathmatch'
'+Toby_SnapToTargetTargetingMode' '0'
'+set' 'sv_cheats' '1'
'+fraglimit' "$fraglimit"
'+dmflags' '16384' '+dmflags' '4' '+dmflags' '128' '+dmflags' '4096'
'+dmflags2' '512' '+dmflags2' '1024'
'-extratic' '-dup' '3'
'-warp' "$map"
)
fi
launch_game ${gameOption} "${flags[@]}"
;;
2)
# Exit was pressed, so exit.
exit 0
;;
3)
# Co-op setup
ipAddress="$(dialog --backtitle "Co-op Options" \
--clear \
--no-tags \
--ok-label "Join" \
--cancel-label "Exit" \
--extra-button \
--extra-label "Host" \
--inputbox "Enter ip or URL, required for join." -1 -1 --stdout)"
buttonCode=$?
[[ $buttonCode -eq 1 ]] && exit 0
if [[ $buttonCode -eq 0 ]]; then
if [[ "${#ipAddress}" -lt 3 ]]; then
dialog --backtitle "Co-op" --clear --msgbox "No ip address or URL given." -1 -1 --stdout
exit 1
fi
flags=("keyshare-universal.pk3" '-join' "${ipAddress}")
else
# Get ip address
yourIpAddress="$(curl -4s https://icanhazip.com)"
players="$(dialog --backtitle "Host Co-op Game" \
--clear \
--ok-label "Next" \
--cancel-label "Exit" \
--rangebox "Select number of players. Remember to give them your IP address: ${yourIpAddress}" -1 -1 2 10 --stdout)"
[[ $? -eq 1 ]] && exit 0
skillLevel="$(dialog --backtitle "Host Co-op Game" \
--clear \
--ok-label "Start" \
--cancel-label "Exit" \
--rangebox "Select difficulty. 1 easiest, 5 hardest." -1 -1 1 5 3 --stdout)"
[[ $? -eq 1 ]] && exit 0
flags=(
"keyshare-universal.pk3"
'-host' "${players}"
'-skill' "${skillLevel}"
'+set' 'sv_cheats' '1'
'+set' 'sv_weaponsstay' '1'
'+set' 'sv_respawnprotect' '1'
'+set' 'sv_respawnsuper' '1'
'+set' 'alwaysapplydmflags' ''1
'-extratic' '-dup' '3'
)
fi
pushd "${gamePath}"
launch_game ${gameOption} "${flags[@]}"
;;
0)
if [[ "${gameOption%% *}" == "custom_game" ]]; then
custom_game
fi
if [[ -e "${gamePath}/Toby-Doom-Level-Music-Renamer.pk3" ]] && [[ "${gameOption}" =~ TobyDoomLevels.wad ]]; then
gameOption+=("${gamePath}/Toby-Doom-Level-Music-Renamer.pk3")
fi
launch_game ${gameOption[@]} "${flags[@]}"
;;
esac
exit 0
"toby-doom-launcher/Toby Doom Launcher.py"

View File

@@ -0,0 +1,9 @@
mudPath="${installPath}/tintin-kallisti-pack/kallisti.tin"
pushd "${mudPath%/*}"
git pull | \
dialog --progressbox "Checking for updates, please wait..." -1 -1
if [[ -n "${COLORTERM}" ]]; then
terminal_emulator "${mudPath%/*}" "tt++" "${mudPath##*/}"
else
tt++ ${mudPath##*/}
fi

View File

@@ -4,7 +4,7 @@ pushd "${mudPath%/*}"
git pull | \
dialog --progressbox "Checking for updates, please wait..." -1 -1
if [[ -n "${COLORTERM}" ]]; then
terminal_emulator tt++ ${mudPath##*/}
terminal_emulator "${mudPath%/*}" "tt++" "${mudPath##*/}"
else
tt++ ${mudPath##*/}
tt++ ${mudPath##*/}
fi

View File

@@ -1,124 +0,0 @@
#!/usr/bin/env bash
pushd "$doomPath"
# Set up the pk3 and wad files
gameOption=(
"$(find /usr/share/games/ -name 'Project_Brutality-master.pk3')"
"${doomPath}/TobyAccMod_V${tobyVersion}.pk3"
"${doomPath}/PB-Toby-Compatibility-Addon.pk3"
"${doomPath}/Toby-Universal-Pickup-Beacon-Prototype.pk3"
"${doomPath}/TobyDeathArena_V1-0.wad"
)
# Death match setup
ipAddress="$(dialog --backtitle "Deathmatch Options" \
--clear \
--no-tags \
--ok-label "Join" \
--cancel-label "Exit" \
--extra-button \
--extra-label "Host" \
--inputbox "Enter ip or URL, required for join." -1 -1 --stdout)"
buttonCode=$?
[[ $buttonCode -eq 1 ]] && exit 0
if [[ $buttonCode -eq 0 ]]; then
if [[ "${#ipAddress}" -lt 3 ]]; then
dialog --backtitle "Deathmatch" --clear --msgbox "No ip address or URL given." -1 -1 --stdout
exit 1
fi
flags=('-join' "${ipAddress}")
else
# List of maps included:
maps=(
"1" "Com Station (2-4 players)"
"2" "Warehouse (2-4 players)"
"3" "Sector 3 (2-4 players)"
"4" "Dungeon of Doom (2-4 players)"
"5" "Ocean Fortress (2-4 players)"
"6" "Water Treatment Facility (2-4 players)"
"7" "Phobos Base Site 4 (2-4 players)"
"8" "Hangar Bay 18 (2-4 players)")
# Array of how many players a given map supports in dialog rangebox syntax
declare -a mapPlayers=(
[1]="2 4"
[2]="2 4"
[3]="2 4"
[4]="2 4"
[5]="2 4"
[6]="2 4"
[7]="2 4"
[8]="2 4")
map="$(dialog --backtitle "Select Map" \
--clear \
--no-tags \
--cancel-label "Exit" \
--ok-label "Next" \
--menu "Please select one" 0 0 0 "${maps[@]}" --stdout)"
fraglimit="$(dialog --backtitle "Fraglimit" \
--clear \
--ok-label "Next" \
--cancel-label "Exit" \
--rangebox "Select Fraglimit" -1 -1 1 500 20 --stdout)"
[[ $? -eq 1 ]] && exit 0
# Get ip address
yourIpAddress="$(curl -4s https://icanhazip.com)"
players="$(dialog --backtitle "Host Deathmatch Game" \
--clear \
--ok-label "Next" \
--cancel-label "Exit" \
--rangebox "Select number of players. Remember to give them your IP address: ${yourIpAddress}" -1 -1 ${mapPlayers[$map]} --stdout)"
[[ $? -eq 1 ]] && exit 0
skillLevel="$(dialog --backtitle "Host Deathmatch Game" \
--clear \
--ok-label "Start" \
--cancel-label "Exit" \
--extra-button \
--extra-label "Bots Only" \
--rangebox "Select difficulty. 1 easiest, 5 hardest." -1 -1 1 5 3 --stdout)"
code=$?
[[ $code -eq 1 ]] && exit 0
if [[ $code -eq 3 ]]; then
players=1
dialog --backtitle "Preparing to Launch" \
--msgbox "When the game starts, press \` to open the console. Type addbot, press enter. Repeat addbot for as many bots as you would like. Press \` again to close the console." -1 -1 --stdout
fi
flags=(
'-host' "${players}"
'-skill' "${skillLevel}"
'-deathmatch'
'+set' 'sv_cheats' '1'
'+fraglimit' "$fraglimit"
'+dmflags' '16384' '+dmflags' '4' '+dmflags' '128' '+dmflags' '4096'
'+dmflags2' '512' '+dmflags2' '1024'
'-extratic' '-dup' '3'
'-warp' "$map"
)
fi
# Check for and include if present a wad. Some people may not have it.
if [[ -e "${doomPath}/DoomMetalVol7.wad" ]]; then
gameOption+=" DoomMetalVol7.wad"
elif [[ -e "${doomPath}/DoomMetalVol6.wad" ]]; then
gameOption+=" DoomMetalVol6.wad"
fi
# Extend the search for new messages to be read.
grepStrings+=('-e' ' died.'
'-e' 'Ectoplasmic Surge!'
'-e' ' has been '
'-e' '^(Armor|Health) boosted!'
'-e' 'Lesser demon energy'
'-e' '^Found '
'-e' 'Got the '
'-e' 'Picked up '
'-e' '^(Mega|Soul)sphere$'
'-e' '^Took '
'-e' ' was .*(\.|!)'
'-e' '^Vanguard of the gods!$'
'-e' "You've found "
'-e' 'You (collected|got|found|picked up) ')
# Launch the game and pipe things to be spoken through speech-dispatcher.
# This also leaves the console output intact for people who may want to read it.
exec stdbuf -oL ${gzdoom} ${gameOption[@]} "${flags[@]}" | while IFS= read -r l ; do echo "$l" | { grep "${grepStrings[@]}" | grep "${antiGrepStrings[@]}" | sed "${sedStrings[@]}" | spd-say -e ${spd_module} ${spd_pitch} ${spd_rate} ${spd_voice} ${spd_volume} -- > /dev/null 2>&1; }; echo "$l";done

View File

@@ -1,23 +0,0 @@
check_dependencies() {
if [[ $# -lt 2 ]]; then
dialog --backtitle "Linux Game Manager" \
--msgbox "Invalid call to check_dependencies(). Please check your code." -1 -1 --stdout
exit 1
fi
local packagePath="$1" # Path where the launcher will attempt the package, e.g. ${gamePath/Addons/PACKAGENAME/something.pk3
local packageURL="$2" # URL where the package can be downloaded.
shift 2
if [[ -e "${packagePath}" ]]; then
return
fi
local message=(
"You are missing the \"${packagePath##/*}\" Package." $'\n'
"You can get it from \"${packageURL}\"" $'\n')
echo "${packageURL}" | DISPLAY="${DISPLAY:-:0}" xclip -selection clipboard && message+=("The URL has been copied to the clipboard." $'\n')
for i in "${@}" ; do
message+=("$i" $'\n')
done
dialog --backtitle "Linux Game Manager" \
--msgbox "${message[*]}" -1 -1 --stdout
exit 1
}

View File

@@ -1,30 +0,0 @@
# Choice of maps
mapList=(
"${gamePath}/OpMDK.wad"
"${gamePath}/Addons/MAPS/TobyDoomLevels.wad"
"${gamePath}/Addons/MAPS/Toby-Demo-Level.wad"
)
declare -a mapMenu=('none' 'None')
for i in "${mapList[@]}" ; do
if [[ -e "$i" ]]; then
title="${i##*/}"
title="${title%.*}"
title="${title/OpMDK/Operation MDK}"
title="${title/-/ }"
mapMenu+=("$i" "$title")
fi
done
map="$(dialog --backtitle "Select Map" \
--clear \
--no-tags \
--cancel-label "Exit" \
--ok-label "Next" \
--menu "Please select one" 0 0 0 "${mapMenu[@]}" --stdout)"
[[ $? -ne 0 ]] && exit 0
if [[ "${map}" != "none" ]]; then
gameOption=("$map" "${gameOption[@]}")
fi
if [[ "${map}" == ""${gamePath}/TobyDoomLevels.wad"" ]]; then
gameOption=("$map" "${gameOption[@]}" "${gamePath}/Toby-Doom-Level-Music-Renamer.pk3")
fi

View File

@@ -1,25 +0,0 @@
#!/usr/bin/env bash
# check for required wad.
source ${BASH_SOURCE[0]%/*}/.dependencies
check_dependencies "${gamePath}/aoddoom1.wad" "https://www.moddb.com/mods/army-of-darkness-total-conversion/addons/army-of-darkness-doom-wad" "Place \"aoddoom1.wad\" in \"${gamePath}\"."
gamePath=~/.local/games/doom
# Set up the pk3 and wad files
gameOption=(
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3"
"$gamePath/Addons/MENU/TobyV${tobyVersion%%-*}_"*
"${gamePath}/aoddoom1.wad"
)
# Check for and include if present a wad. Some people may not have it.
if [[ -e "${gamePath}/DoomMetalVol7.wad" ]]; then
gameOption+=("${gamePath}/DoomMetalVol7.wad")
elif [[ -e "${gamePath}/DoomMetalVol6.wad" ]]; then
gameOption+=("${gamePath}/DoomMetalVol6.wad")
fi
source ${BASH_SOURCE[0]%/*}/.mapmenu
flags=('+Toby_UniversalBeacon_UseUniversalSounds' 'true')

View File

@@ -1,121 +0,0 @@
#!/usr/bin/env bash
# Set up the pk3 and wad files
gameOption=(
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3"
"$gamePath/Addons/MENU/TobyV*_"*
)
# Get a list of pk3s to use for the custom death match.
mapfile -t pk3List < <(find "${gamePath}" -maxdepth 1 -mindepth 1 -size +10M -iname '*.pk3')
if [[ -e "${gamePath}/aoddoom1.wad" ]]; then
pk3List+=("${gamePath}/aoddoom1.wad")
fi
declare -a pk3Menu
for i in "${pk3List[@]}" ; do
title="${i##*/}"
title="${title%.*}"
pk3Menu+=("${i}" "${title}")
done
# Death match setup
ipAddress="$(dialog --backtitle "Deathmatch Options" \
--clear \
--no-tags \
--ok-label "Join" \
--cancel-label "Exit" \
--extra-button \
--extra-label "Host" \
--inputbox "Enter ip or URL, required for join." -1 -1 --stdout)"
buttonCode=$?
[[ $buttonCode -eq 1 ]] && exit 0
pk3="$(dialog --backtitle "Select Customization" \
--clear \
--no-tags \
--cancel-label "Exit" \
--ok-label "Next" \
--menu "Please select one" 0 0 0 "${pk3Menu[@]}" --stdout)"
[[ $? -ne 0 ]] && exit 0
if [[ $buttonCode -eq 0 ]]; then
if [[ "${#ipAddress}" -lt 3 ]]; then
dialog --backtitle "Deathmatch" --clear --msgbox "No ip address or URL given." -1 -1 --stdout
exit 1
fi
flags=('-join' "${ipAddress}" '+Toby_SnapToTargetTargetingMode' '0')
else
# List of maps included:
maps=(
"1" "Com Station (2-4 players)"
"2" "Warehouse (2-4 players)"
"3" "Sector 3 (2-4 players)"
"4" "Dungeon of Doom (2-4 players)"
"5" "Ocean Fortress (2-4 players)"
"6" "Water Treatment Facility (2-4 players)"
"7" "Phobos Base Site 4 (2-4 players)"
"8" "Hangar Bay 18 (2-4 players)"
"9" "Garden of Demon (2-4 players)"
"10" "Outpost 69 (2-4 players)")
# Array of how many players a given map supports in dialog rangebox syntax
declare -a mapPlayers=(
[1]="2 4"
[2]="2 4"
[3]="2 4"
[4]="2 4"
[5]="2 4"
[6]="2 4"
[7]="2 4"
[8]="2 4"
[9]="2 4"
[10]="2 4")
map="$(dialog --backtitle "Select Map" \
--clear \
--no-tags \
--cancel-label "Exit" \
--ok-label "Next" \
--menu "Please select one" 0 0 0 "${maps[@]}" --stdout)"
fraglimit="$(dialog --backtitle "Fraglimit" \
--clear \
--ok-label "Next" \
--cancel-label "Exit" \
--rangebox "Select Fraglimit" -1 -1 1 500 20 --stdout)"
[[ $? -eq 1 ]] && exit 0
# Get ip address
yourIpAddress="$(curl -4s https://icanhazip.com)"
players="$(dialog --backtitle "Host Deathmatch Game" \
--clear \
--ok-label "Next" \
--cancel-label "Exit" \
--rangebox "Select number of players. Remember to give them your IP address: ${yourIpAddress}" -1 -1 ${mapPlayers[$map]} --stdout)"
[[ $? -eq 1 ]] && exit 0
skillLevel="$(dialog --backtitle "Host Deathmatch Game" \
--clear \
--ok-label "Start" \
--cancel-label "Exit" \
--extra-button \
--extra-label "Bots Only" \
--rangebox "Select difficulty. 1 easiest, 5 hardest." -1 -1 1 5 3 --stdout)"
code=$?
[[ $code -eq 1 ]] && exit 0
if [[ $code -eq 3 ]]; then
players=1
dialog --backtitle "Preparing to Launch" \
--msgbox "When the game starts, press \` to open the console. Type addbot, press enter. Repeat addbot for as many bots as you would like. Press \` again to close the console." -1 -1 --stdout
fi
flags=(
'-host' "${players}"
'-skill' "${skillLevel}"
'-deathmatch'
'+Toby_SnapToTargetTargetingMode' '0'
'+set' 'sv_cheats' '1'
'+fraglimit' "$fraglimit"
'+dmflags' '16384' '+dmflags' '4' '+dmflags' '128' '+dmflags' '4096'
'+dmflags2' '512' '+dmflags2' '1024'
'-extratic' '-dup' '3'
'-warp' "$map"
)
fi
gameOption+=("${pk3}"
"${gamePath}/Addons/MAPS/TobyDeathArena_V1-5.wad"
)

View File

@@ -1,31 +0,0 @@
#!/usr/bin/env bash
# check for required pk3.
source ${BASH_SOURCE[0]%/*}/.dependencies
check_dependencies "${gamePath}/GMOTA_V.1.5.2.pk3" \
"https://combine-kegan.itch.io/gmota" \
"Place the file in ${gamePath}"
# Set up the pk3 and wad files
gameOption=(
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3"
"$gamePath/Addons/MENU/TobyV${tobyVersion%%-*}_"*
"$gamePath/Addons/DOOM/TobyV${tobyVersion%%-*}_Proximity.pk3"
"${gamePath}/GMOTA_V.1.5.2.pk3"
)
source ${BASH_SOURCE[0]%/*}/.mapmenu
flags=(
# Key bindings
'+bind Alt +altattack'
'+bind Ctrl +attack'
'+bind G +User1'
'+bind U unreloader'
# Variables
'+Toby_NarrationOutputType 2'
'+pb_exaggeratedrecoil false'
'+pb_weapon_recoil_mod_horizontal 0'
'+pb_weapon_recoil_mod_vertical 0'
'+vertspread true'
)

View File

@@ -1,35 +0,0 @@
#!/usr/bin/env bash
# check for required pk3.
source ${BASH_SOURCE[0]%/*}/.dependencies
check_dependencies "${gamePath}/Project_Brutality.pk3" \
"https://www.moddb.com/mods/project-brutality" \
"This should be included by default." \
'If you are seeing this message, please reinstall after removing any TobyDoom files from ~/.cache/linux-game-manager.' \
'rm -f ~/.cache/linux-game-manager/TobyAccessibilityMod_Version*'
# Set up the pk3 and wad files
gameOption=(
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3"
"$gamePath/Addons/MENU/TobyV${tobyVersion%%-*}_"*
"$gamePath/Addons/DOOM/TobyV${tobyVersion%%-*}_Proximity.pk3"
"${gamePath}/PB-Toby-Compatibility-Addon.pk3"
"${gamePath}/Project_Brutality.pk3"
)
# Check for and include if present a wad. Some people may not have it.
if [[ -e "${gamePath}/DoomMetalVol7.wad" ]]; then
gameOption+=("${gamePath}/DoomMetalVol7.wad")
elif [[ -e "${gamePath}/DoomMetalVol6.wad" ]]; then
gameOption+=("${gamePath}/DoomMetalVol6.wad")
fi
source ${BASH_SOURCE[0]%/*}/.mapmenu
flags=(
'+pb_exaggeratedrecoil' 'false'
'+pb_weapon_recoil_mod_horizontal' '0'
'+pb_weapon_recoil_mod_vertical' '0'
'+vertspread' 'true'
'+Toby_SnapToTargetTargetingMode' '1'
'+Toby_UniversalBeacon_UseUniversalSounds' 'false'
)

View File

@@ -1,34 +0,0 @@
#!/usr/bin/env bash
# check for required pk3.
source ${BASH_SOURCE[0]%/*}/.dependencies
check_dependencies "${gamePath}/Project_Brutality-Latest.pk3" \
"https://www.moddb.com/mods/project-brutality" \
"This should be included by default." \
'If you are seeing this message, please reinstall after removing any TobyDoom files from ~/.cache/linux-game-manager.' \
'rm -f ~/.cache/linux-game-manager/TobyAccessibilityMod_Version*'
# Set up the pk3 and wad files
gameOption=(
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3"
"$gamePath/Addons/MENU/TobyV${tobyVersion%%-*}_"*
"$gamePath/Addons/DOOM/TobyV${tobyVersion%%-*}_Proximity.pk3"
"${gamePath}/Project_Brutality-Latest.pk3"
)
# Check for and include if present a wad. Some people may not have it.
if [[ -e "${gamePath}/DoomMetalVol7.wad" ]]; then
gameOption+=("${gamePath}/DoomMetalVol7.wad")
elif [[ -e "${gamePath}/DoomMetalVol6.wad" ]]; then
gameOption+=("${gamePath}/DoomMetalVol6.wad")
fi
source ${BASH_SOURCE[0]%/*}/.mapmenu
flags=(
'+pb_exaggeratedrecoil' 'false'
'+pb_weapon_recoil_mod_horizontal' '0'
'+pb_weapon_recoil_mod_vertical' '0'
'+vertspread' 'true'
'+Toby_SnapToTargetTargetingMode' '1'
'+Toby_UniversalBeacon_UseUniversalSounds' 'false'
)

View File

@@ -1,14 +0,0 @@
In your ~/.config/gzdoom/gzdoom.ini file, if you do not have these four sections create them at the end. If they are there, you can just update the keybindings. It should look like this:
[Doom.PBInteractions.Bindings]
[Doom.PBInteractions.DoubleBindings]
[Doom.PBAdvMoves.Bindings]
F=+User2
G=+User1
U=unreloader
V=+User4
[Doom.PBAdvMoves.DoubleBindings]

View File

@@ -1,13 +0,0 @@
#!/usr/bin/env bash
# Extend sed strings to handle the player class menu
sedStrings+=('-e' 's/^Playerclassmenu$/Player class menu/')
# Set up the pk3 and wad files
gameOption=(
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3"
"$gamePath/Addons/MENU/TobyV${tobyVersion%%-*}_"*
"${gamePath}/Xim-StarWars-v3.1.5.pk3"
"$gamePath/Addons/STARWARS/"*
)
source ${BASH_SOURCE[0]%/*}/.mapmenu

View File

@@ -1,38 +0,0 @@
#!/usr/bin/env bash
# check for required pk3.
source ${BASH_SOURCE[0]%/*}/.dependencies
check_dependencies "${gamePath}/Addons/WOLFENDOOM/orig_enh.pk3" \
"https://www.moddb.com/mods/wolfendoom/downloads/wolfendoom-enhanced" \
"mkdir -p ${gamePath}/Addons/WOLFENDOOM/" \
"Place all pk3 files from the zip archive in:" \
"${gamePath}/Addons/WOLFENDOOM/" \
"There should be three of them noct_enh.pk3, orig_enh.pk3, and sod_enh.pk3"
# Set up the pk3 and wad files
gameOption=(
"${gamePath}/TobyAccMod_V${tobyVersion}.pk3"
"$gamePath/Addons/MENU/TobyV${tobyVersion%%-*}_"*
"$gamePath/Addons/DOOM/TobyV${tobyVersion%%-*}_"*"Proximity"*".pk3"
)
menuList=("${gamePath}/Addons/WOLFENDOOM/orig_enh.pk3" "WolfenDoom"
"${gamePath}/Addons/WOLFENDOOM/sod_enh.pk3" "WolfenDoom - Spear of Destiny"
"${gamePath}/Addons/WOLFENDOOM/noct_enh.pk3" "WolfenDoom - Nocturne"
)
pk3=$(dialog --backtitle "Select Game" \
--clear \
--no-tags \
--cancel-label "Exit" \
--ok-label "Next" \
--menu "Please select one" 0 0 0 "${menuList[@]}" --stdout)
[[ $? -ne 0 ]] && exit 0
gameOption+=("${pk3}")
flags=(
# Key bindings
'+bind Ctrl +attack'
'+bind X turn180'
# Variables
'+Toby_NarrationOutputType 2'
)

View File

@@ -0,0 +1,3 @@
check_architecture x86_64
pushd "${installPath}/Wheels of Prio"
${fex}./Wp

View File

@@ -1,88 +0,0 @@
#!/usr/bin/env bash
# Function to check if a file is an IWAD
is_iwad() {
local file="$1"
[[ "${file,,}" =~ ipk3$ ]] && return 0
if [[ -f "$file" ]]; then
# Extract the first four bytes and check if they match the IWAD signature
if hexdump -n 4 -e '4/1 "%02X"' "$file" | grep -q '^49574144$'; then
return 0
else
return 1
fi
fi
return 1
}
iwad_menu() {
# Extract the Path= lines from the [IWADSearch.Directories] section
mapfile -t wadPaths < <(sed -n "/^\[IWADSearch.Directories\]/,/^\[/{/Path=/p;}" "$configFile" | cut -d '=' -f 2)
declare -A uniqueWads
for i in "${wadPaths[@]}"; do
if [[ -d "$i" ]]; then
while IFS= read -r -d $'\0' wad; do
if is_iwad "$wad"; then
wad_name=$(basename "$wad")
uniqueWads["${wad_name,,}"]="$wad"
fi
done < <(find "$i" -follow -maxdepth 1 -type f \( -iname '*.wad' -o -iname '*.ipk3' \) -print0)
fi
done
wadList=("${uniqueWads[@]}")
# Set up the menu
declare -a wadMenu
for path in "${wadList[@]}" ; do
title="${path##*/}"
title="${title%.*}"
wadMenu+=("${title}" "${path}")
done
# Run yad to display the dialog
iwad=$(yad --list \
--title="Yadoom" \
--text="Select an Iwad" \
--column="Iwad" \
--column="Path" \
--button="Launch:0" \
--button="Close:1" \
--hide-column=2 \
--search-column=1 \
--skip-taskbar \
"${wadMenu[@]}")
yadCode="$?"
[[ ${yadCode} -eq 0 ]] || exit 0
iwad="${iwad#*|}"
iwad="${iwad%|}"
}
configFile="${XDG_CONFIG_HOME:-$HOME/.config}/gzdoom/gzdoom.ini"
declare -a gzdoomArgs
# Process arguments
while [[ $# -gt 0 ]]; do
case "$1" in
-c)
configFile="$2"
shift 2
;;
-iwad|-i)
iwad="$2"
gzdoomArgs+=("-iwad" "$2")
shift 2
;;
*)
gzdoomArgs+=("$1")
shift
;;
esac
done
# If no IWAD specified, show the menu
if [[ -z "$iwad" ]]; then
iwad_menu
gzdoomArgs+=("-iwad" "$iwad")
fi
# Launch GZDoom with all arguments
gzdoom "${gzdoomArgs[@]}"

View File

@@ -33,3 +33,7 @@ LGM moves games into place when installing them. So the game can be found in ~/.
## What are the differences in linux-game-manager and audiogame-manager?
The difference in [audiogame-manager](https://git.stormux.org/storm/audiogame-manager) and linux-game-manager is, linux-game-manager focuses on setting up games that are native to Linux while audiogame-manager focuses on getting Windows based games working in wine. Although the end result looks the same to the end user, lots of things are different under the hood.
## Supporting the Project
If you want to support this and other Stormux projects, please check out the [Patreon](https://patreon.com/stormux).

View File

@@ -44,28 +44,289 @@ EOF
# Dialog accessibility
export DIALOGOPTS='--no-lines --visit-items'
# UI wrapper functions for dialog/yad switching
# Automatically switches between dialog (console) and yad (GUI) based on DISPLAY environment
# Wrapper function for menu selection
# Usage: ui_menu "title" "backtitle" "text" option1 "description1" option2 "description2" ...
ui_menu() {
local title="$1"
local back_title="$2"
local text="$3"
shift 3
if [[ "$dialog_type" == "yad" ]]; then
# Build yad list format: Display only, then map back to value
local yad_list=""
declare -A value_map
while [[ $# -gt 0 ]]; do
local option="$1"
local description="$2"
value_map["$description"]="$option"
if [[ -n "$yad_list" ]]; then
yad_list="$yad_list\n"
fi
yad_list="${yad_list}${description}"
shift 2
done
local selected_description
selected_description=$(echo -e "$yad_list" | yad --list \
--title="$title" \
--text="$text" \
--column="Option" \
--no-headers \
--selectable-labels \
--search-column=1 \
--height=400 \
--width=600)
# Strip trailing newline, pipe, and any other whitespace
selected_description=$(echo "$selected_description" | tr -d '\n\r' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//;s/|$//')
# Return the mapped value
if [[ -n "$selected_description" ]]; then
echo "${value_map["$selected_description"]}"
fi
else
# Build dialog menu format with mapping (same approach as yad)
local dialog_args=()
declare -A value_map
while [[ $# -gt 0 ]]; do
local option="$1"
local description="$2"
value_map["$description"]="$option"
dialog_args+=("$description" "$description")
shift 2
done
local selected_description
selected_description=$(dialog --backtitle "$back_title" \
--title "$title" \
--no-tags \
--menu "$text" 0 0 0 \
"${dialog_args[@]}" \
--stdout)
# Return the mapped value
if [[ -n "$selected_description" ]]; then
echo "${value_map["$selected_description"]}"
fi
fi
}
# Wrapper function for message box
# Usage: ui_msgbox "title" "backtitle" "text"
ui_msgbox() {
local title="$1"
local back_title="$2"
local text="$3"
if [[ "$dialog_type" == "yad" ]]; then
echo -e "$text" | yad --text-info \
--title="$title" \
--show-cursor \
--button="OK:0" \
--width=600 \
--height=400
else
dialog --backtitle "$back_title" \
--title "$title" \
--msgbox "$text" 0 0
fi
}
# Wrapper function for yes/no dialog
# Usage: ui_yesno "title" "backtitle" "text"
ui_yesno() {
local title="$1"
local back_title="$2"
local text="$3"
if [[ "$dialog_type" == "yad" ]]; then
yad --form \
--title="$title" \
--field="$text:LBL" \
--selectable-labels \
--button="Yes:0" \
--button="No:1" \
--width=400
else
dialog --backtitle "$back_title" \
--title "$title" \
--yesno "$text" 0 0
fi
}
# Wrapper function for info box (non-blocking message)
# Usage: ui_infobox "title" "backtitle" "text"
ui_infobox() {
local title="$1"
local back_title="$2"
local text="$3"
if [[ "$dialog_type" == "yad" ]]; then
# For yad, we'll use a notification since infobox is non-blocking
yad --notification \
--text="$text" \
--timeout=3
else
dialog --backtitle "$back_title" \
--title "$title" \
--infobox "$text" 0 0
fi
}
# Wrapper function for progress box
# Usage: command | ui_progressbox "title" "text"
ui_progressbox() {
local title="$1"
local text="$2"
if [[ "$dialog_type" == "yad" ]]; then
# Start audio feedback for accessibility
local beep_pid
local yad_pid
# Cleanup function for traps
cleanup_progress() {
[[ -n "$beep_pid" ]] && kill "$beep_pid" 2>/dev/null
[[ -n "$yad_pid" ]] && kill "$yad_pid" 2>/dev/null
}
# Set trap to ensure cleanup on interruption
trap cleanup_progress EXIT INT TERM
if command -v sox >/dev/null 2>&1; then
{
while true; do
# Generate a short, pleasant progress beep (440Hz for 0.1s)
sox -q -n -d synth 0.1 sine 440 vol 0.3 2>/dev/null
sleep 2 # Beep every 2 seconds
done
} &
beep_pid=$!
fi
# Start visual progress dialog with auto-close
yad --progress \
--title="$title" \
--text="$text" \
--auto-close \
--pulsate \
--width=400 \
--height=100 &
yad_pid=$!
# Process command output
local line_count=0
while IFS= read -r line; do
((line_count++))
done < <(stdbuf -oL cat)
# Clean up background processes
cleanup_progress
trap - EXIT INT TERM # Remove traps
else
dialog --title "$title" \
--progressbox "$text" 20 70
fi
}
# Simple progress box that just shows the operation is running (no command output)
# Usage: command | ui_simple_progressbox "title" "text"
ui_simple_progressbox() {
local title="$1"
local text="$2"
if [[ "$dialog_type" == "yad" ]]; then
# Start audio feedback for accessibility
local beep_pid
local yad_pid
# Cleanup function for traps
cleanup_simple_progress() {
[[ -n "$beep_pid" ]] && kill "$beep_pid" 2>/dev/null
[[ -n "$yad_pid" ]] && kill "$yad_pid" 2>/dev/null
}
# Set trap to ensure cleanup on interruption
trap cleanup_simple_progress EXIT INT TERM
if command -v sox >/dev/null 2>&1; then
{
while true; do
# Generate a short, pleasant progress beep (440Hz for 0.1s)
sox -q -n -d synth 0.1 sine 440 vol 0.3 2>/dev/null
sleep 2 # Beep every 2 seconds
done
} &
beep_pid=$!
fi
# Show progress dialog with pulsating
yad --progress \
--title="$title" \
--text="$text" \
--auto-close \
--pulsate \
--width=400 \
--height=100 &
yad_pid=$!
# Read from stdin and discard, but keep dialogs open until command finishes
cat > /dev/null
# Clean up background processes
cleanup_simple_progress
trap - EXIT INT TERM # Remove traps
else
dialog --title "$title" \
--progressbox "$text" 20 70
fi
}
# Check for updates
check_update() {
local url="$(git ls-remote --get-url)"
if [[ "$url" =~ ^[[:alnum:]]+@ ]] || [[ -z "$url" ]]; then
if ! [[ -d ".git" ]]; then
return
fi
git remote update > /dev/null 2>&1
local url
url="$(git ls-remote --get-url)"
if [[ "$url" =~ ^ssh://|git@|gitea@ ]] || [[ -z "$url" ]]; then
return
fi
git remote update &> /dev/null
local upstream='@{u}'
local home="$(git rev-parse @)"
local remote="$(git rev-parse "$upstream")"
local home
local remote
home="$(git rev-parse @)"
remote="$(git rev-parse "$upstream")"
if [[ "$home" == "$remote" ]]; then
return
fi
dialog --backtitle "Linux Game manager" \
--yesno "Updates are available. Would you like to update now?" -1 -1 --stdout || return
# Store the current commit before pulling
local beforePull=$(git rev-parse HEAD)
git pull
# Show changes between the stored commit and current HEAD
git log "$beforePull..HEAD" --pretty=format:'%an: %s' | tac
exit $?
ui_yesno "Linux Game Manager" "Linux Game Manager" "Updates are available. Would you like to update now?" || return
# Perform git pull quietly, then show only the important changes
local update_result
git pull --quiet >/dev/null 2>&1
update_result=$?
# Get the important information: commit messages and summary
local changes_summary
changes_summary=$({
echo "UPDATE COMPLETED"
echo
echo "Recent changes:"
git log '@{1}..' --pretty=format:'• %an: %s' | tac
echo
echo "Update summary:"
git diff --stat '@{1}..' | tail -1
} 2>/dev/null)
# Show only the meaningful update information
ui_msgbox "Update Complete" "Linux Game Manager" "$changes_summary"
exit $update_result
}
@@ -81,8 +342,7 @@ check_architecture() {
return
fi
done
dialog --backtitle "Linux Game Manager" \
--infobox "This game is not compatible with $architecture architecture." -1 -1
ui_infobox "Linux Game Manager" "Linux Game Manager" "This game is not compatible with $architecture architecture."
exit 1
}
@@ -101,30 +361,34 @@ check_dependencies() {
if [[ "${#dependencies[@]}" -eq 0 ]]; then
return
fi
echo "missing dependencies. Please install the following:"
echo
local missing_deps="missing dependencies. Please install the following:\n\n"
for i in "${dependencies[@]}" ; do
echo "$i"
missing_deps+="$i\n"
done
ui_msgbox "Linux Game Manager" "Linux Game Manager" "$missing_deps"
exit 1
}
# Function to open a terminal emulator
terminal_emulator() {
# Arguments workingDirectory, rest of arguments
local workingDir="$1"
shift
terminals=(
"lxterminal"
"mate-terminal"
"gnome-terminal"
)
for i in "${terminals[@]}" ; do
if command $i --working-directory="${game%/*}" -e $* ; then
if command $i --working-directory="${workingDir}" -e "$@" ; then
return
fi
done
echo "No suitable terminal emulators found, please install one of:"
local terminal_msg="No suitable terminal emulators found, please install one of:\n\n"
for i in "${terminals[@]}" ; do
echo "$i"
terminal_msg+="$i\n"
done
ui_msgbox "Linux Game Manager" "Linux Game Manager" "$terminal_msg"
}
# Function to open urls
@@ -136,7 +400,7 @@ open_url() {
desktop_launcher() {
local desktopFile="${HOME}/linux-game-manager.desktop"
if [[ -e "${desktopFile}" ]]; then
echo "the file ${desktopFile} exists. Cannot create the launcher."
ui_msgbox "Linux Game Manager" "Linux Game Manager" "The file ${desktopFile} exists. Cannot create the launcher."
exit 1
fi
local dotDesktop
@@ -171,28 +435,20 @@ desktop_launcher() {
# Alerts, for when user needs to read something.
alert() {
play -qnV0 synth 3 pluck D3 pluck A3 pluck D4 pluck F4 pluck A4 delay 0 .1 .2 .3 .4 remix - chorus 0.9 0.9 38 0.75 0.3 0.5 -t
echo
read -rp "Press enter to continue." continue
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Press OK to continue."
}
clear_cache() {
local answer
if [[ ! -d "${cache}" ]]; then
echo "No cache found at ${cache}."
ui_msgbox "Linux Game Manager" "Linux Game Manager" "No cache found at ${cache}."
return
fi
while ! [[ "${answer,,}" =~ ^yes$|^no$ ]]; do
echo "This will delete all contents of ${cache}. Are you sure you want to continue?"
echo "Please type yes or no."
echo
read -r answer
done
if [[ "$answer" == "no" ]]; then
if ! ui_yesno "Linux Game Manager" "Linux Game Manager" "This will delete all contents of ${cache}. Are you sure you want to continue?"; then
return
fi
# All safety checks done. Delete the cache.
rm -rfv "${cache}"
echo "Cache deleted."
rm -rfv "${cache}" | ui_progressbox "Linux Game Manager" "Clearing cache..."
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Cache deleted."
}
download() {
@@ -210,20 +466,17 @@ download() {
# Skip if the item is in cache.
[[ -e "${cache}/${dest}" ]] && continue
{ if ! curl -L4 -C - --retry 10 --output "${cache}/${dest}" "${i}" ; then
echo "Could not download \"$i\"..."
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Could not download \"$i\"..."
exit 1
fi; } | dialog --backtitle "Linux Game Manager" \
--progressbox "Downloading \"$dest\" from \"$i\"" -1 -1
fi; } | ui_progressbox "Linux Game Manager" "Downloading \"$dest\" from \"$i\""
local downloadError=1
case "${dest##*.}" in
"pk3"|"zip")
unzip -tq "${cache}/${dest}" | dialog --backtitle "Linux Game Manager" \
--progressbox "Validating ${dest##*.} file" -1 -1 --stdout
unzip -tq "${cache}/${dest}" | ui_progressbox "Linux Game Manager" "Validating ${dest##*.} file"
downloadError=$?
;;
"7z")
7z t "${cache}/${dest}" | dialog --backtitle "Linux Game Manager" \
--progressbox "Validating 7z file" -1 -1 --stdout
7z t "${cache}/${dest}" | ui_progressbox "Linux Game Manager" "Validating 7z file"
downloadError=$?
;;
"exe")
@@ -246,8 +499,7 @@ download() {
esac
if [[ $downloadError -ne 0 ]]; then
rm -fv "${cache}/${dest}"
dialog --backtitle "Linux Game Manager" \
--infobox "Error downloading \"${dest}\". Installation cannot continue." -1 -1 --stdout
ui_infobox "Linux Game Manager" "Linux Game Manager" "Error downloading \"${dest}\". Installation cannot continue."
alert
exit 1
fi
@@ -259,6 +511,10 @@ download_named() {
# Required arguments: filename url
# Only works with one file at a time.
local dest="$1"
# Validate arguments
if [[ -z "$dest" ]] || [[ -z "$2" ]]; then
return 1
fi
# Remove the destination file if it is empty.
test -s "${cache}/${dest}" || rm -f "${cache}/${dest}" 2> /dev/null
if [[ "${redownload}" == "true" ]] && [[ -e "${cache}/${dest}" ]]; then
@@ -267,7 +523,7 @@ download_named() {
# Skip if the item is in cache.
test -e "${cache}/${dest}" && return
if ! curl -L4 --output "${cache}/${dest}" "${2}" ; then
echo "Could not download \"$dest\"..."
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Could not download \"$dest\"..."
exit 1
fi
}
@@ -287,49 +543,49 @@ get_installer() {
if echo "$2" | xclip -selection clipboard 2> /dev/null ; then
message+="\n\nThe URL has been copied to the clipboard."
fi
echo "Manual intervention required..."
alert
dialog --ok-label "Continue" \
--backtitle "Linux Game Manager" \
--msgbox "$message" -1 -1
ui_msgbox "Linux Game Manager" "Linux Game Manager" "$message"
# Search the Desktop and Downloads directories for the installation file
for i in ~/Downloads ~/Desktop ; do
find $i -type f -name "$1" -exec mv -v {} "${cache}/" \;
done
# If the file is still not available abort.
if [[ ! -f "${cache}/$1" ]]; then
echo "couldn't find $1. Please download the file and try again."
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Couldn't find $1. Please download the file and try again."
exit 1
fi
}
help() {
echo "${0##*/}"
echo "Released under the terms of the Common Public Attribution License Version 1.0"
echo -e "This is a Stormux project: https://stormux.org\n"
echo -e "Usage:\n"
echo "With no arguments, open the game launcher."
local help_text="${0##*/}\nReleased under the terms of the Common Public Attribution License Version 1.0\nThis is a Stormux project: https://stormux.org\n\nUsage:\n\nWith no arguments, open the game launcher.\n\n"
# Add command options
for i in "${!command[@]}" ; do
echo "-${i/:/ <parameter>}: ${command[${i}]}"
done | sort
echo
echo "Some settings that are often used can be stored in a settings.conf file."
echo "If wanted, place it at the following location:"
echo "${configFile%/*}/settings.conf"
echo "The syntax is variable=\"value\""
echo
echo "doomLanguage=\"en\" # 2 letter language code for translation."
echo "ipfsGateway=\"https://ipfs.stormux.org\" # Gateway to be used for ipfs downloads."
echo "noCache=\"true\" # Do not keep downloaded items in the cache."
echo "spd_module=\<module_name>\" # set speech-dispatcher module."
echo "spd_pitch=\<number>\" # set speech-dispatcher speech pitch."
echo "spd_rate=\<number>\" # set speech-dispatcher speech rate."
echo "spd_voice=\<voice_name>\" # set speech-dispatcher voice. Be sure module is correct."
echo "spd_volume=\<number>\" # set speech-dispatcher speech volume."
help_text+="-${i/:/ <parameter>}: ${command[${i}]}\n"
done
help_text+="\nSome settings that are often used can be stored in a settings.conf file.\nIf wanted, place it at the following location:\n${configFile%/*}/settings.conf\nThe syntax is variable=\"value\"\n\n"
help_text+="doomLanguage=\"en\" # 2 letter language code for translation.\n"
help_text+="ipfsGateway=\"https://ipfs.stormux.org\" # Gateway to be used for ipfs downloads.\n"
help_text+="noCache=\"true\" # Do not keep downloaded items in the cache.\n"
help_text+="spd_module=<module_name>\" # set speech-dispatcher module.\n"
help_text+="spd_pitch=<number>\" # set speech-dispatcher speech pitch.\n"
help_text+="spd_rate=<number>\" # set speech-dispatcher speech rate.\n"
help_text+="spd_voice=<voice_name>\" # set speech-dispatcher voice. Be sure module is correct.\n"
help_text+="spd_volume=<number>\" # set speech-dispatcher speech volume.\n\n"
help_text+="INSTALLER SCRIPT DIALOG FUNCTIONS:\n"
help_text+="ui_msgbox \"title\" \"backtitle\" \"message\" - Show information message\n"
help_text+="ui_yesno \"title\" \"backtitle\" \"question\" - Ask yes/no question\n"
help_text+="ui_inputbox \"title\" \"backtitle\" \"prompt\" \"default\" - Get text input\n"
help_text+="ui_menu \"title\" \"backtitle\" \"prompt\" option1 \"desc1\" ... - Show menu\n"
help_text+="ui_progressbox \"title\" \"text\" - Progress dialog for piped commands"
ui_msgbox "Linux Game Manager Help" "Linux Game Manager" "$help_text"
exit 0
}
# main script
@@ -360,17 +616,17 @@ game_installer() {
done
# If all games are installed, exit
if [[ ${#menuList[@]} -eq 0 ]]; then
echo "All games are already installed."
ui_msgbox "Linux Game Manager" "Linux Game Manager" "All games are already installed."
exit 0
fi
# Add donation option at the end
menuList+=("Donate" "Donate")
# Show game selection dialog
game="$(dialog --backtitle "Game Installer" \
--clear \
--no-tags \
--menu "Please select a game to install" 0 0 0 "${menuList[@]}" --stdout)"
game="$(ui_menu "Game Installer" "Game Installer" "Please select a game to install" "${menuList[@]}")"
# Handle selection
if [[ -z "$game" ]]; then
exit 0
fi
if [[ -n "$game" ]]; then
if [[ "$game" == "Donate" ]]; then
open_url "https://ko-fi.com/stormux"
@@ -382,9 +638,10 @@ game_installer() {
if [[ -f "$installScript" ]]; then
# Source and execute the install script
source "$installScript"
# Show success message
ui_msgbox "Game Installer" "Game Installer" "${game} has been installed."
else
dialog --backtitle "Game Installer" \
--msgbox "Installation script not found for ${game}" -1 -1
ui_msgbox "Game Installer" "Game Installer" "Installation script not found for ${game}"
exit 1
fi
fi
@@ -409,18 +666,19 @@ game_removal() {
fi
)
if [[ ${#menuList} -eq 0 ]]; then
dialog --backtitle "Linux Game Manager" \
--msgbox "No games found." -1 -1
ui_msgbox "Linux Game Manager" "Linux Game Manager" "No games found."
exit 0
fi
# Create the menu of installed games
# menuList has alternating full_path, display_name pairs
declare -a menuArgs
for ((i=0; i<${#menuList[@]}; i+=2)); do
menuArgs+=("${menuList[i]}" "${menuList[i+1]}")
done
local selectedGame
selectedGame=$(dialog --backtitle "Linux Game Manager" \
--clear \
--no-tags \
--menu "Please select a game to delete" 0 0 0 "${menuList[@]}" --stdout)
selectedGame=$(ui_menu "Linux Game Manager" "Linux Game Manager" "Please select a game to delete" "${menuArgs[@]}")
exitCode=$?
[[ $exitCode -ne 0 ]] && exit 0
[[ $exitCode -ne 0 ]] || [[ -z "$selectedGame" ]] && exit 0
# Get the actual game file paths
local gameName="${selectedGame##*/}"
gameName="${gameName%.sh}"
@@ -432,21 +690,21 @@ game_removal() {
gameInstallPath="${installPath}/${gameInstallPath%/*}"
if [[ -z "$gameInstallPath" ]] || [[ "${gameInstallPath%%/}" == "$installPath" ]]; then
# No install path found, just remove from list
dialog --backtitle "Linux Game Manager" \
--yesno "This will remove the game from your game list, but will not remove any files. Do you want to continue?" -1 -1 || exit 0
ui_yesno "Linux Game Manager" "Linux Game Manager" "This will remove the game from your game list, but will not remove any files. Do you want to continue?" || exit 0
# Remove only the .sh symlink
rm -fv "${0%/*}/.launch/${gameName}.sh" | \
dialog --backtitle "Linux Game Manager" \
--progressbox "Removing game from list..." -1 -1
ui_progressbox "Linux Game Manager" "Removing game from list..."
# Show success message
ui_msgbox "Linux Game Manager" "Linux Game Manager" "${gameName} has been removed from the list."
else
# Found install path, can remove game files
dialog --backtitle "Linux Game Manager" \
--yesno "This will remove the directory \"${gameInstallPath}\" and all of its contents. Do you want to continue?" -1 -1 || exit 0
ui_yesno "Linux Game Manager" "Linux Game Manager" "This will remove the directory \"${gameInstallPath}\" and all of its contents. Do you want to continue?" || exit 0
# Remove the game directory and symlink
{ rm -rfv "${gameInstallPath}"
rm -fv "${0%/*}/.launch/${gameName}.sh";
} | dialog --backtitle "Linux Game Manager" \
--progressbox "Removing game..." -1 -1
} | ui_progressbox "Linux Game Manager" "Removing game..."
# Show success message
ui_msgbox "Linux Game Manager" "Linux Game Manager" "${gameName} has been removed."
fi
exit 0
}
@@ -456,7 +714,7 @@ game_removal() {
game_update() {
mapfile -t lines < <(find .update -type f -iname '*.sh' 2> /dev/null)
if [[ ${#lines} -eq 0 ]]; then
echo "No games found."
ui_msgbox "Linux Game Manager" "Linux Game Manager" "No games found."
exit 0
fi
# Create the menu of updatable games
@@ -466,10 +724,7 @@ game_update() {
done
menuList+=("Donate" "Donate")
menuList+=("Become a Patron" "Become a Patron")
local game="$(dialog --backtitle "Audio Game Updater" \
--clear \
--no-tags \
--menu "Please select a game to update" 0 0 0 "${menuList[@]}" --stdout)"
local game="$(ui_menu "Audio Game Updater" "Audio Game Updater" "Please select a game to update" "${menuList[@]}")"
if [[ ${#game} -gt 0 ]]; then
if [[ "$game" == "Donate" ]]; then
open_url "https://ko-fi.com/stormux"
@@ -479,9 +734,16 @@ game_update() {
open_url "https://2mb.games/product/2mb-patron/"
exit 0
fi
# Get the game name for success message
local updateGameName="${game##*/}"
updateGameName="${updateGameName%.sh}"
source "${game}"
else
exit 0
fi
source "${game}"
run_update
# Show success message
ui_msgbox "Audio Game Updater" "Audio Game Updater" "${updateGameName} has been updated."
exit 0
}
@@ -501,17 +763,18 @@ game_launcher() {
fi
)
if [[ ${#menuList} -eq 0 ]]; then
dialog --backtitle "Linux Game Manager" \
--msgbox "No games found." 5 20
ui_msgbox "Linux Game Manager" "Linux Game Manager" "No games found."
exit 0
fi
# Create the menu of all games
selectedGame="$(dialog --backtitle "Linux Game Launcher" \
--clear \
--no-tags \
--menu "Please select a game to play" 0 0 0 "${menuList[@]}" --stdout)"
# Create the menu of all games
# menuList has alternating full_path, display_name pairs
declare -a menuArgs
for ((i=0; i<${#menuList[@]}; i+=2)); do
menuArgs+=("${menuList[i]}" "${menuList[i+1]}")
done
selectedGame="$(ui_menu "Linux Game Launcher" "Linux Game Launcher" "Please select a game to play" "${menuArgs[@]}")"
local menuCode=$?
if [[ $menuCode -eq 1 ]]; then
if [[ $menuCode -ne 0 ]] || [[ -z "$selectedGame" ]]; then
exit 0
fi
. "${selectedGame}"
@@ -535,11 +798,18 @@ migrate_launcher() {
done < <(sed '/^$/d' "${configFile}")
# Move the old config file and notify user
mv "${configFile}" "${configFile}.bak"
dialog --backtitle "Linux Game manager" --msgbox \
"Games have been converted to the new launch system.\nThe old game launch information has been moved to ${configFile}.bak\nIf everything works like you expect, feel free to delete ${configFile}" -1 -1
ui_msgbox "Linux Game Manager" "Linux Game manager" "Games have been converted to the new launch system.\nThe old game launch information has been moved to ${configFile}.bak\nIf everything works like you expect, feel free to delete ${configFile}"
}
# Detect dialog interface type BEFORE potentially setting DISPLAY
# This must happen before we modify DISPLAY to preserve console detection
if [[ -z "$DISPLAY" ]]; then
dialog_type="dialog"
else
dialog_type="yad"
fi
# If display isn't set assume we are launching from console and an X environment is running using display :0
# Warning, launching games from console is not recommended.
if [[ -z "$DISPLAY" ]]; then
@@ -572,11 +842,12 @@ requiredPackages=(
"7z"
"curl"
"dialog"
"yad"
"unzip"
)
for i in "${requiredPackages[@]}" ; do
if ! command -v $i > /dev/null 2>&1 ; then
echo "Please install ${i/7z/p7zip} before continuing."
if ! command -v "$i" > /dev/null 2>&1 ; then
ui_msgbox "Linux Game Manager" "Linux Game Manager" "Please install ${i/7z/p7zip} before continuing."
exit 1
fi
done
@@ -615,8 +886,7 @@ while getopts "${args}" i ; do
r) game_removal ;;
t)
gameCount=$(find .install -type f -iname "*.sh" | wc -l)
dialog --backtitle "Linux Game Manager" \
--infobox "There are currently ${gameCount} games available." -1 -1
ui_infobox "Linux Game Manager" "Linux Game Manager" "There are currently ${gameCount} games available."
exit 0
;;
u) game_update ;;