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