#!/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="7-0" 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 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 pushd "${doomPath}" 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) pushd "${doomPath}" exec stdbuf -oL ${gzdoom} ${gameOption} | while IFS= read -r l ; do echo "$l" | { grep "${grepStrings[@]}" | sed "${sedStrings[@]}" | spd-say -e > /dev/null 2>&1; }; echo "$l";done ;; esac exit 0