From 7f08c41d9d0deea97892b4c68e647dc928f5b705 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Fri, 10 Jan 2025 13:30:35 -0500 Subject: [PATCH] Initial commit. --- README.md | 149 +- Requirements.txt | 4 + Toby Doom Launcher.py | 1720 +++++++++++++++++++++++ Toby Doom Launcher.spec | 44 + TobyCustom/' | 124 ++ TobyCustom/ArmyOfDarknessDoom.json | 24 + TobyCustom/GoMidievilOnTheirAss.json | 27 + TobyCustom/Project_Brutality.json | 32 + TobyCustom/Project_BrutalityLatest.json | 31 + TobyCustom/README.ProjectBrutality | 14 + TobyCustom/StarWarsjson | 17 + TobyCustom/WolfenDoom.json | 44 + dist/_internal/nvdaControllerClient.dll | Bin 0 -> 246176 bytes 13 files changed, 2228 insertions(+), 2 deletions(-) create mode 100644 Requirements.txt create mode 100755 Toby Doom Launcher.py create mode 100644 Toby Doom Launcher.spec create mode 100644 TobyCustom/' create mode 100644 TobyCustom/ArmyOfDarknessDoom.json create mode 100644 TobyCustom/GoMidievilOnTheirAss.json create mode 100644 TobyCustom/Project_Brutality.json create mode 100644 TobyCustom/Project_BrutalityLatest.json create mode 100644 TobyCustom/README.ProjectBrutality create mode 100644 TobyCustom/StarWarsjson create mode 100644 TobyCustom/WolfenDoom.json create mode 100644 dist/_internal/nvdaControllerClient.dll diff --git a/README.md b/README.md index 7070f7f..1a235f0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,148 @@ -# toby-doom-launcher +# Toby Doom Launcher -Launcher for the Toby Doom Accessibility project. \ No newline at end of file +The Toby Doom Launcher is a game launcher designed to help players easily configure and start various Doom-based games using the Toby Doom Accessibility Mod. + +## Quick Start + +1. Download the [Windows package](https://stormux.org/downloads/toby_doom_launcher.zip) or install dependencies for running from source +2. Place the launcher in your Toby Doom Accessibility Mod directory +3. Select your IWAD and game variant +4. Choose your narration style and start playing! + +## Features + +- Support for multiple game variants including Classic Doom, Toby Doom, Heretic, and Hexen +- Single-player, deathmatch, and co-op gameplay modes +- Custom game configuration support +- Built-in audio manual player +- Text-to-speech integration for game feedback + +## System Requirements + +When running from source: +- GZDoom 4.9 or higher +- Python 3.9 or higher +- PySide6 6.0 or higher +- VLC media player (for audio manual) +- Required speech providers: + - Windows: Accessible Output 2 + - Linux: Speech Dispatcher or Cthulhu + - Mac: Support planned for future release + +The Windows package includes all required dependencies except GZDoom and VLC. + +## Installation - Linux + +1. Install required dependencies from your distribution's package manager +2. Extract Toby Doom to ~/.local/games/doom +3. The launcher itself can run from anywhere on the system +4. The TobyCustom directory can be placed in any of these locations: + - Same directory as the launcher + - ~/.local/games/doom/TobyCustom + - ~/.local/share/doom/TobyCustom +5. Additional IWADs can be placed in ~/.local/share/doom + +## Installation - Mac + +Mac support is planned for a future release. Currently, the launcher has not been tested on macOS. + +## Installation - Windows + +Using the pre-packaged version: +1. Download the [launcher package](https://stormux.org/downloads/toby_doom_launcher.zip) +2. Extract it to the top level of your Toby Accessibility Mod directory +3. Install VLC media player if you want to use the audio manual +4. For multiplayer, download [freedm](https://github.com/freedoom/freedoom/releases/download/v0.13.0/freedm-0.13.0.zip) and place freedm.wad in the Toby Doom Accessibility Mod directory + +Running from source: +1. Install Python 3.9 or higher +2. Install PySide6 (`pip install PySide6`) +3. Install other required Python packages +4. Place the launcher in the top level of the Toby Accessibility Mod directory + +## Usage + +### Basic Navigation + +- Use Tab and Shift+Tab to move between controls +- Use arrow keys to navigate combo boxes +- Press Enter to activate buttons +- Press Escape to close dialogs or exit the launcher + +### Important Note for NVDA Users on Windows + +When using NVDA, you may need to press Alt+DownArrow to expand combo boxes if they don't respond to the normal arrow keys. + +### Game Selection + +1. Choose your IWAD from the dropdown menu +2. Select your desired game variant +3. Choose your preferred narration style (Self-voiced or Text to Speech) +4. Select your gameplay mode: + - Single Player: Start a solo game + - Deathmatch: Configure and start a multiplayer deathmatch + - Custom Deathmatch: Play deathmatch with custom modifications + - Co-op: Set up or join a cooperative multiplayer game + +### Multiplayer Setup + +#### Deathmatch +- Select arena map +- Configure options like frag limit, player count, and skill level +- Choose between hosting, joining, or playing with bots +- When playing with bots, use the console (`) to add bots with the "addbot" command + +#### Co-op +- Host or join a cooperative game +- Set player count and skill level +- Uses universal keyshare for better cooperative gameplay + +### Audio Manual + +The launcher includes an accessible audio manual player with these features: +- Browse and select manual sections +- Full keyboard control for playback +- Play individual tracks or entire manual +- Previous/Next track navigation +- Requires VLC media player for audio playback + +## File Organization + +The launcher expects the following directory structure: + +``` +/ +â TobyAccMod_V[version].pk3 +â Addons/ +â â MAPS/ +â â MENU/ +â â [Game-specific folders]/ +â Manual/ +â TobyCustom/ +``` + +## Customization + +Custom games can be configured using JSON files in the TobyCustom directory. This allows for: +- Custom game configurations +- Additional WAD and PK3 file loading +- Special launch parameters +- Dependency management + +## Troubleshooting + +- If GZDoom fails to launch, verify the executable is in your PATH or game directory +- For multiplayer, ensure freedm.wad is available in your game directory +- Check file permissions if unable to save narration settings +- Verify VLC is installed if audio manual playback fails +- Ensure speech providers are properly configured for your platform + +## Additional Resources + +- [MrAlanD1's Youtube Channel](https://www.youtube.com/@MrAlanD1) +- [Toby Doom topic on the zdoom forum](https://forum.zdoom.org/viewtopic.php?t=71349&hilit=toby+accessibility&sid=f874cf335c6bbb63ef4408610ae9fe5b) +- The Stormux email list, join at + +## License + +This software is distributed under the GNU Lesser General Public License v3.0 (LGPL-3.0). diff --git a/Requirements.txt b/Requirements.txt new file mode 100644 index 0000000..8b077ee --- /dev/null +++ b/Requirements.txt @@ -0,0 +1,4 @@ +accessible_output2 +PySide6>=6.0.0 +python-vlc +setproctitle>=1.2.0 diff --git a/Toby Doom Launcher.py b/Toby Doom Launcher.py new file mode 100755 index 0000000..3373cd8 --- /dev/null +++ b/Toby Doom Launcher.py @@ -0,0 +1,1720 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (c) 2024 Stormux +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3 of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program; if not, write to the +# Free Software Foundation, Inc., Franklin Street, Fifth Floor, +# Boston MA 02110-1301 USA. + + +# ======= Version Configuration ======= +# Update version number here for new releases of Toby Doom Accessibility Mod +# Example: 8.0 for version 8.0, 8.5 for version 8.5, etc + +TOBY_VERSION_NUMBER = 8.0 + +# DO NOT EDIT ANYTHING BELOW THIS LINE! +# =================================== + + +import configparser +import json +import sys +import os +import re +import subprocess +import time +import platform +import shutil +import glob +import threading +from pathlib import Path +from typing import Final, List, Dict, Optional, Tuple +from setproctitle import setproctitle +from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout, + QComboBox, QPushButton, QLabel, QSpinBox, QMessageBox, QLineEdit, QDialog, + QDialogButtonBox, QRadioButton) +from PySide6.QtCore import Qt, QTimer +import webbrowser + +# Initialize speech provider based on platform +if platform.system() == "Windows": + # Set up DLL paths for Windows + if getattr(sys, 'frozen', False): + # If running as compiled executable + dllPath = os.path.join(sys._MEIPASS, 'lib') + if os.path.exists(dllPath): + os.add_dll_directory(dllPath) + # Also add the executable's directory + os.add_dll_directory(os.path.dirname(sys.executable)) + + # Sound playback for audio manual on Windows + # Initialize Windows speech provider + try: + import accessible_output2.outputs.auto + s = accessible_output2.outputs.auto.Auto() + speechProvider = "accessible_output2" + except ImportError as e: + print(f"Failed to initialize accessible_output2: {e}") + sys.exit() +else: + # Linux/Mac path + try: + output = subprocess.check_output(["pgrep", "cthulhu"]) + speechProvider = "cthulhu" + except (subprocess.CalledProcessError, FileNotFoundError): + try: + import accessible_output2.outputs.auto + s = accessible_output2.outputs.auto.Auto() + speechProvider = "accessible_output2" + except ImportError as e: + try: + import speechd + spd = speechd.Client() + speechProvider = "speechd" + except ImportError: + print("No speech providers found.") + sys.exit() + + +class AccessibleComboBox(QComboBox): + """ComboBox with enhanced keyboard navigation""" + def __init__(self, parent=None): + super().__init__(parent) + self.setEditable(True) + self.lineEdit().setReadOnly(True) + self.pageStep = 5 # Number of items to jump for page up/down + + def keyPressEvent(self, event): + currentIndex = self.currentIndex() + itemCount = self.count() + + if event.key() == Qt.Key_PageUp: + newIndex = max(0, currentIndex - self.pageStep) + self.setCurrentIndex(newIndex) + elif event.key() == Qt.Key_PageDown: + newIndex = min(itemCount - 1, currentIndex + self.pageStep) + self.setCurrentIndex(newIndex) + elif event.key() == Qt.Key_Home: + self.setCurrentIndex(0) + # Force update and focus events + self.setFocus() + self.currentIndexChanged.emit(0) + self.activated.emit(0) + elif event.key() == Qt.Key_End: + lastIndex = itemCount - 1 + self.setCurrentIndex(lastIndex) + # Force update and focus events + self.setFocus() + self.currentIndexChanged.emit(lastIndex) + self.activated.emit(lastIndex) + else: + super().keyPressEvent(event) + + +class SpeechHandler: + """Handles text-to-speech processing for game output""" + + # Class-level constants for patterns + FILTER_PATTERNS = [ + r'^----+$', + r'^$', + r'^[0-9]', + r'^P_StartScript:', + r'^(Facing |fluidsynth|INTRO|MAP[0-9]+|Music "|Unknown)', + r'^(\[Toby Accessibility Mod\] )?READ.*', + r'^ *TITLEMAP', + r'^\[Toby Accessibility Mod\] (INTRO|READMe)([0-9]+).*', + r'key card', + r'^New PDA Entry:', + r"^(As |Computer Voice:|Holy|I |I've|Monorail|Sector |Ugh|What|Where)", + r'Script warning, "', + r'Tried to define' + ] + + TEXT_REPLACEMENTS = [ + (r'^\[Toby Accessibility Mod\] M_', r'[Toby Accessibility Mod] '), + (r'^\[Toby Accessibility Mod\] ', r''), + (r'^MessageBoxMenu$', r'Confirmation menu: Press Y for yes or N for no'), + (r'^Mainmenu$', r'Main menu'), + (r'^Skillmenu$', r'Difficulty menu'), + (r'^Episodemenu$', r'Episode menu'), + (r'^NGAME$', r'New game'), + (r'^(LOAD|SAVE|QUIT)G$', r'\1 game'), + (r'"cl_run" = "true"', r'run'), + (r'"cl_run" = "false"', r'walk'), + (r'UAC', r'U A C'), + (r'^\+', r''), + (r' ?\*+ ?', r'') + ] + + def __init__(self): + """Initialize the speech handler""" + self.platform = platform.system() + + # Compile all regex patterns once at initialization + self.filterPatterns = [re.compile(pattern) for pattern in self.FILTER_PATTERNS] + self.textReplacements = [(re.compile(pattern), repl) + for pattern, repl in self.TEXT_REPLACEMENTS] + + def speak(self, text: str) -> None: + """Speak text using available speech method""" + if not text: + return + + if speechProvider == "speechd": + spd.cancel() + spd.speak(text) + elif speechProvider == "accessible_output2": + s.speak(text, interrupt=True) + else: # Cthulhu + try: + process = subprocess.Popen( + ["socat", "-", "UNIX-CLIENT:/tmp/cthulhu.sock"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) + process.communicate(input=text) + except Exception as e: + print(f"Cthulhu error: {e}", file=sys.stderr) + + def process_line(self, line: str) -> Optional[str]: + """Process a line of game output for speech""" + # Skip empty lines + if not line.strip(): + return None + + # Check if line should be filtered out + for pattern in self.filterPatterns: + if pattern.search(line): + return None + + # Apply replacements + processedLine = line + for pattern, repl in self.textReplacements: + processedLine = pattern.sub(repl, processedLine) + + return processedLine.strip() if processedLine.strip() else None + + def speak_thread(self, process: subprocess.Popen): + """Thread to handle speech processing""" + startSpeech = False # Don't start speaking until after initial output + + while True: + try: + line = process.stdout.readline() + # Keep gzdoom's existing functionality of lines being printed to the console. + print(line, end='') + if not line: + break + + lineStr = line.strip() + + # Wait for the initial separator before starting speech + if not startSpeech: + if lineStr and all(c == '-' for c in lineStr): + startSpeech = True + continue + + processedLine = self.process_line(lineStr) + if processedLine: + self.speak(processedLine) + + except Exception as e: + print(f"Error processing game output: {e}", file=sys.stderr) + break + + +class MenuDialog(QDialog): + """Dialog for game configuration options""" + + def __init__(self, title: str, options: Dict[str, dict], parent=None): + super().__init__(parent) + self.setWindowTitle(title) + self.dialogOptions = options + self.init_dialog_ui() + + def init_dialog_ui(self): + """Initialize the dialog UI components""" + dialogLayout = QVBoxLayout(self) + + for key, opt in self.dialogOptions.items(): + if opt['type'] == 'radio': + dialogWidget = QRadioButton(opt['label']) + elif opt['type'] == 'spinbox': + # Create label first + label = QLabel(opt['label']) + dialogWidget = QSpinBox() + dialogWidget.setRange(opt['min'], opt['max']) + dialogWidget.setValue(opt.get('default', opt['min'])) + # Set accessibility label + dialogWidget.setAccessibleName(opt['label']) + # Add label to layout first + dialogLayout.addWidget(label) + elif opt['type'] == 'text': + dialogWidget = QLineEdit() + dialogWidget.setPlaceholderText(opt['placeholder']) + elif opt['type'] == 'combobox': + dialogWidget = AccessibleComboBox() + dialogWidget.addItems(opt['items']) + dialogLayout.addWidget(QLabel(opt['label'])) + else: + continue + + setattr(self, f"{key}_widget", dialogWidget) + dialogLayout.addWidget(dialogWidget) + + dialogButtons = QDialogButtonBox( + QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + dialogButtons.accepted.connect(self.accept) + dialogButtons.rejected.connect(self.reject) + dialogLayout.addWidget(dialogButtons) + + def get_dialog_values(self) -> dict: + """Get the current values from all dialog widgets""" + values = {} + for key in self.dialogOptions.keys(): + widget = getattr(self, f"{key}_widget") + if isinstance(widget, QSpinBox): + values[key] = widget.value() + elif isinstance(widget, QComboBox): + values[key] = widget.currentText() + elif isinstance(widget, QRadioButton): + values[key] = widget.isChecked() + else: + values[key] = widget.text() + return values + + +class AudioPlayer: + """Handles cross-platform audio playback using VLC if available""" + + def __init__(self): + self.currentTrack = None + self.currentIndex = -1 + self.isPlaying = False + self.playAllMode = False + self.tracks = [] + self.vlcAvailable = False + + # State monitoring timer + self.stateTimer = QTimer() + self.stateTimer.setInterval(500) # Check every 500ms + self.stateTimer.timeout.connect(self.checkPlayerState) + + try: + import vlc + self.instance = vlc.Instance() + self.player = self.instance.media_player_new() + # Store VLC states we care about + self.State_Ended = vlc.State.Ended + self.State_Error = vlc.State.Error + self.State_Playing = vlc.State.Playing + self.vlcAvailable = True + except Exception as e: + print(f"VLC not available: {e}", file=sys.stderr) + self.instance = None + self.player = None + + def checkPlayerState(self): + """Monitor VLC player state""" + if not self.vlcAvailable or not self.player or not self.isPlaying: + return + + try: + state = self.player.get_state() + + # Check for end states + if state in (self.State_Ended, self.State_Error): + print(f"Track ended (state: {state})") + self.isPlaying = False + self.stateTimer.stop() + + if self.playAllMode and self.currentIndex < len(self.tracks) - 1: + self.currentIndex += 1 + self.play() + + except Exception as e: + print(f"Error checking player state: {e}", file=sys.stderr) + + def loadTracks(self, files): + """Load list of tracks to play""" + if not self.vlcAvailable: + return + self.tracks = [str(f) for f in files] + self.currentIndex = 0 if self.tracks else -1 + print(f"Loaded tracks: {self.tracks}") + + def play(self): + """Play current track""" + if not self.vlcAvailable: + return False + + if self.currentIndex >= 0 and self.currentIndex < len(self.tracks): + self.stop() # Stop any current playback first + self.currentTrack = self.tracks[self.currentIndex] + try: + print(f"Attempting to play: {self.currentTrack}") + media = self.instance.media_new(self.currentTrack) + self.player.set_media(media) + result = self.player.play() + if result == 0: # VLC returns 0 on success + self.isPlaying = True + self.stateTimer.start() # Start state monitoring + return True + else: + print(f"VLC play() returned error: {result}", file=sys.stderr) + return False + except Exception as e: + print(f"Playback error: {e}", file=sys.stderr) + self.isPlaying = False + return False + return False + + def stop(self): + """Stop playback""" + if not self.vlcAvailable: + return + + if self.player and self.isPlaying: + try: + self.stateTimer.stop() # Stop state monitoring + self.player.stop() + self.isPlaying = False + print("Playback stopped") + except Exception as e: + print(f"Stop error: {e}", file=sys.stderr) + + def nextTrack(self): + """Move to next track""" + if not self.vlcAvailable: + return False + + if self.currentIndex < len(self.tracks) - 1: + self.stop() + self.currentIndex += 1 + return True + return False + + def previousTrack(self): + """Move to previous track""" + if not self.vlcAvailable: + return False + + if self.currentIndex > 0: + self.stop() + self.currentIndex -= 1 + return True + return False + + def getCurrentTrackName(self): + """Get current track name""" + if not self.vlcAvailable: + return "" + + if self.currentTrack: + return Path(self.currentTrack).stem + return "" + + +class AudioManualDialog(QDialog): + """Dialog for audio manual playback""" + def __init__(self, manualPath, parent=None): + super().__init__(parent) + self.manualPath = manualPath + self.audioPlayer = AudioPlayer() + + # Show warning if VLC not available + if not self.audioPlayer.vlcAvailable: + QMessageBox.warning(self, "VLC Not Found", + "VLC is required for Audio Manual playback. Please install VLC media player. If running from source, also install python-vlc.") + self.close() + return + + # Create update timer for checking playback state + self.stateTimer = QTimer(self) + self.stateTimer.timeout.connect(self.checkPlaybackState) + self.stateTimer.start(500) # Check every 500ms + + self.initUI() + + +class AudioManualDialog(QDialog): + """Dialog for audio manual playback""" + def __init__(self, manualPath, parent=None): + super().__init__(parent) + self.manualPath = manualPath + self.audioPlayer = AudioPlayer() + + # Create update timer for checking playback state + self.stateTimer = QTimer(self) + self.stateTimer.timeout.connect(self.checkPlaybackState) + self.stateTimer.start(500) # Check every 500ms + + self.initUI() + + def checkPlaybackState(self): + """Periodically check playback state and update UI""" + if not self.audioPlayer.isPlaying and self.stopButton.isEnabled(): + self.updateButtonStates() + + def initUI(self): + """Initialize the dialog UI""" + self.setWindowTitle("Audio Manual") + layout = QVBoxLayout(self) + + # Manual selection + manualLabel = QLabel("Select Manual:") + self.manualCombo = AccessibleComboBox() + self.manualCombo.setAccessibleName("Manual Selection") + self.populateManuals() + layout.addWidget(manualLabel) + layout.addWidget(self.manualCombo) + + # Track selection + trackLabel = QLabel("Select Track:") + self.trackCombo = AccessibleComboBox() + self.trackCombo.setAccessibleName("Track Selection") + layout.addWidget(trackLabel) + layout.addWidget(self.trackCombo) + + # Create buttons + buttonLayout = QHBoxLayout() + self.prevButton = QPushButton("Previous") + self.playButton = QPushButton("Play") + self.stopButton = QPushButton("Stop") + self.nextButton = QPushButton("Next") + + # Setup focus and keyboard interaction + self.manualCombo.setFocusPolicy(Qt.StrongFocus) + self.trackCombo.setFocusPolicy(Qt.StrongFocus) + # Allow Enter key to play selected track + self.trackCombo.lineEdit().returnPressed.connect(self.playAudio) + + # Set keyboard shortcuts and accessibility for buttons + self.prevButton.setShortcut("Left") + self.playButton.setShortcut("Space") + self.stopButton.setShortcut("S") + self.nextButton.setShortcut("Right") + + # Set accessible names for buttons + self.prevButton.setAccessibleName("Previous Track") + self.playButton.setAccessibleName("Play Track") + self.stopButton.setAccessibleName("Stop Playback") + self.nextButton.setAccessibleName("Next Track") + + # Connect button signals + self.prevButton.clicked.connect(self.previousTrack) + self.playButton.clicked.connect(self.playAudio) + self.stopButton.clicked.connect(self.stopAudio) + self.nextButton.clicked.connect(self.nextTrack) + + # Add buttons to layout + buttonLayout.addWidget(self.prevButton) + buttonLayout.addWidget(self.playButton) + buttonLayout.addWidget(self.stopButton) + buttonLayout.addWidget(self.nextButton) + layout.addLayout(buttonLayout) + + # Status label + self.statusLabel = QLabel("") + self.statusLabel.setAccessibleName("Playback Status") + layout.addWidget(self.statusLabel) + + # Update tracks when manual changes + self.manualCombo.currentTextChanged.connect(self.populateTracks) + + # Close button + closeButton = QPushButton("Close") + closeButton.setAccessibleName("Close Dialog") + closeButton.setShortcut("Escape") + closeButton.clicked.connect(self.close) + layout.addWidget(closeButton) + + # Initial setup + self.populateTracks() + self.updateButtonStates() + + def closeEvent(self, event): + """Handle dialog close event""" + self.stateTimer.stop() + self.audioPlayer.stop() + super().closeEvent(event) + + def populateManuals(self): + """Populate manual selection combo box""" + manualDirs = sorted([d for d in self.manualPath.iterdir() if d.is_dir()]) + self.manualCombo.addItems([m.name for m in manualDirs]) + + def populateTracks(self): + """Populate track selection combo box""" + self.trackCombo.clear() + selectedManual = self.manualPath / self.manualCombo.currentText() + if selectedManual.exists(): + tracks = sorted(selectedManual.glob('*.mp3')) + self.trackCombo.addItem("Play All") + self.trackCombo.addItems([t.stem for t in tracks]) + # Update button states after populating tracks + self.updateButtonStates() + + def playAudio(self): + """Start audio playback""" + if not self.manualCombo.currentText() or not self.trackCombo.currentText(): + return + + selectedManual = self.manualPath / self.manualCombo.currentText() + selectedTrack = self.trackCombo.currentText() + + # Stop any current playback + self.audioPlayer.stop() + self.audioPlayer.playAllMode = selectedTrack == "Play All" + + if selectedTrack == "Play All": + # Get sorted list of MP3 files + tracks = sorted(selectedManual.glob('*.mp3')) + print(f"Loading {len(tracks)} tracks for Play All") + self.audioPlayer.loadTracks([str(t) for t in tracks]) + else: + print("Loading single track") + tracks = [selectedManual / f"{selectedTrack}.mp3"] + self.audioPlayer.loadTracks([str(t) for t in tracks]) + + # Start playback + if self.audioPlayer.play(): + self.statusLabel.setText(f"Playing: {self.audioPlayer.getCurrentTrackName()}") + else: + self.statusLabel.setText("Playback error") + self.updateButtonStates() + + def stopAudio(self): + """Stop audio playback""" + self.audioPlayer.playAllMode = False # Reset play all flag + self.audioPlayer.stop() + self.statusLabel.setText("Playback stopped") + self.updateButtonStates() + + def nextTrack(self): + """Play next track""" + if self.audioPlayer.nextTrack(): + if self.audioPlayer.play(): + self.statusLabel.setText(f"Playing: {self.audioPlayer.getCurrentTrackName()}") + else: + self.statusLabel.setText("Playback error") + self.updateButtonStates() + + def previousTrack(self): + """Play previous track""" + if self.audioPlayer.previousTrack(): + if self.audioPlayer.play(): + self.statusLabel.setText(f"Playing: {self.audioPlayer.getCurrentTrackName()}") + else: + self.statusLabel.setText("Playback error") + self.updateButtonStates() + + def updateButtonStates(self): + """Update button enabled states""" + trackCount = len(self.audioPlayer.tracks) + hasMultipleTracks = trackCount > 1 + isFirst = self.audioPlayer.currentIndex <= 0 + isLast = self.audioPlayer.currentIndex >= trackCount - 1 + + # Enable play button if we have any tracks selected or available + hasTrackSelected = (self.trackCombo.count() > 0 and self.trackCombo.currentText()) or trackCount > 0 + + # Allow navigation during playback for Play All mode + self.prevButton.setEnabled(hasMultipleTracks and not isFirst) + self.nextButton.setEnabled(hasMultipleTracks and not isLast) + self.playButton.setEnabled(hasTrackSelected and not self.audioPlayer.isPlaying) + self.stopButton.setEnabled(self.audioPlayer.isPlaying) + + +class IWADSelector: + """Handles IWAD file detection and selection""" + + def __init__(self): + if platform.system() == "Windows": + self.configFile = Path.cwd() / 'TobyConfig.ini' + else: + self.configFile = Path(os.getenv('XDG_CONFIG_HOME', Path.home() / '.config')) / 'gzdoom/gzdoom.ini' + self.wadPaths = self._get_wad_paths() + + def _get_wad_paths(self) -> List[str]: + """Extract IWAD search paths from GZDoom config""" + if not self.configFile.exists(): + print("Config file not found") + return [] + + try: + # Read the file directly to handle duplicate keys + paths = [] + currentSection = None + with open(self.configFile, 'r') as f: + for line in f: + line = line.strip() + if line.startswith('['): + currentSection = line[1:-1] + elif currentSection == 'IWADSearch.Directories' and '=' in line: + key, value = line.split('=', 1) + if key.strip().lower().startswith('path'): + value = value.strip() + # Handle special paths + if value == '$DOOMWADDIR' or value == '$PROGDIR': + continue # Skip these as they're GZDoom internal + elif value == '$HOME': + value = str(Path.home()) + paths.append(value) + + except Exception as e: + print(f"Error reading config: {e}", file=sys.stderr) + + # Additional paths to check + if platform.system() == "Windows": + paths.append(str(Path.cwd())) + else: + paths.append(str(Path("/usr/share/doom"))) + paths.append(str(Path("/usr/share/games/doom"))) + paths.append(str(Path.home() / ".local/games/doom")) + paths.append(str(Path.home() / ".local/share/doom")) + return paths + + def is_iwad(self, file_path: str) -> bool: + """Check if a file is an IWAD or IPK3""" + path = Path(file_path) + if path.suffix.lower() == '.ipk3': + return True + + try: + with open(file_path, 'rb') as f: + header = f.read(4) + return header == b'IWAD' + except Exception: + return False + + def find_iwads(self) -> Dict[str, str]: + """Find all available IWADs in configured paths""" + uniqueWads = {} + + for path in self.wadPaths: + wadDir = Path(path) + if not wadDir.is_dir(): + continue + + # Only look at files directly in the directory, not subdirectories + for wadFile in wadDir.iterdir(): + if wadFile.is_file(): + # Check if it's a WAD or IPK3 file + if wadFile.suffix.lower() in ['.wad', '.iwad']: + if self.is_iwad(str(wadFile)): + wadName = wadFile.stem.lower() + uniqueWads[wadName] = str(wadFile) + elif wadFile.suffix.lower() == '.ipk3': + if self.is_iwad(str(wadFile)): + wadName = wadFile.stem.lower() + uniqueWads[wadName] = str(wadFile) + + return uniqueWads + + +class CustomGameDialog(QDialog): + """Dialog for selecting and configuring custom games""" + def __init__(self, customGames: Dict[str, dict], parent=None): + super().__init__(parent) + self.setWindowTitle("Custom Game Selection") + self.customGames = customGames + + # Create layout + layout = QVBoxLayout(self) + + # Game selection combobox + label = QLabel("Select Custom Game:") + self.gameCombo = AccessibleComboBox() + self.gameCombo.setAccessibleName("Custom Game Selection") + self.gameCombo.addItems(sorted(customGames.keys())) + # Connect enter key to accept + self.gameCombo.lineEdit().returnPressed.connect(self.accept) + + layout.addWidget(label) + layout.addWidget(self.gameCombo) + + # Dialog buttons + buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + buttons.accepted.connect(self.accept) + buttons.rejected.connect(self.reject) + layout.addWidget(buttons) + + def keyPressEvent(self, event): + """Handle key press events""" + if event.key() in (Qt.Key_Return, Qt.Key_Enter): + self.accept() + else: + super().keyPressEvent(event) + + def get_selected_game(self) -> Optional[str]: + """Get the selected game name""" + if self.result() == QDialog.Accepted: + return self.gameCombo.currentText() + return None + + +class DoomLauncher(QMainWindow): + """Main launcher window for Toby Doom""" + + def __init__(self): + super().__init__() + self.setWindowTitle("Toby Doom Launcher") + + if platform.system() == "Windows": + self.configFile = Path.cwd() / 'TobyConfig.ini' + self.gamePath = Path.cwd() + else: + self.gamePath = Path.home() / ".local/games/doom" + self.configFile = Path(os.getenv('XDG_CONFIG_HOME', Path.home() / '.config')) / 'gzdoom/gzdoom.ini' + + self.tobyVersion = TOBY_VERSION + self.speechHandler = SpeechHandler() + self.iwadSelector = IWADSelector() # Add IWAD selector + self.init_launcher_ui() + + def keyPressEvent(self, event): + """Handle key press events""" + if event.key() == Qt.Key_Escape: + self.close() + + def handle_button_keypress(self, event, button): + """Handle key press events for buttons""" + if event.key() in (Qt.Key_Return, Qt.Key_Enter): + button.click() + # Make sure to call the parent class's key press event + QPushButton.keyPressEvent(button, event) + + def populate_iwad_list(self): + """Populate the IWAD selection combo box""" + iwads = self.iwadSelector.find_iwads() + for name, path in iwads.items(): + self.iwadCombo.addItem(name, userData=path) + + def init_launcher_ui(self): + """Initialize the main launcher UI""" + centralWidget = QWidget() + self.setCentralWidget(centralWidget) + mainLayout = QVBoxLayout(centralWidget) + + # IWAD Selection + iwadLabel = QLabel("Select IWAD:") + self.iwadCombo = AccessibleComboBox(self) + self.iwadCombo.setAccessibleName("IWAD Selection") + self.populate_iwad_list() + mainLayout.addWidget(iwadLabel) + mainLayout.addWidget(self.iwadCombo) + + # Game Selection + self.gameCombo = AccessibleComboBox(self) + self.gameCombo.setAccessibleName("Game Selection") + self.populate_game_list() + self.gameCombo.lineEdit().returnPressed.connect(self.launch_single_player) + mainLayout.addWidget(QLabel("Select Game:")) + mainLayout.addWidget(self.gameCombo) + + # Narration style selection + self.narrationCombo = AccessibleComboBox(self) + self.narrationCombo.setAccessibleName("Narration Style") + self.narrationCombo.addItems(["Self-voiced", "Text to Speech"]) + # Set current value based on config + current = self.get_narration_type() + self.narrationCombo.setCurrentText( + "Self-voiced" if current == 0 else "Text to Speech" + ) + self.narrationCombo.currentTextChanged.connect(self.narration_type_changed) + + mainLayout.addWidget(QLabel("Narration Style:")) + mainLayout.addWidget(self.narrationCombo) + + # Create buttons + self.singlePlayerBtn = QPushButton("&Single Player") + self.deathMatchBtn = QPushButton("&Deathmatch") + self.customDeathMatchBtn = QPushButton("C&ustom Deathmatch") # Alt+U + self.coopBtn = QPushButton("&Co-op") + + self.singlePlayerBtn.clicked.connect(self.launch_single_player) + self.deathMatchBtn.clicked.connect(self.show_deathmatch_dialog) + self.customDeathMatchBtn.clicked.connect(self.show_custom_deathmatch_dialog) # New line + self.coopBtn.clicked.connect(self.show_coop_dialog) + + self.deathMatchBtn.keyPressEvent = lambda e: self.handle_button_keypress(e, self.deathMatchBtn) + self.customDeathMatchBtn.keyPressEvent = lambda e: self.handle_button_keypress(e, self.customDeathMatchBtn) # New line + self.coopBtn.keyPressEvent = lambda e: self.handle_button_keypress(e, self.coopBtn) + self.singlePlayerBtn.keyPressEvent = lambda e: self.handle_button_keypress(e, self.singlePlayerBtn) + + mainLayout.addWidget(self.singlePlayerBtn) + mainLayout.addWidget(self.deathMatchBtn) + mainLayout.addWidget(self.customDeathMatchBtn) # New line + mainLayout.addWidget(self.coopBtn) + + def get_narration_type(self) -> int: + """Get the current narration type from config file""" + try: + if not self.configFile.exists(): + return 0 # Default if file doesn't exist + + with open(self.configFile, 'r') as f: + for line in f: + line = line.strip() + if line.startswith('Toby_NarrationOutputType='): + value = line.split('=')[1].strip() + return int(value) + return 0 # Default to self-voiced if not found + except Exception as e: + print(f"Error reading config: {e}", file=sys.stderr) + return 0 + + def set_narration_type(self, value: int) -> bool: + """Set the narration type in config file + + Args: + value (int): Narration type (0 for self-voiced, 2 for TTS) + + Returns: + bool: True if successful, False otherwise + """ + try: + if not self.configFile.exists(): + # Create new config with default section + with open(self.configFile, 'w') as f: + f.write('[GlobalSettings]\n') + f.write(f'Toby_NarrationOutputType={value}\n') + return True + + # Read all lines + with open(self.configFile, 'r') as f: + lines = f.readlines() + + # Try to find and replace existing setting + found = False + for i, line in enumerate(lines): + if line.strip().startswith('Toby_NarrationOutputType='): + lines[i] = f'Toby_NarrationOutputType={value}\n' + found = True + break + + # If not found, add to end or after [GlobalSettings] + if not found: + globalSettingsIndex = -1 + for i, line in enumerate(lines): + if line.strip() == '[GlobalSettings]': + globalSettingsIndex = i + break + + if globalSettingsIndex >= 0: + # Insert after [GlobalSettings] + lines.insert(globalSettingsIndex + 1, f'Toby_NarrationOutputType={value}\n') + else: + # Add [GlobalSettings] section if it doesn't exist + lines.append('\n[GlobalSettings]\n') + lines.append(f'Toby_NarrationOutputType={value}\n') + + # Write back the modified content + with open(self.configFile, 'w') as f: + f.writelines(lines) + return True + + except Exception as e: + print(f"Error writing config: {e}", file=sys.stderr) + return False + + def narration_type_changed(self, text: str): + """Handle narration type combobox changes""" + value = 0 if text == "Self-voiced" else 2 + if not self.set_narration_type(value): + QMessageBox.warning( + self, + "Error", + "Failed to update narration setting. Check file permissions." + ) + # Reset combobox to current value + current = self.get_narration_type() + self.narrationCombo.setCurrentText( + "Self-voiced" if current == 0 else "Text to Speech" + ) + + def populate_game_list(self): + """Populate the game selection combo box""" + gameList = [ + "Toby Demo Map", + "Classic Doom", + "Toby Doom", + "OperationMDK", + "Classic Heretic", + "Toby Heretic", + "Classic Hexen", + "Toby Hexen", + "Custom Game", + "Audio Manual" + ] + + for gameName in gameList: + self.gameCombo.addItem(gameName) + + def find_freedm(self) -> Optional[str]: + """Find freedm.wad in standard locations""" + # Check common locations + locations = [ + self.gamePath / "freedm.wad", + Path("/usr/share/games/doom/freedm.wad"), + Path("/usr/share/doom/freedm.wad") + ] + + for loc in locations: + if loc.exists(): + return str(loc) + + return None + + def find_gzdoom(self) -> Optional[str]: + """Find the GZDoom executable""" + if platform.system() == "Windows": + gzdoomPath = Path.cwd() / "gzdoom.exe" + return str(gzdoomPath) if gzdoomPath.exists() else None + + return shutil.which("gzdoom") + + def get_addon_files(self, game_type: str = "DOOM") -> List[str]: + """Get all addon PK3 files for specified game type""" + addonFiles = [] + # MENU addons are common to all games + menuPath = self.gamePath / "Addons" / "MENU" + if menuPath.exists(): + addonFiles.extend(str(p) for p in menuPath.glob("Toby*.pk3")) + + # Game specific addons + gamePath = self.gamePath / "Addons" / game_type + if gamePath.exists(): + if game_type == "HERETIC": + pattern = "TobyHeretic*.pk3" + elif game_type == "HEXEN": + pattern = "TobyHexen*.pk3" + else: # DOOM + pattern = "Toby*.pk3" + addonFiles.extend(str(p) for p in gamePath.glob(pattern)) + + return addonFiles + + def get_selected_game_files(self) -> List[str]: + tobyMod = self.gamePath / f"TobyAccMod_V{self.tobyVersion}.pk3" + if not tobyMod.exists(): + QMessageBox.critical(self, "Error", f"Could not find {tobyMod}") + return [] + + baseFiles = [str(tobyMod)] + selectedGame = self.gameCombo.currentText() + + # Determine game type and get corresponding addons + if "Heretic" in selectedGame: + gameType = "HERETIC" + if "Toby Heretic" in selectedGame: + baseFiles.append(str(self.gamePath / "Addons/MAPS/TobyHereticLevels.wad")) + elif "Hexen" in selectedGame: + gameType = "HEXEN" + if "Toby Hexen" in selectedGame: + baseFiles.append(str(self.gamePath / "Addons/MAPS/TobyHexen.pk3")) + else: # Doom games + gameType = "DOOM" + if "Demo Map" in selectedGame: + baseFiles.append(str(self.gamePath / "Addons/MAPS/Toby-Demo-Level.wad")) + elif "Toby Doom" in selectedGame: + baseFiles.append(str(self.gamePath / "Addons/MAPS/TobyDoomLevels.wad")) + musicRenamer = self.gamePath / "Toby-Doom-Level-Music-Renamer.pk3" + if musicRenamer.exists(): + baseFiles.append(str(musicRenamer)) + elif "OperationMDK" in selectedGame: + baseFiles.append(str(self.gamePath / "OpMDK.wad")) + + # Add metal music mod if available (Doom only) + metalV7 = self.gamePath / "DoomMetalVol7.wad" + metalV6 = self.gamePath / "DoomMetalVol6.wad" + if metalV7.exists(): + baseFiles.append(str(metalV7)) + elif metalV6.exists(): + baseFiles.append(str(metalV6)) + + # Add game-specific addons + baseFiles.extend(self.get_addon_files(gameType)) + return baseFiles + + def show_custom_deathmatch_dialog(self): + """Show custom deathmatch configuration dialog""" + # First find available PK3s for customization + pk3List = [] + for item in self.gamePath.glob('*.pk3'): + if item.stat().st_size > 10 * 1024 * 1024: # >10MB + pk3List.append(str(item)) + + # Add Army of Darkness if available + aodWad = self.gamePath / "aoddoom1.wad" + if aodWad.exists(): + pk3List.append(str(aodWad)) + + if not pk3List: + QMessageBox.warning(self, "Error", "No custom mods found") + return + + # Create mod selection dialog + modDialog = QDialog(self) + modDialog.setWindowTitle("Select Customization") + dialogLayout = QVBoxLayout(modDialog) + + modLabel = QLabel("Select Mod:") + modCombo = AccessibleComboBox(modDialog) + modCombo.setAccessibleName("Mod Selection") + for pk3 in pk3List: + modCombo.addItem(Path(pk3).stem, userData=pk3) + + dialogLayout.addWidget(modLabel) + dialogLayout.addWidget(modCombo) + + buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + buttons.accepted.connect(modDialog.accept) + buttons.rejected.connect(modDialog.reject) + dialogLayout.addWidget(buttons) + + if not modDialog.exec(): + return + + selectedMod = modCombo.currentData() + + # Show map selection dialog (same as regular deathmatch) + mapOptions = { + 'map': { + 'type': 'combobox', + 'label': 'Select Map', + 'items': [ + "Com Station (2-4 players)", + "Warehouse (2-4 players)", + "Sector 3 (2-4 players)", + "Dungeon of Doom (2-4 players)", + "Ocean Fortress (2-4 players)", + "Water Treatment Facility (2-4 players)", + "Phobos Base Site 4 (2-4 players)", + "Hangar Bay 18 (2-4 players)", + "Garden of Demon (2-4 players)", + "Outpost 69 (2-4 players)" + ] + } + } + + mapDialog = MenuDialog("Select Map", mapOptions, self) + if not mapDialog.exec(): + return + + selectedMap = mapDialog.get_dialog_values()['map'] + mapIndex = mapOptions['map']['items'].index(selectedMap) + 1 # 1-based index + + # Show game options dialog + options = { + 'mode': { + 'type': 'combobox', + 'label': 'Game Mode', + 'items': [ + "Host Game", + "Join Game", + "Bots Only" + ] + }, + 'ip': { + 'type': 'text', + 'placeholder': 'Enter IP address to join (required for joining)' + }, + 'fraglimit': { + 'type': 'spinbox', + 'label': 'Frag Limit', + 'min': 1, + 'max': 500, + 'default': 20 + }, + 'players': { + 'type': 'spinbox', + 'label': 'Number of Players', + 'min': 2, + 'max': 4, + 'default': 2 + }, + 'skill': { + 'type': 'spinbox', + 'label': 'Skill Level', + 'min': 1, + 'max': 5, + 'default': 3 + } + } + + dialog = MenuDialog("Deathmatch Options", options, self) + if dialog.exec(): + values = dialog.get_dialog_values() + + # Set up game files + gameFiles = [ + str(self.gamePath / f"TobyAccMod_V{self.tobyVersion}.pk3") + ] + + # Add menu addons + menuPath = self.gamePath / "Addons/MENU" + if menuPath.exists(): + gameFiles.extend(str(p) for p in menuPath.glob("Toby*.pk3")) + + # Add selected mod + gameFiles.append(selectedMod) + + # Add deathmatch map + deathMatchMap = str(self.gamePath / "Addons/MAPS/TobyDeathArena_V1-5.wad") + if Path(deathMatchMap).exists(): + gameFiles.append(deathMatchMap) + + # Get deathmatch flags and add map selection + gameFlags = self.get_deathmatch_flags(values) + gameFlags.extend(["-warp", str(mapIndex)]) + + # Check/set freedm.wad as IWAD + freedmPath = self.find_freedm() + if not freedmPath: + QMessageBox.critical(self, "Error", "Could not find freedm.wad") + return + + # Force freedm.wad selection + for i in range(self.iwadCombo.count()): + if "freedm" in self.iwadCombo.itemText(i).lower(): + self.iwadCombo.setCurrentIndex(i) + break + + # Launch the game + self.launch_game(gameFiles, gameFlags) + + def load_custom_games(self) -> Dict[str, dict]: + """Load all custom game configurations""" + customGames = {} + if platform.system() == "Windows": + customDir = Path.cwd() / "TobyCustom" + else: + pathList = [ + Path(__file__).parent / "TobyCustom", + self.gamePath / "TobyCustom", + Path(os.path.expanduser("~/.local/share/doom/TobyCustom")) + ] + + # Use first existing path or fall back to original + customDir = next( + (path for path in pathList if path.exists()), + Path(__file__).parent / "TobyCustom" + ) + + if not customDir.exists(): + return customGames + + for json_file in customDir.glob("*.json"): + try: + with open(json_file, 'r') as f: + game_config = json.load(f) + customGames[game_config['name']] = game_config + except Exception as e: + print(f"Error loading custom game {json_file}: {e}") + + return customGames + + def check_dependencies(self, dependencies: List[dict]) -> bool: + """Check if required files exist and show download info if not""" + for dep in dependencies: + file_path = self.gamePath / dep['file'] + if not file_path.exists(): + message = [ + f"You are missing the \"{dep['file']}\" Package.\n", + f"You can get it from \"{dep['url']}\"\n", + "The URL has been copied to the clipboard.\n" + ] + message.extend(f"{msg}\n" for msg in dep.get('messages', [])) + + QMessageBox.critical( + self, + "Missing Dependency", + "".join(message) + ) + + # Copy URL to clipboard (platform-specific implementation needed) + # For now, try to open the URL in browser + try: + webbrowser.open(dep['url']) + except Exception: + pass + + return False + return True + + def show_custom_game_dialog(self): + """Show dialog for custom game selection""" + customGames = self.load_custom_games() + if not customGames: + QMessageBox.warning( + self, + "No Custom Games", + "No custom game configurations found in TobyCustom directory." + ) + return + + dialog = CustomGameDialog(customGames, self) + if not dialog.exec(): + return + + selectedGame = dialog.get_selected_game() + if selectedGame and selectedGame in customGames: + config = customGames[selectedGame] + + # Check dependencies before launching + if not self.check_dependencies(config.get('dependencies', [])): + return + + gameFiles = [] # We'll build this up as we go + + # Always start with TobyAccMod + tobyMod = self.gamePath / f"TobyAccMod_V{self.tobyVersion}.pk3" + if not tobyMod.exists(): + QMessageBox.critical(self, "Error", f"Could not find {tobyMod}") + return + gameFiles.append(str(tobyMod)) + + # Handle map selection right after TobyAccMod if specified + if config.get('use_map_menu', False) and 'submenu' not in config: + mapFiles = ["None"] # Start with None option + mapsDir = self.gamePath / "Addons/MAPS" + if mapsDir.exists(): + mapFiles.extend([p.name for p in mapsDir.glob("*.wad") + if p.name != "TobyDeathArena_V1-5.wad"]) + + # Add Operation MDK as special case + opMDK = self.gamePath / "OpMDK.wad" + if opMDK.exists(): + mapFiles.append("OpMDK.wad") + + mapDialog = QDialog(self) + mapDialog.setWindowTitle("Select Map") + dialogLayout = QVBoxLayout(mapDialog) + + mapLabel = QLabel("Select Map:") + mapCombo = AccessibleComboBox(mapDialog) + mapCombo.setAccessibleName("Map Selection") + mapCombo.addItems(mapFiles) + + dialogLayout.addWidget(mapLabel) + dialogLayout.addWidget(mapCombo) + + buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + buttons.accepted.connect(mapDialog.accept) + buttons.rejected.connect(mapDialog.reject) + dialogLayout.addWidget(buttons) + + if not mapDialog.exec(): + return + + selectedMap = mapCombo.currentText() + if selectedMap != "None": + if selectedMap == "OpMDK.wad": + mapPath = str(self.gamePath / selectedMap) + else: + mapPath = str(self.gamePath / "Addons/MAPS" / selectedMap) + if Path(mapPath).exists(): + gameFiles.append(mapPath) + + # Handle submenu if present + if 'submenu' in config: + selectedFile = self.show_submenu_dialog(config['submenu']) + if not selectedFile: + return + gameFiles.append(selectedFile) + + # Add remaining files + tobyBaseVersion = self.tobyVersion.split('-')[0] + for filePath in config.get('files', []): + filePath = filePath.format(toby_base_version=tobyBaseVersion) + # Handle glob patterns + if '*' in filePath: + pathObj = self.gamePath / filePath.split('*')[0] + pattern = filePath.split('/')[-1] + if pathObj.parent.exists(): + matches = list(pathObj.parent.glob(pattern)) + gameFiles.extend(str(p) for p in matches) + else: + fullPath = self.gamePath / filePath + if fullPath.exists(): + gameFiles.append(str(fullPath)) + + # Add optional files last + for optFile in config.get('optional_files', []): + optPath = self.gamePath / optFile + if optPath.exists(): + gameFiles.append(str(optPath)) + + # Get any custom flags + gameFlags = config.get('flags', []) + + # Launch the game if we have files + if gameFiles: + iwadIndex = self.iwadCombo.currentIndex() + if iwadIndex < 0: + QMessageBox.critical(self, "Error", "Please select an IWAD first") + return + + self.launch_game(gameFiles, gameFlags) + + def show_submenu_dialog(self, submenu_config) -> Optional[str]: + """Show dialog for selecting submenu option""" + dialog = QDialog(self) + dialog.setWindowTitle(submenu_config['title']) + dialogLayout = QVBoxLayout(dialog) + + # Game selection combobox + label = QLabel("Select Version:") + gameCombo = AccessibleComboBox(dialog) + gameCombo.setAccessibleName("Game Version Selection") + + # Add options and store full file paths as user data + for option in submenu_config['options']: + gameCombo.addItem(option['name'], userData=str(self.gamePath / option['file'])) + + dialogLayout.addWidget(label) + dialogLayout.addWidget(gameCombo) + + # Dialog buttons + buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + buttons.accepted.connect(dialog.accept) + buttons.rejected.connect(dialog.reject) + dialogLayout.addWidget(buttons) + + if dialog.exec(): + return gameCombo.currentData() + return None + + def launch_single_player(self): + """Launch single player game""" + selectedGame = self.gameCombo.currentText() + if selectedGame == "Custom Game": + self.show_custom_game_dialog() + elif selectedGame == "Audio Manual": + self.show_audio_manual() + else: + gameFiles = self.get_selected_game_files() + if gameFiles: + # Get selected IWAD + iwadIndex = self.iwadCombo.currentIndex() + if iwadIndex < 0: + QMessageBox.critical(self, "Error", "Please select an IWAD first") + return + + iwadPath = self.iwadCombo.itemData(iwadIndex) + cmdLine = [self.find_gzdoom(), "-iwad", iwadPath] + gameFiles + if cmdLine[0]: # If gzdoom was found + self.launch_game(gameFiles) + + def show_audio_manual(self): + """Show and play audio manual""" + manualPath = self.gamePath / "Manual" + if not manualPath.exists(): + QMessageBox.warning(self, "Error", "Manual directory not found") + return + + dialog = AudioManualDialog(manualPath, self) + dialog.exec() + + def show_deathmatch_dialog(self): + """Show deathmatch configuration dialog""" + # First show map selection + mapOptions = { + 'map': { + 'type': 'combobox', + 'label': 'Select Map', + 'items': [ + "Com Station (2-4 players)", + "Warehouse (2-4 players)", + "Sector 3 (2-4 players)", + "Dungeon of Doom (2-4 players)", + "Ocean Fortress (2-4 players)", + "Water Treatment Facility (2-4 players)", + "Phobos Base Site 4 (2-4 players)", + "Hangar Bay 18 (2-4 players)", + "Garden of Demon (2-4 players)", + "Outpost 69 (2-4 players)" + ] + } + } + + mapDialog = MenuDialog("Select Map", mapOptions, self) + if not mapDialog.exec(): + return + + selectedMap = mapDialog.get_dialog_values()['map'] + mapIndex = mapOptions['map']['items'].index(selectedMap) + 1 # 1-based index + + # Show game options dialog + options = { + 'mode': { + 'type': 'combobox', + 'label': 'Game Mode', + 'items': [ + "Host Game", + "Join Game", + "Bots Only" + ] + }, + 'ip': { + 'type': 'text', + 'placeholder': 'Enter IP address to join (required for joining)' + }, + 'fraglimit': { + 'type': 'spinbox', + 'label': 'Frag Limit', + 'min': 1, + 'max': 500, + 'default': 20 + }, + 'players': { + 'type': 'spinbox', + 'label': 'Number of Players', + 'min': 2, + 'max': 4, + 'default': 2 + }, + 'skill': { + 'type': 'spinbox', + 'label': 'Skill Level', + 'min': 1, + 'max': 5, + 'default': 3 + } +} + + dialog = MenuDialog("Deathmatch Options", options, self) + if dialog.exec(): + values = dialog.get_dialog_values() + gameFiles = self.get_selected_game_files() + # Add deathmatch map + deathMatchMap = str(self.gamePath / "Addons/MAPS/TobyDeathArena_V1-5.wad") + if Path(deathMatchMap).exists(): + gameFiles.append(deathMatchMap) + gameFlags = self.get_deathmatch_flags(values) + # Add map selection flag + gameFlags.extend(["-warp", str(mapIndex)]) + + # Check/set freedm.wad as IWAD + freedmPath = self.find_freedm() + if not freedmPath: + QMessageBox.critical(self, "Error", "Could not find freedm.wad") + return + + # Force freedm.wad selection + for i in range(self.iwadCombo.count()): + if "freedm" in self.iwadCombo.itemText(i).lower(): + self.iwadCombo.setCurrentIndex(i) + break + + self.launch_game(gameFiles, gameFlags) + + def show_coop_dialog(self): + """Show co-op configuration dialog""" + options = { + 'host': { + 'type': 'radio', + 'label': 'Host Game' + }, + 'ip': { + 'type': 'text', + 'placeholder': 'Enter IP address to join' + }, + 'players': { + 'type': 'spinbox', + 'label': 'Number of Players', + 'min': 2, + 'max': 10, + 'default': 2 + }, + 'skill': { + 'type': 'spinbox', + 'label': 'Skill Level', + 'min': 1, + 'max': 5, + 'default': 3 + } + } + + dialog = MenuDialog("Co-op Options", options, self) + if dialog.exec(): + values = dialog.get_dialog_values() + gameFiles = self.get_selected_game_files() + # Add keyshare for co-op + keyshareFile = str(self.gamePath / "keyshare-universal.pk3") + if Path(keyshareFile).exists(): + gameFiles.append(keyshareFile) + gameFlags = self.get_coop_flags(values) + self.launch_game(gameFiles, gameFlags) + + def get_deathmatch_flags(self, values: dict) -> List[str]: + """Get command line flags for deathmatch mode""" + mode = values['mode'] + + if mode == "Join Game": + if not values['ip'].strip(): + QMessageBox.warning(self, "Error", "IP address required for joining") + return [] + return ["-join", values['ip']] + + # Handle both Host Game and Bots Only + if mode == "Bots Only": + values['players'] = 1 + QMessageBox.information( + self, + "Bot Instructions", + "When the game starts, press ` to open the console.\n" + "Type addbot and press enter.\n" + "Repeat addbot for as many bots as you want.\n" + "Press ` again to close the console." + ) + + return [ + "-host", str(values['players']), + "-skill", str(values['skill']), + "-deathmatch", + "+Toby_SnapToTargetTargetingMode", "0", + "+set", "sv_cheats", "1", + "+fraglimit", str(values['fraglimit']), + "+dmflags", "16384", + "+dmflags", "4", + "+dmflags", "128", + "+dmflags", "4096", + "+dmflags2", "512", + "+dmflags2", "1024", + "-extratic", + "-dup", "3" + ] + + def get_coop_flags(self, values: dict) -> List[str]: + """Get command line flags for co-op mode""" + if not values['host']: + if not values['ip'].strip(): + QMessageBox.warning(self, "Error", "IP address required for joining") + return [] + return ["-join", values['ip']] + + return [ + "-host", str(values['players']), + "-skill", str(values['skill']), + "+set", "sv_cheats", "1", + "+set", "sv_weaponsstay", "1", + "+set", "sv_respawnprotect", "1", + "+set", "sv_respawnsuper", "1", + "+set", "alwaysapplydmflags", "1", + "-extratic", + "-dup", "3" + ] + + def monitor_game_process(self, process): + """Monitor game process and exit when it's done""" + process.wait() # Wait for the game to finish + QApplication.instance().quit() # Quit the application + + def launch_game(self, gameFiles: List[str], gameFlags: List[str] = None): + """Launch game with speech processing""" + if not gameFiles: + return + + gzdoomPath = self.find_gzdoom() + if not gzdoomPath: + QMessageBox.critical(self, "Error", "GZDoom executable not found") + return + + # Get selected IWAD + iwadIndex = self.iwadCombo.currentIndex() + if iwadIndex < 0: + QMessageBox.critical(self, "Error", "Please select an IWAD first") + return + + iwadPath = self.iwadCombo.itemData(iwadIndex) + + try: + if platform.system() == "Windows": + configFile = Path.cwd() / 'TobyConfig.ini' + # For Windows, pipe directly to PowerShell running DoomTTS.ps1 + cmdLine = [gzdoomPath, "-stdout", "-config", str(configFile), + "-iwad", iwadPath, "-file"] + gameFiles + if gameFlags: + cmdLine.extend(gameFlags) + + fullCmd = " ".join(cmdLine) + " | powershell -ExecutionPolicy Bypass -File DoomTTS.ps1" + process = subprocess.Popen( + fullCmd, + cwd=str(self.gamePath), + shell=True + ) + + # Monitor thread only for Windows + monitorThread = threading.Thread( + target=self.monitor_game_process, + args=(process,), + daemon=True + ) + monitorThread.start() + else: + # For Linux/Mac, use stdbuf to unbuffer output + cmdLine = ["stdbuf", "-oL", gzdoomPath, "-stdout", + "-iwad", iwadPath, "-file"] + gameFiles + if gameFlags: + cmdLine.extend(gameFlags) + + process = subprocess.Popen( + cmdLine, + cwd=str(self.gamePath), + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + bufsize=1, + text=True, + env=dict(os.environ, PYTHONUNBUFFERED="1") + ) + + # Start speech processing thread + speechThread = threading.Thread( + target=self.speechHandler.speak_thread, + args=(process,), + daemon=True + ) + speechThread.start() + + # Start process monitor thread + monitorThread = threading.Thread( + target=self.monitor_game_process, + args=(process,), + daemon=True + ) + monitorThread.start() + + # Hide the window + self.hide() + + except Exception as e: + QMessageBox.critical(self, "Error", f"Failed to launch game: {e}") + + +if __name__ == "__main__": + # Converts version number to required format (e.g., 8.0 -> "8-0") + TOBY_VERSION: Final[str] = f"{int(TOBY_VERSION_NUMBER)}-{int(TOBY_VERSION_NUMBER * 10 % 10)}" + setproctitle("Toby Doom Launcher") + app = QApplication(sys.argv) + window = DoomLauncher() + window.show() + sys.exit(app.exec()) diff --git a/Toby Doom Launcher.spec b/Toby Doom Launcher.spec new file mode 100644 index 0000000..e1d5bcb --- /dev/null +++ b/Toby Doom Launcher.spec @@ -0,0 +1,44 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['Toby Doom Launcher.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='Toby Doom Launcher', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) +coll = COLLECT( + exe, + a.binaries, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='Toby Doom Launcher', +) diff --git a/TobyCustom/' b/TobyCustom/' new file mode 100644 index 0000000..d056ea6 --- /dev/null +++ b/TobyCustom/' @@ -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 diff --git a/TobyCustom/ArmyOfDarknessDoom.json b/TobyCustom/ArmyOfDarknessDoom.json new file mode 100644 index 0000000..e3126cc --- /dev/null +++ b/TobyCustom/ArmyOfDarknessDoom.json @@ -0,0 +1,24 @@ +{ + "name": "Army of Darkness Doom", + "dependencies": [ + { + "file": "aoddoom1.wad", + "url": "https://www.moddb.com/mods/army-of-darkness-total-conversion/addons/army-of-darkness-doom-wad", + "messages": [ + "Place \"aoddoom1.wad\" in \"${gamePath}\"" + ] + } + ], + "files": [ + "Addons/MENU/TobyV{toby_base_version}_*", + "aoddoom1.wad" + ], + "optional_files": [ + "DoomMetalVol7.wad", + "DoomMetalVol6.wad" + ], + "flags": [ + "+Toby_UniversalBeacon_UseUniversalSounds", "true" + ], + "use_map_menu": true +} diff --git a/TobyCustom/GoMidievilOnTheirAss.json b/TobyCustom/GoMidievilOnTheirAss.json new file mode 100644 index 0000000..f7b54c1 --- /dev/null +++ b/TobyCustom/GoMidievilOnTheirAss.json @@ -0,0 +1,27 @@ +{ + "name": "Go Midievil On Their Ass", + "dependencies": [ + { + "file": "GMOTA_V.1.5.2.pk3", + "url": "https://combine-kegan.itch.io/gmota", + "messages": [ + "Place the file in ~/.local/games/doom" + ] + } + ], + "files": [ + "Addons/MENU/TobyV{toby_base_version}_*", + "Addons/DOOM/TobyV{toby_base_version}_Proximity.pk3", + "GMOTA_V.1.5.2.pk3" + ], + "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" + ], + "use_map_menu": true +} diff --git a/TobyCustom/Project_Brutality.json b/TobyCustom/Project_Brutality.json new file mode 100644 index 0000000..afa1d96 --- /dev/null +++ b/TobyCustom/Project_Brutality.json @@ -0,0 +1,32 @@ +{ + "name": "Project Brutality", + "dependencies": [ + { + "file": "Project_Brutality.pk3", + "url": "https://www.moddb.com/mods/project-brutality", + "messages": [ + "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*" + ] + } + ], + "files": [ + "Addons/DOOM/TobyV{toby_base_version}_Proximity.pk3", + "PB-Toby-Compatibility-Addon.pk3", + "Project_Brutality.pk3" + ], + "optional_files": [ + "DoomMetalVol7.wad", + "DoomMetalVol6.wad" + ], + "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" + ], + "use_map_menu": true +} diff --git a/TobyCustom/Project_BrutalityLatest.json b/TobyCustom/Project_BrutalityLatest.json new file mode 100644 index 0000000..e21904f --- /dev/null +++ b/TobyCustom/Project_BrutalityLatest.json @@ -0,0 +1,31 @@ +{ + "name": "Project Brutality Latest", + "dependencies": [ + { + "file": "Project_Brutality-Latest.pk3", + "url": "https://www.moddb.com/mods/project-brutality", + "messages": [ + "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*" + ] + } + ], + "files": [ + "Addons/DOOM/TobyV{toby_base_version}_Proximity.pk3", + "Project_Brutality-Latest.pk3" + ], + "optional_files": [ + "DoomMetalVol7.wad", + "DoomMetalVol6.wad" + ], + "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" + ], + "use_map_menu": true +} diff --git a/TobyCustom/README.ProjectBrutality b/TobyCustom/README.ProjectBrutality new file mode 100644 index 0000000..4219e84 --- /dev/null +++ b/TobyCustom/README.ProjectBrutality @@ -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] diff --git a/TobyCustom/StarWarsjson b/TobyCustom/StarWarsjson new file mode 100644 index 0000000..09dceb0 --- /dev/null +++ b/TobyCustom/StarWarsjson @@ -0,0 +1,17 @@ +{ + "name": "Star Wars", + "dependencies": [ + { + "file": "Xim-StarWars-v3.1.5.pk3", + "url": "https://www.moddb.com/mods/xims-star-wars-doom", + "messages": [ + "Place Xim-StarWars-v3.1.5.pk3 in the Toby Doom directory, on Linux or Mac, ~/.local/games/doom" + ] + } + ], + "files": [ + "Xim-StarWars-v3.1.5.pk3", + "Addons/STARWARS/*.pk3" + ], + "use_map_menu": true +} diff --git a/TobyCustom/WolfenDoom.json b/TobyCustom/WolfenDoom.json new file mode 100644 index 0000000..8761ecc --- /dev/null +++ b/TobyCustom/WolfenDoom.json @@ -0,0 +1,44 @@ +{ + "name": "WolfenDoom", + "dependencies": [ + { + "file": "Addons/WOLFENDOOM/orig_enh.pk3", + "url": "https://www.moddb.com/mods/wolfendoom/downloads/wolfendoom-enhanced", + "messages": [ + "mkdir -p ~/.local/games/doom/Addons/WOLFENDOOM/", + "Place all pk3 files from the zip archive in:", + "~/.local/games/doom/Addons/WOLFENDOOM/", + "There should be three of them noct_enh.pk3, orig_enh.pk3, and sod_enh.pk3" + ] + } + ], + "submenu": { + "title": "Select Game", + "options": [ + { + "name": "WolfenDoom", + "file": "Addons/WOLFENDOOM/orig_enh.pk3" + }, + { + "name": "WolfenDoom - Spear of Destiny", + "file": "Addons/WOLFENDOOM/sod_enh.pk3" + }, + { + "name": "WolfenDoom - Nocturne", + "file": "Addons/WOLFENDOOM/noct_enh.pk3" + } + ] + }, + "files": [ + "Addons/MENU/TobyV{toby_base_version}_*", + "Addons/DOOM/TobyV{toby_base_version}_Proximity.pk3" + ], + "flags": [ + "+bind", "Ctrl", "+attack", + "+bind", "X", "turn180", + "+Toby_NarrationOutputType", "2", + "+Toby_SnapToTargetTargetingMode", "1", + "+Toby_UniversalBeacon_UseUniversalSounds", "true" + ], + "use_map_menu": true +} diff --git a/dist/_internal/nvdaControllerClient.dll b/dist/_internal/nvdaControllerClient.dll new file mode 100644 index 0000000000000000000000000000000000000000..8889705fa7eb13a25b81c0db80d8f1fa7444ccd2 GIT binary patch literal 246176 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 L#gV1Wo-_Xg1^Vqs literal 0 HcmV?d00001