linux-game-manager/.scripts/FreeDoom.sh

127 lines
4.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Dialog setup:
DIALOG_ITEM_HELP=""
export DIALOGOPTS='--no-lines --visit-items'
# Path where doom wads are stored
doomPath="$(find /usr/share -type d -name "doom" 2> /dev/null | head -1)"
# Path to gzdoom.
gzdoom="$(command -v gzdoom)"
# Version of the accessibility mod
tobyVersion="6-1"
doomGames=(
# Unmodified Doom with accessibility.
"${doomPath}/TobyAccMod_V${tobyVersion}.pk3" "Freedoom"
# Toby accessibility mods
"${doomPath}/TobyAccMod_V${tobyVersion}.pk3 ${doomPath}/TobyDoomLevels.wad" "Freedoom Toby Delux Map Pack"
# OperationMDK
"${doomPath}/TobyAccMod_V${tobyVersion}.pk3 ${doomPath}/OpMDK.wad" "Freedoom OperationMDK"
)
grepStrings=(
'-E'
'-e' '^[0-9]+\. '
'-e' '^"cl_run"'
'-e' '^Game saved. '
'-e' '^A secret is revealed!$'
'-e' '^MAP[0-9]*'
'-e' '^Player[: ]'
'-e' '^Please select a game wad \(or 0 to exit\):'
'-e' '^You have no keys in your pocket!$'
)
sedStrings=(
'-e' 's/"cl_run" = "true"/run/'
'-e' 's/"cl_run" = "false"/walk/'
'-e' 's/MAP0\([1-9]\)/Map \1/'
'-e' 's:.*/:Game saved. (:'
)
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=$?
if [[ -e "${doomPath}/DoomMetalVol6.wad" ]]; then
gameOption+=" ${doomPath}/DoomMetalVol6.wad"
fi
set -o pipefail
case ${buttonCode} in
1)
# Death match setup
dialog --backtitle "Death Match" \
--clear \
--msgbox "Coming soon!" -1 -1 --stdout
exit 1
;;
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=("${doomPath}/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=(
"${doomPath}/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
exec stdbuf -oL ${gzdoom} ${gameOption} "${flags[@]}" | while IFS= read -r l ; do echo "$l" | { grep "${grepStrings[@]}" | sed "${sedStrings[@]}" | spd-say -e; } || echo "$l";done
;;
0)
exec stdbuf -oL ${gzdoom} ${gameOption} | while IFS= read -r l ; do echo "$l" | { grep "${grepStrings[@]}" | sed "${sedStrings[@]}" | spd-say -e; } || echo "$l";done
;;
esac
exit 0