Compare commits
No commits in common. "91d1e2909299c820e43e9afc4e47297118b6468e" and "771fe5d956ef1da4e62522ed9577929ca82100f0" have entirely different histories.
91d1e29092
...
771fe5d956
@ -1,11 +1,417 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
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
|
||||
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")"
|
||||
else
|
||||
git -C "${gamePath}/toby-doom-launcher" pull
|
||||
export gzdoom="$(command -v gzdoom)"
|
||||
fi
|
||||
"toby-doom-launcher/Toby Doom Launcher.py"
|
||||
|
||||
# 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
|
||||
|
124
.launch/TobyCustom/'
Normal file
124
.launch/TobyCustom/'
Normal file
@ -0,0 +1,124 @@
|
||||
#!/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
|
23
.launch/TobyCustom/.dependencies
Normal file
23
.launch/TobyCustom/.dependencies
Normal file
@ -0,0 +1,23 @@
|
||||
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
|
||||
}
|
30
.launch/TobyCustom/.mapmenu
Executable file
30
.launch/TobyCustom/.mapmenu
Executable file
@ -0,0 +1,30 @@
|
||||
# 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
|
25
.launch/TobyCustom/ArmyOfDarknessDoom.sh
Executable file
25
.launch/TobyCustom/ArmyOfDarknessDoom.sh
Executable file
@ -0,0 +1,25 @@
|
||||
#!/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')
|
121
.launch/TobyCustom/Custom_Death_Match.sh
Executable file
121
.launch/TobyCustom/Custom_Death_Match.sh
Executable file
@ -0,0 +1,121 @@
|
||||
#!/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"
|
||||
)
|
27
.launch/TobyCustom/GoMidievilOnTheirAss.sh
Executable file
27
.launch/TobyCustom/GoMidievilOnTheirAss.sh
Executable file
@ -0,0 +1,27 @@
|
||||
#!/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=(
|
||||
'+Toby_NarrationOutputType 2'
|
||||
'+pb_exaggeratedrecoil false'
|
||||
'+pb_weapon_recoil_mod_horizontal 0'
|
||||
'+pb_weapon_recoil_mod_vertical 0'
|
||||
'+vertspread true'
|
||||
'+Toby_SnapToTargetTargetingMode' '1'
|
||||
'+Toby_UniversalBeacon_UseUniversalSounds' 'true'
|
||||
)
|
35
.launch/TobyCustom/Project_Brutality.sh
Executable file
35
.launch/TobyCustom/Project_Brutality.sh
Executable file
@ -0,0 +1,35 @@
|
||||
#!/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'
|
||||
)
|
34
.launch/TobyCustom/Project_BrutalityLatest.sh
Executable file
34
.launch/TobyCustom/Project_BrutalityLatest.sh
Executable file
@ -0,0 +1,34 @@
|
||||
#!/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'
|
||||
)
|
14
.launch/TobyCustom/README.ProjectBrutality
Normal file
14
.launch/TobyCustom/README.ProjectBrutality
Normal file
@ -0,0 +1,14 @@
|
||||
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]
|
13
.launch/TobyCustom/StarWars.sh
Executable file
13
.launch/TobyCustom/StarWars.sh
Executable file
@ -0,0 +1,13 @@
|
||||
#!/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
|
40
.launch/TobyCustom/WolfenDoom.sh
Executable file
40
.launch/TobyCustom/WolfenDoom.sh
Executable file
@ -0,0 +1,40 @@
|
||||
#!/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*_"*
|
||||
"$gamePath/Addons/DOOM/TobyV*_"*"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'
|
||||
'+Toby_SnapToTargetTargetingMode' '1'
|
||||
'+Toby_UniversalBeacon_UseUniversalSounds' 'true'
|
||||
)
|
88
.launch/yadoom
Executable file
88
.launch/yadoom
Executable file
@ -0,0 +1,88 @@
|
||||
#!/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[@]}"
|
Loading…
Reference in New Issue
Block a user