#!/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