Development of this mod is currently on hold. The developer is busy with other commitments, and the weekly Claude AI usage limit has been completely exhausted working on this mod.
I'll be upgrading my Claude plan soon, so there won't be long stretches between development sessions going forward.
This mod is NOT in a playable state. It exists purely for early testing and gathering feedback. Many core features are broken or missing. Please do not purchase Cassette Beasts expecting to play it accessibly with this mod - it is nowhere near ready for that.
If you're interested in contributing or testing, feel free to explore the code, but understand that active development is paused for now.
This mod is in EXTREMELY EARLY TESTING and should NOT be considered a playable accessibility solution.
- DO NOT purchase this game expecting it to be accessible right now
- A large portion of the game is completely inaccessible with this mod
- There are many bugs and features that don't work
- Only buy this game if you want to actively help develop this accessibility mod
- This repository exists for feedback, contributions, and collaborative development
The mod may be slightly more friendly to low vision users now, but many menus and features are still missing accessibility support.
If you're a blind/visually impaired player looking for a fully accessible gaming experience, this is not ready yet. Check back later or consider contributing to help make it happen.
This is an attempt to add text-to-speech (TTS) accessibility support to Cassette Beasts, an indie monster-collecting RPG built in Godot Engine 3.5.1.
We use direct PCK modification (same approach as the Buckshot Roulette Accessibility Mod) because the Steam Workshop system is designed for content mods, not engine-level accessibility features.
| Key | Function |
|---|---|
| H | Player health (monster name + HP percentage) |
| Shift+H | Enemy health (monster name + HP percentage) |
| T | Time of day (Day #, hour, minute, day/night) |
| G | Gold/money amount |
| J | Player AP in battle (monster name + current/max AP) |
| F | Fusion meter percentage (or "Fusion ready!") |
| R | Relationship level with current partner |
| B | Bestiary details (when in bestiary menu - reads species, types, bio, stats) |
| F4 | Toggle accessibility on/off |
| F5 | Repeat last spoken text |
- Menu opening announcements
- Dialogue text with speaker names
- Dialogue options (queued after speech finishes)
- Battle menu buttons (Fight, Forms, Items, Flee, Fuse)
- Move selection in battle (name, AP cost, type, category, power, accuracy, hits, description)
- Naming screen announcements
- Item button focus (inventory)
- Loot screen item list
- Experience/level up announcements
- Notification popups
- H - Player health hotkey
- Shift+H - Enemy health hotkey
- T - Time of day hotkey
- G - Gold/money hotkey
- J - Player AP hotkey (in battle)
- F hotkey - Fusion meter percentage
- R hotkey - Relationship level with partner
- Recording chance - Announces final record percentage when attempting to capture
- Fusion meter - Auto-announces "Fusion ready!" when meter fills
- Damage numbers - Announces damage dealt in battle
- Critical hits - Announces "Critical hit!" with damage
- Healing - Announces "Healed X" amounts
- AP changes - Announces "gained/lost X AP" during battle
- Status effects - Announces buff/debuff application
- Battle text toasts - Recording failed, missed attacks, etc.
- Bootleg indicator - Tapes announce if they're bootlegs
- Relationship info - Party members announce relationship level + "ready to level up"
- Bestiary menu list navigation - announces species code, name, and status (seen/recorded)
- B hotkey - reads full bestiary entry details (types, bio text, encounter/record/defeat stats)
- Tape/Forms menu navigation - announces tape name, species, types, HP%, broken status, grade
- Beast info screen (PartyTapeUI)
- Remaster menu - announces what tape can remaster into
- Target selection after choosing move
- Item selection in battle inventory
- Color names in character creation
- Settings menu
- Map/overworld navigation
- Combat flow (turn order)
- Quest system updates
- And many other menus/screens...
Due to copyright considerations, we distribute only our code additions, not modified game files.
See patches/INSTALLATION_GUIDE.md for complete step-by-step instructions.
- Cassette Beasts (Steam version)
- GodotPCKExplorer (for packing)
- GDRE Tools (for decompiling, if needed)
-
Backup your original game files
Copy CassetteBeasts.pck to CassetteBeasts.pck.backup -
Decompile the game (if you need fresh source):
gdre_tools.exe --recover="CassetteBeasts.pck" --output-dir="C:\CassetteBeasts-Decompiled"
-
Copy modified source files from this repo's
source/folder to your decompiled game, maintaining folder structure -
Copy the godot-tts addon to
addons/godot-tts/ -
Add Accessibility autoload to
project.godot:[autoload] Accessibility="*res://global/Accessibility.gd"
-
Copy DLLs to game folder (alongside CassetteBeasts.exe):
godot_tts.dllnvdaControllerClient64.dllSAAPI64.dll
-
Repack the PCK:
GodotPCKExplorer.Console.exe -p "C:\CassetteBeasts-Decompiled" "C:\...\Cassette Beasts\CassetteBeasts.pck" "1.3.5.1"
- Buckshot Roulette: Godot 4.1.1 - has native
DisplayServer.tts_speak() - Cassette Beasts: Godot 3.5.1 - NO native TTS support
We use the godot-tts GDNative addon which provides:
- Direct screen reader integration via Tolk (NVDA Controller Client, SAPI)
- No process spawning - native DLL calls
- Proper interrupt support -
stop()immediately silences speech
Supported Screen Readers:
- NVDA (via nvdaControllerClient64.dll)
- JAWS
- System Access
- SAPI fallback (via SAAPI64.dll)
CassetteBeasts-AccessibilityMod/
├── README.md # This file
├── source/ # Modified GDScript files
│ ├── global/
│ │ ├── Accessibility.gd # Main TTS singleton
│ │ └── notifications/
│ │ └── GenericPopUp.gd # Notification TTS
│ ├── menus/
│ │ ├── BaseMenu.gd # Menu opening announcements
│ │ ├── bestiary/ # Bestiary TTS
│ │ │ ├── BestiaryListButton.gd
│ │ │ └── BestiaryListButtonFusion.gd
│ │ ├── evolution/
│ │ │ └── EvolutionMenu.gd # Remaster TTS
│ │ ├── give_tape/
│ │ ├── text_input/
│ │ ├── inventory/
│ │ ├── party/
│ │ │ ├── TapeButton.gd # Tape/forms menu TTS + bootleg
│ │ │ └── PartyMemberButton.gd # Relationship TTS
│ │ ├── party_tape/
│ │ ├── loot/
│ │ └── gain_exp/
│ ├── nodes/
│ │ └── message_dialog/
│ │ ├── MessageDialog.gd # Dialogue TTS
│ │ └── MenuDialog.gd # Dialogue options TTS
│ └── battle/
│ └── ui/
│ ├── MoveButton.gd
│ ├── TargetButton.gd
│ ├── FightOrderSubmenu.gd
│ ├── BattleToast_Default.gd # Damage/heal/AP TTS
│ ├── BattleToast_RecordingChance.gd # Recording % TTS
│ └── cassette_player/
│ ├── CassettePlayer3D.gd
│ └── FusionMeter.gd # "Fusion ready!" TTS
├── addons/
│ └── godot-tts/ # TTS GDNative addon
│ ├── TTS.gd
│ ├── godot_tts.dll
│ ├── nvdaControllerClient64.dll
│ └── SAAPI64.dll
└── docs/
├── ACCESSIBILITY_MOD_STATUS.md
└── CLAUDE_SESSION_CONTEXT.md
- Testing: Play the game and report what doesn't work
- Code: Fix bugs or add TTS to uncovered areas
- Documentation: Improve this README or write guides
When reporting bugs, please include:
- What you were trying to do
- What was announced (or not announced)
- The menu/screen you were on
- Any console output (run with
--verboseflag)
When adding TTS to a new area:
- Check if
Accessibilitysingleton exists:if Accessibility: - Use appropriate announce function or
speak()directly - Use
call_deferred()if the UI isn't ready yet - Don't interrupt important speech - use
speak(text, false)for non-interrupting
| Version | Date | Changes |
|---|---|---|
| 0.7.0 | 2026-02-15 | Added: Recording chance TTS, Fusion meter TTS + hotkey (F), Relationship hotkey (R), Damage/heal/AP announcements, Bootleg indicator, Battle text toasts |
| 0.6.0 | 2026-02-14 | Major expansion: Battle UI, status effects, notifications, many menu improvements |
| 0.5.0 | 2026-02-14 | Added FightOrderSubmenu TTS, runtime color detection |
| 0.4.0 | 2026-02-14 | Added speech queue system, dialogue options, cassette obtained, naming screen |
| 0.3.0 | 2026-02-14 | Replaced PowerShell with godot-tts native addon |
| 0.2.0 | 2026-02-14 | Fixed TTS overlap, color names, dialogue timing, battle menu TTS |
| 0.1.0 | 2026-02-13 | Initial implementation - basic TTS framework |
- Mod Development: Lethal-Lawnmower
- TTS Addon: godot-tts by lightsoutgames
- Inspiration: Buckshot Roulette Accessibility Mod
- Game: Cassette Beasts by Bytten Studio
This accessibility mod is provided for accessibility purposes. The modified scripts are derivatives of Bytten Studio's original code.
The godot-tts addon is licensed under MIT - see addons/godot-tts/LICENSE.
- GitHub Issues: Open an issue
- For Cassette Beasts game support, contact Bytten Studio
Remember: This is NOT ready for general use. Only engage with this project if you want to help develop it.