Initial commit.
This commit is contained in:
parent
38fe088ce3
commit
7f08c41d9d
149
README.md
149
README.md
@ -1,3 +1,148 @@
|
||||
# toby-doom-launcher
|
||||
# Toby Doom Launcher
|
||||
|
||||
Launcher for the Toby Doom Accessibility project.
|
||||
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 <https://stormux.org>
|
||||
|
||||
## License
|
||||
|
||||
This software is distributed under the GNU Lesser General Public License v3.0 (LGPL-3.0).
|
||||
|
4
Requirements.txt
Normal file
4
Requirements.txt
Normal file
@ -0,0 +1,4 @@
|
||||
accessible_output2
|
||||
PySide6>=6.0.0
|
||||
python-vlc
|
||||
setproctitle>=1.2.0
|
1720
Toby Doom Launcher.py
Executable file
1720
Toby Doom Launcher.py
Executable file
File diff suppressed because it is too large
Load Diff
44
Toby Doom Launcher.spec
Normal file
44
Toby Doom Launcher.spec
Normal file
@ -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',
|
||||
)
|
124
TobyCustom/'
Normal file
124
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
|
24
TobyCustom/ArmyOfDarknessDoom.json
Normal file
24
TobyCustom/ArmyOfDarknessDoom.json
Normal file
@ -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
|
||||
}
|
27
TobyCustom/GoMidievilOnTheirAss.json
Normal file
27
TobyCustom/GoMidievilOnTheirAss.json
Normal file
@ -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
|
||||
}
|
32
TobyCustom/Project_Brutality.json
Normal file
32
TobyCustom/Project_Brutality.json
Normal file
@ -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
|
||||
}
|
31
TobyCustom/Project_BrutalityLatest.json
Normal file
31
TobyCustom/Project_BrutalityLatest.json
Normal file
@ -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
|
||||
}
|
14
TobyCustom/README.ProjectBrutality
Normal file
14
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]
|
17
TobyCustom/StarWarsjson
Normal file
17
TobyCustom/StarWarsjson
Normal file
@ -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
|
||||
}
|
44
TobyCustom/WolfenDoom.json
Normal file
44
TobyCustom/WolfenDoom.json
Normal file
@ -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
|
||||
}
|
BIN
dist/_internal/nvdaControllerClient.dll
vendored
Normal file
BIN
dist/_internal/nvdaControllerClient.dll
vendored
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user