Introduction
Say the Spire 2 is an accessibility mod for blind and visually impaired players of Slay the Spire 2. It provides text-to-speech announcements and keyboard/controller navigation for all game screens, allowing blind players to fully play the game.
Features
- Full text-to-speech for all game elements
- Full support for Controller and keyboard
- Buffer system for detailed information review
- Configurable Combat event announcements (damage, block, powers, card plays)
- Map viewer with tree-based navigation
- Multiplayer support (lobby, voting, remote player info)
- Customizable event settings with per-source filtering
- Mod settings screen (Ctrl+M) for all configuration
- All keyboard and controller inputs can be configured
Links
- Slay the Spire 2 Steam
- Say the Spire 2 Latest Release Page
- Say the Spire 2 GitHub Repository
- My Modding Discord
- My Patreon
Installation
There are two approaches to installing Say the Spire 2. You can either use the installer program (recommended) or manually install.
Disabling Steam Input
If you want to play with a controller, you must disable Steam Input for Slay the Spire 2. This is because the game has a particularly unwieldy Steam Input configuration that prevents many controller inputs from working properly, for example it treats both sticks as being the left stick among other things. You can disable Steam Input for Slay the Spire 2 without changing it for other games. To disable it, do the following:
- In Big Picture Mode: Navigate to Slay the Spire 2 in your library. Move right to Manage, select it, then move down to Properties. Under the Controller tab, find the combo box labeled “Override for Slay the Spire 2”. Select Disable Steam Input.
- In Regular View: In your game library, right-click Slay the Spire 2 (or click the manage/gear button). Click Properties, go to the Controller tab, and set the Steam Input override to Disable.
Using the Installer (Recommended)
The recommended way to install Say the Spire 2 is using the provided installer program. This downloads the latest release, extracts all required files to the right directory, and modifies game settings to enable mods accessibly. You will not need to download an installer to update your mod to a newer version and can just simply use the same program (unless the installer itself is updated.) You can download it from the latest release page.
First-Time Setup
- Important: Launch Slay the Spire 2 at least once before running the installer. The game needs to generate its settings file.
- Run the installer. It will auto-detect the game directory. If it doesn’t, you can browse to find it with the browse button next to the input field.
- Click Install and select the version you want.
- The installer will prompt you with two options:
- Screen reader support: Enable this if you are blind or visually impaired.
- Disable Godot UIA: Recommended Yes for screen reader (particularly NVDA) users. Select No if you are sighted or use other accessibility tools that rely on UIA.
- The installer will enable mods in your game settings automatically. If it can’t find the settings file, it will prompt you to launch the game first and retry.
- Launch the game normally. If done correctly, you should hear the mod speak Say the Spire and the mod version.
Note that you can update to newer versions of the mod with the same installer; simply click the update button in the installer UI.
JAWS Configuration
If you use JAWS, the installer can copy JAWS configuration files to your JAWS settings directory. This is highly recommended. The jaws configuration files allow keyboard input to pass through to the program that jaws would otherwise prevent, such as the arrow keys. They also disable some annoying repeating announcements due to some UIA glitches (frequent reporting of an invisible UI control that handles the game’s crash reporting.)
Click Install JAWS config after installing the mod and the mod will prompt you to select your Jaws settings directory. This will be something like C:\Users\user\AppData\Roaming\Freedom Scientific\JAWS\year\Settings\locale.
Manual Installation
If you prefer not to use the installer or it doesn’t work, you can set things up manually.
- Important: Launch Slay the Spire 2 at least once before running the installer. The game needs to generate its settings file.
- Download the latest zip release from https://github.com/bradjrenshaw/say-the-spire2/releases/latest
- Extract the zip to your game’s root directory. On Windows, the default is
C:\Program Files (x86)\Steam\steamapps\common\Slay the Spire 2. You should see screen reader files in the root directory and amodssubfolder. - Next, modify the game’s settings file. On Windows, this is located in
%APPDATA%/SlayTheSpire2. - Open the
steamsubfolder, then open the subfolder with a long number (your Steam account ID). - Open the
settings.savefile in a text editor (Notepad works well; avoid Word or similar). Search formod_settings(Ctrl+F is helpful as it’s a large JSON file). You should find"mod_settings": null. Replacenullwith{"mods_enabled": true}, so the line reads"mod_settings": {"mods_enabled": true}. Take care not to alter any surrounding formatting. Save and close the file. - Launch the game normally. If done correctly, you should hear the mod speak Say the Spire and the mod version.
Jaws
If you use jaws, configuration files are provided that significantly improve the experience. The jaws configuration files allow keyboard input to pass through to the program that jaws would otherwise prevent, such as the arrow keys. They also disable some annoying repeating announcements due to some UIA glitches (frequent reporting of an invisible UI control that handles the game’s crash reporting.)
The jaws scripts are located in the jaws subfolder of the release zip. Open this folder, copy them all to clipboard, and then paste them in your Jaws settings directory. This will be something like C:/Users/user/AppData/Roaming/Freedom Scientific/JAWS/year/Settings/locale.
Getting Started
After installing the mod, launch Slay the Spire 2. You should hear the mod announce Say the Spire and the mod version.
How It Works
The mod acts as a screenreader for Slay the Spire 2, narrating focused UI elements and announcing gameplay events. Navigating the UI should feel fairly intuitive for the most part. Use the arrow keys, d-pad, or left stick to navigate menus. Use enter/a/x to confirm, backspace/b/circle to cancel. To read more information on an item, use control up/down (keyboard) or right stick up/down (controller) to review the current buffer of information (we will get to buffers in a moment.) The game does use quite a few bindings, so I highly recommend you consult the bindings documentation or check your mod settings menu (ctrl m keyboard, r2+start xbox, rt+start ps5.)
There are quite a few points in the game where you need to press your Accept keybinding (e keyboard, y xbox, triangle ps5) to confirm certain popups. If enter isn’t working where you feel it should, you most likely need to press your accept binding. Note that this input is also used to end your turn, so be careful when confirming certain popups in combat that you don’t end your turn by accident.
A note when playing your first game: the tutorial dialogs are a little unintuitive for the moment. For the multi-page tutorials, you must use right and left to navigate the pages; navigate right of the last page to exit and return to regular gameplay.
Help
If you want context-sensitive help on any screen, press f1 (keyboard) or left trigger plus back (controller). This will provide help text and available controls for the screen you’re currently on. Use up and down to navigate through available help messages. If a help message contains multiple actions/controls, use right/left to browse them individually. You can exit the help screen by pressing the help key again, or by using the usual back/cancel controls.
Buffers
To access additional statistics and tooltips you can use the buffer system. There is an extra set of controller and keyboard inputs to provide information. This is generally refered to as the buffer system and is mapped to the right stick or control plus the arrow keys on keyboard by default. As you move over various UI Elements, contextual buffers will appear. These are just lists of various pieces of information about the element you’re focusing on. For example, if you hover over a card, the card buffer will be automatically focused and will contain information such as the card’s name, energy cost, description, etc. Use ctrl up/down (keyboard) or right stick up/down (controller) to review the contents of the currently selected buffer.
Even though you are focused on the card element for example, other buffers of information will also be present. You can use ctrl left/right (keyboard) or right stick left/right (controller) to navigate between these. This lets you inspect various information you could see visually without having to move to the corresponding element. These include the player buffer (for hp, energy, gold, etc), the events buffer (for reviewing things that have happened), the lobby screen in multiplayer, etc.
The Map
The buffer controls are also used for the map. Using ctrl arrows (keyboard) or right stick (controller) you can browse all map nodes. The map is often the least intuitive part of the game for new players as it doesn’t directly correspond to a simple grid of adjacent rooms. If you find the following section overwhelming don’t worry too much about it; just play the game and it will make sense over time.
Visually the map is a grid of rooms of various types (shop, combat, questionmark/event/unknown, etc.) You can see the entire map for your current act. The map consists of a number of icons with lines connecting them to other rooms, showing you the paths you can take. You can only travel to a room connected to yours by a line and you can only travel forward/higher up the map, never in reverse.
To browse the map accessibly, the mod provides a map view cursor. Note that this is separate from your regular movement cursor; moving the map view cursor to a map node and pressing confirm will not click on the element focused by the map view cursor. think of it like a virtual review cursor your screenreader uses.
The map viewer always starts at the map room you are currently in when it opens; it then puts your view cursor on the connected room your regular cursor last focused. Use ctrl left/right (keyboard) or right stick left/right (controller) to navigate the list of rooms that you can reach from your current room. If you press ctrl up (keyboard) or right stick up (controller), you will move into that room and are now looking at the rooms it is connected to. This way you can browse the map in its entirety. Using ctrl down (keyboard) or right stick down (controller) will allow you to move in reverse.
Controls
All keyboard and controller bindings are organized into the same categories you’ll find in the mod settings menu under Keybindings. To customize them, open the settings (Ctrl+M on keyboard, LT+Start on Xbox, or L2+Options on PS5) and drill into the action you want to change.
You can press F1 (or LT+Back on Xbox / L2+Create on PS5) at any time to see context-sensitive help showing all controls available on the current screen.
Navigation
| Action | Keyboard | Controller | Function |
|---|---|---|---|
| Navigate Up | Up Arrow | D-pad Up or Left Stick Up | Move focus up |
| Navigate Down | Down Arrow | D-pad Down or Left Stick Down | Move focus down |
| Navigate Left | Left Arrow | D-pad Left or Left Stick Left | Move focus left |
| Navigate Right | Right Arrow | D-pad Right or Left Stick Right | Move focus right |
| Select | Enter | A / X | Click UI elements and confirm some popups |
| Cancel | Backspace | B / Circle | Cancel some popups or go back |
| Accept | E | Y / Triangle | End turn, confirm selected cards, confirm some popups |
| Pause / Back | Escape | Start / Options | Pause menu (in-game), save slots (main menu) |
| Peek | Space | Left Stick Click | Visually see some obscured screens through others (not useful with a screen reader) |
Buffers
| Action | Keyboard | Controller | Function |
|---|---|---|---|
| Buffer Next Item | Ctrl+Up | Right Stick Up | Move forward through current buffer |
| Buffer Previous Item | Ctrl+Down | Right Stick Down | Move backward through current buffer |
| Next Buffer | Ctrl+Right | Right Stick Right | Switch to the next available buffer |
| Previous Buffer | Ctrl+Left | Right Stick Left | Switch to the previous available buffer |
Run Information
| Action | Keyboard | Controller | Function |
|---|---|---|---|
| Announce Gold | Ctrl+G | RT+A / R2+X | Announce current gold |
| Announce HP | Ctrl+H | LT+A / L2+X | Announce current HP |
| Announce Boss | Ctrl+N | RT+B / R2+Circle | Announce current act boss |
| Announce Relic Counters | Ctrl+R | RT+Back / R2+Create | Announce relic counter values |
| Top Panel | T | X / Square | Jump to top panel (relics/potions); on the timeline, jump to the first available epoch |
| View Deck / Tab Left | D | LB / L1 | View deck; on screens with tabs, switch to the previous tab; decrease ascension level |
| View Exhaust / Tab Right | F | RB / R1 | View exhaust pile; on screens with tabs, switch to the next tab; increase ascension level |
| View Map | M | Back / Create | Open the map screen |
Combat
General
| Action | Keyboard | Controller | Function |
|---|---|---|---|
| Announce Block | Ctrl+B | LT+B / L2+Circle | Announce current block |
| Announce Energy | Ctrl+Y | LT+X / L2+Square | Announce current energy |
| Announce Powers | Ctrl+P | LT+Y / L2+Triangle | Announce active powers |
| Announce Intents | Ctrl+I | RT+Y / R2+Triangle | Announce enemy intents |
| Announce Summarized Intents | Alt+I | RT+X / R2+Square | Announce summarized enemy intents |
| View Draw Pile | A | LT+LB / L2+L1 | View draw pile |
| View Discard Pile | S | RT+RB / R2+R1 | View discard pile |
| Release Card | Down Arrow | — | Drop a held card |
Combatant Status (1–12)
Announce the status of a combatant by position. Each slot has its own binding so you can rebind individually.
| Slot | Keyboard |
|---|---|
| 1–9 | 1, 2, 3, 4, 5, 6, 7, 8, 9 |
| 10 | 0 |
| 11 | - (minus) |
| 12 | = (equals) |
Combatant Intent (1–12)
Announce the intent of a combatant by position. Each slot has its own binding.
| Slot | Keyboard |
|---|---|
| 1–9 | Shift+1 … Shift+9 |
| 10 | Shift+0 |
| 11 | Shift+- |
| 12 | Shift+= |
Map
Points of Interest
| Action | Keyboard | Controller | Function |
|---|---|---|---|
| Previous Point of Interest | , (comma) | LT+Right Stick Left / L2+Right Stick Left | Jump to previous point of interest |
| Next Point of Interest | . (period) | LT+Right Stick Right / L2+Right Stick Right | Jump to next point of interest |
| Toggle Point of Interest Mode | \ (backslash) | LT+Right Stick Up / L2+Right Stick Up | Toggle between reachable and all points of interest |
Markers
| Action | Keyboard | Controller | Function |
|---|---|---|---|
| Toggle Current Marker | / (slash) | — | Mark or unmark the current map node |
| Clear All Markers | Ctrl+Shift+/ | — | Remove all map markers |
Mod
| Action | Keyboard | Controller | Function |
|---|---|---|---|
| Help | F1 | LT+Back / L2+Create | Show context-sensitive help for the current screen |
| Mod Settings | Ctrl+M | LT+Start / L2+Options | Open mod settings menu |
| Reset Bindings | Ctrl+Shift+R | — | Reset all mod keybindings to defaults |
| Jump to First Element | Home | — | Jump to the first focusable element on the current screen |
| Jump to Last Element | End | — | Jump to the last focusable element on the current screen |
| Dev Console | ` (backtick) | — | Open the developer console |
| Report Issue | F2 | — | Open an issue-reporting prompt |
Always-On Hotkeys
These bindings are not part of the keybinding tree and cannot be rebound — they’re special hotkeys that work even when accessibility is turned off so you can flip the mod on without sighted help.
| Action | Keyboard | Controller | Function |
|---|---|---|---|
| Toggle Accessibility | Ctrl+Shift+A | — | Turn the mod on or off (requires a game restart to take effect) |
Multiplayer
Say the Spire 2 has full multiplayer support. The mod markse itself as not effecting multiplayer, so those you are playing with won’t require it to be installed. This page provides a general overview of the multiplayer features Say the Spire 2 supports.
Lobby
After selecting a game mode and character, you enter the multiplayer lobby. The lobby buffer shows all connected players with their character and ready status. You can cycle to it with the buffer navigation keys.
The mod announces:
- Players joining and leaving the lobby
- Players changing their character
- Ready/unready state changes
- When all players are ready
Character buttons show how many other players have selected the same character.
Expanded Screens
You can click on a player in multiplayer to view their expanded screen, which shows you their hand, deck, potions, and relics. Either click on their creature in the creature row in combat, or click on their creature below the relics bar out of combat to access this.
Voting
Map Voting
When choosing the next map node, all players vote. The mod announces:
- Which player voted for which node (with coordinates)
- The final destination when travel begins
Event Voting
Shared events require all players to vote on options. The mod announces:
- “Shared event” prefix on event descriptions
- Which player voted for which option
- The chosen option result
Act Ready-Up
After rewards, players ready up to proceed to the next act. The mod announces when other players are ready and when all players are ready.
Combat
Remote Player Info
When focusing another player’s creature in the creature row, the player buffer shows their full info: HP, block, energy, gold, card pile counts, and powers — the same info you see for yourself.
Card Plays and Potions
The mod can announce when other players play cards or use potions. By default, your own plays are silent (you know what you played) and other players’ plays are announced. These can be toggled in the event settings.
End Turn
The mod announces when other players end their turn or cancel their end turn decision.
Expanded Player View
Press Confirm on a player creature in the creature row to open their expanded view, showing their full deck, relics, and potions with position announcements.
Rest Site (Mend)
When using the Mend option to heal another player, focusing each player character announces their name and current HP.
Settings
All multiplayer events can be toggled individually in the mod settings under Events. Each event with creature sources has a Sources subcategory where you can enable/disable announcements for:
- Current Player — your own actions
- Other Players — other players’ actions
- Enemies — enemy actions
Events only announce sources that the game provides visual feedback for. For example, gold changes are only shown for the current player, so “Other Players” isn’t available for gold events.
Settings
Press Ctrl+M (keyboard), R2+Start (Xbox), or RT+Start (PS5) to open the mod settings screen from anywhere in the game.
Top-Level Categories
- Advanced — Verbose Logging and Performance Profiling toggles for debugging the mod itself, plus the UI Enhancements sub-category (toggles for individual UI improvements the mod adds — auto-focus, bundle preview, keep summons focusable, and so on, one entry per affected screen).
- Map — map navigation behavior (auto-advance to choice nodes, read intermediate nodes when going backward, announce current location when the map opens), with a Points of Interest sub-category for which POI types are exposed when navigating by POI (Elite, Shop, Treasure, Rest Site, Boss, Ancient, Quest-marked, etc.).
- Speech — which speech backend the mod uses, plus per-backend tuning (rate, volume, voice).
- Announcements — global toggles for each announcement type (Tooltip, Position, etc.) and any settings the announcement type itself exposes (e.g. Verbose mode, Include Prefix). These are the defaults that per-element overrides inherit from.
- UI — a tree with one entry per element type the mod knows about (Creature, Card, Relic, Potion, Map Node, etc.). Each entry has its own Announcements list where you can override the globals just for that element type and reorder how its announcements are spoken.
- Events — one entry per event the mod can announce (cards played, HP changes, gold gained, turn changes, etc.), visually grouped into Combat, Cards, Resources, Multiplayer, and Other. See Event Settings.
- Keybindings — every action the mod exposes, grouped into categories (Combat, Map, Markers, Buffers, Navigation, Run Information, etc.). See Keybindings.
Per-Element Announcement Overrides
Every UI element type (creature, card, relic, potion, map node, etc.) has its own Announcements list under UI. The list contains one entry per announcement that element supports — for example a creature’s announcements include Label, Type, HP, Block, Energy, Stars, Cards in Hand, Monster Intents, and so on, in the order they’re spoken when you focus the element.
What’s on an element’s Announcements screen
The first item on the screen is a Reset to defaults button. Activating it clears every override under that element back to “inherit”, and restores the original announcement order.
After that comes one row per announcement. Each row is a horizontal group of three buttons:
- Configure — opens a screen with that announcement’s settings. The settings are the same ones you see at the global level (Announce, Verbose, Include Prefix, etc.), but rendered as per-element overrides — they inherit from the global setting until you change one, after which they remember your explicit choice for this element type only. There is also a Reset to defaults button at the top of the configure screen, that resets only that announcement back to inheriting.
- Move Up — moves this row above the row before it. Focus stays on the Move Up button so you can press it repeatedly to keep moving the row up.
- Move Down — same, but downward.
When you arrow up or down onto a row, the mod announces the row name (e.g. “Label horizontal bar”), the focused button within the row, and the row’s position in the list (e.g. “1 of 9”). Use Left and Right to move between the three buttons within the row.
When you move a row, the mod tells you where it landed — “moved between Block and Energy”, “moved before Type”, “moved after Cards in Hand”, etc. The new order is saved immediately and persists across game launches. Adding new announcement types in a future mod update will slot them into your saved order at their canonical position rather than dumping them at the bottom.
Event Settings
Each event type has its own category with at least:
- Announce — speak the event when it happens.
- Add to buffer — log it into the events buffer so you can review it later with the buffer controls.
Some events expose extra settings on top of those, like Include Totals (running totals on Block/Gold) or Show Round Number (on the Player Turn Start event).
Source Filtering
Events that involve a creature have a Sources sub-category with toggles for who’s allowed to trigger an announcement:
- Current Player — your own actions
- Other Players — other players’ actions in multiplayer
- Enemies — enemy actions
The mod only shows source toggles the game itself provides visual feedback for, so different events will have different combinations of these.
Speech Settings
The speech category controls how the mod talks to you.
- Speech Handler — picks the speech backend. Auto picks the first one that’s working on your system. Prism is a unified abstraction that talks to NVDA, JAWS, SAPI, OneCore, etc. behind the scenes. SAPI uses Windows’ built-in speech directly. Clipboard copies output to the clipboard instead of speaking it.
- Per-handler settings — appear underneath. Prism has a Backend dropdown (which screen reader / TTS engine to pin it to). SAPI has Rate, Volume, and Voice.
Keybindings
The Keybindings category holds every action the mod exposes, grouped by purpose (Combat, Map, Markers, Buffers, Navigation, Run Information, Mod, etc.). Each action is a button that opens a binding list screen for that action.
On a binding list screen you can:
- Add Keyboard Binding — listens for a keystroke to add as a new binding for this action.
- Add Controller Binding — listens for a controller button.
- Replace — replaces an existing binding for this action with a new one.
- Delete — removes a binding.
Every action can have any number of keyboard or controller bindings. There’s also a top-level Reset to defaults button on the Keybindings screen if you want to wipe your changes.
Change Log
V1.0.3
- Fixed a bug where the Say the Spire version announcement in the main menu could repeat infinitely if the logo was skipped and there was no mod update available.
- Added buttons in the mod menu for Discord and Patreon.
- Clarified the label for the Combat Rewards Screen under advanced mod settings/UI Enhancements to explicitly say what it does (specifically adds the skip button.)
- Split the card rewards screen UI enhancements toggle into two: One for the focus fix and one specifically for the card reward alternatives (skip, reroll, sacrifice, etc.)
V1.0.2
- Fixed a bug where you could focus unreachable map nodes with the game cursor (thanks @amerikrainian for the pr).
- Fixed a bug where sliders in the game settings screen could have incorrect position readouts (language dropdown was reading as “15 of 15” even though it was first in the list, for example.)
- Fixed the Check for Updates at Launch checkbox in mod settings being at the wrong position in the list; it is now positioned at the bottom.
V1.0.1
This is an emergency patch to fix an issue where you could not select characters other than Ironclad. This was caused by a change in the game’s controller logic on the character select screen interacting with our mod’s controller focusing logic in an unintended way.
V1.0.0
- Replaced the Tolk screen-reader library with Prism. Prism is similar to Tolk but supports more screenreaders and is actively being updated. Please let me know if there are any issues with your prefered output method.
- Added machine translations for all remaining languages. Please let me know if there are any issues with the translations. I will accept contributions with fixes.
- The mod now checks GitHub for a newer release at launch and announces it alongside the version. Disable via the new “Check for Updates on Launch” toggle at the top of mod settings.
- Added support for the bestiary screen on the beta branch.
- You can now adjust the mod enhancements to UI from the advanced settings category. This allows you to toggle settings that adjust game UI focus, such as focus rewiring on the combat screen. It is highly recommended that you leave all of these enabled.
- Home and end now work on many game screens to jump to the first or last element of the current container (hand, menu items, etc.) This will not work on certain screens or in places where it wouldn’t make sense (for example when hovering the hp label in combat.)
- Fixed the Crystal Sphere event leaking size information about entirely hidden objects.
- Cells for the crystal sphere event now have their own dedicated UI category, allowing for their individual settings to be configured. Previously they were being categorized as buttons, which lead to some confusing behavior.
- Cards, relics, and potions shown on the epoch unlock screens are now focusable with keyboard / controller and read out via the screen reader.
- Added a “Keep Summoned Creatures Focusable” setting to the UI Enhancements category (defaults to enabled.) When enabled, it prevents the game from arbitrarily hiding summoned creatures (this usually occurs in multiplayer.)
- The credits screen now reads aloud automatically as it scrolls.
- Fixed a bug where the Announce Act Boss keybinding would only report the first boss of the current act even when there were more available.
V0.5.2
- Added partial Russian localization (thanks to @darrthscorrp.)
- Restored the missing owner readout on summoned creatures (such as Osty). this regression was accidentally introduced in the previous patch.
- Finally fixed a bug where you could not properly target the fake merchant with a foul potion.
- Fixed a bug where controller input would not be processed until a keyboard input was pressed first.
- Fixed a bug where you could access the custom and daily run screens before actually unlocking them.
- Various fixes thanks to @amerikrainian:
- Added badges and relic acquisition info to run history
- Fixed powers sometimes not showing their correct current value (for example Hardened Shell.)
- Added facing direction in the player buffer and a facing changed event for fights where you are surrounded (for example the crab boss in Act 2.)
- Fixed custom runs becoming unresponsive if you used either the Draft or Sealed Deck modifiers.
- Added focusable buttons for the alternative card reward options (skip, reroll, sacrifice, etc.) this behavior was already supported but you needed to use a shortcut to access them. The buttons have been added for a better user experience.
- The proceed button is now focusable in the rewards list (can be pressed instead of using the proceed shortcut.)
V0.5.1
Due to the significant refactoring to how UI element configuration works, some of your saved settings will not carry over to this version of the mod. sorry for the inconvenience. All functionality is still present but you will have to reconfigure it.
- The focus-string system (text read out when you focus abutton, card, etc) has been reworked from a fixed template into a composable set of “announcements” that you can toggle, reorder, and customize individually. Each piece of information an element reads out — label, type, HP, block, intents, tooltip, price, position, etc. — is now its own announcement with its own settings.
- Every element type (card, creature, button, relic, potion, shop item, map node, keybinding, …) now has an Announcements tree under
UI/<element>/Announcements. Each announcement in that tree is configurable independently and inherits its values from a global default unless you change it. - You can now reorder the pieces of an element’s focus string. Each announcement in an element’s Announcements tree is a row with Configure / Move Up / Move Down buttons. Use this to (for example) put monster intent before HP on creatures, or put price first on shop items. The new position is spoken as “moved between X and Y”, “moved before X”, or “moved after X”.
- A subset of announcements (Label, Position, Selected, Selection Count, Status, Subtype, Tooltip, Type, Voters) also appear in a top-level Announcements tree so you can toggle them across the whole game without setting per-element overrides. The more context-specific announcements (HP, energy, price, monster intents, etc.) are only configurable per element.
- Each per-element Announcements tree has a Reset to Defaults action that clears your overrides back to inheriting the global value.
- Map node focus strings are now built from separate announcements (marked, free travel, node state, voter list, marker guidance) so each can be toggled or reordered.
- Focused player creatures now read their current energy, stars, and cards-in-hand alongside HP and block.
- The “Announce Intent Before HP” setting for creatures is gone — use Move Up on the Monster Intents row under UI/Creature/Announcements instead.
- Fixed a bug where the events buffer would keep disappearing mid run.
- Fixed a bug causing a crash in the beta version whenever the mod would try to view any information on creatures (players or monsters.) this only occurs for some users due to weirdness caused by inconsistent beta branch rollouts from Steam.
- Added propper support for the card preview event (triggers when a card is briefly shown, such as when a card is enchanted with Replay via the Hidden Gem card.)
- Added a Card Enchanted event for when a card gains an enchantment. Note that there doesn’t seem to be any visual feedback for when cards gain afflictions from the game itself, so I didn’t add a specific event for it.
- Various fixes, thanks to @amerikrainian:
- Fixed voters missing from event option and treasure room relics in multiplayer.
- Fixed creature owner missing on summoned creatures in multiplayer.
- Added support for score badge reading on game over screen.
- Fixed card upgrade buffer crash in beta branch.
- Fixed card compendium sort buttons to properly read out ascending/descending state changes.
- Fixed map screen stale data/crash bug in beta branch.
V0.4.1
- Fixed an incorrect localization string that was causing positions to be read out as “row y, column x” instead of “x, y”. All positions should be in the form column, row.
- Fixed an issue with the hand card select screen where pressing down from the creature row would not focus the first selected card if the hand row was empty.
- Split card discarded and card added to discard pile into separate events that now correctly announce the actual thing that happened. For example, discarding a card with Survivor’s effect will read as “Strike discarded” instead of “Strike added to discard pile.”
- Split the unclear “Card Pile” event into individual card events.
- Events in settings are now grouped into categories for easier navigation.
V0.4.0
- Significantly refactored the code to allow more of the mod’s text to be localized. This should allow most, if not all, text to be localized for real this time. I suspect some strings may be still missing though, please report any that are.
- Added better logging for some errors that may occur in rare circumstances (failed Harmony patches to game methods, etc.) If game updates change anything this should make catching it easier.
- The keybindings in settings are now grouped into categories to make browsing the list much easier (thanks to @amerikrainian).
- Added propper support for the card compendium thanks to @amerikrainian.
- Added a show enemy intent setting to the enemy moves combat event. This will announce the intent of the enemy’s move at the start of its turn.
- Added player turn start, player turn end, enemy turn start, enemy turn end, and show rounds settings to the turns event.
- Added help messages to the hand select screen and the Crystal Sphere divination event.
- Added support for map nodes that require flight thanks to @amerikrainian (for example given by the Winged Boots relic in the beta branch.)
- Added support for the dev console (use ` on any screen to access it by default.)
- Added support for relic vote announcements as well as announcements of map node votes when focusing a map node (thanks @amerikrainian)
- Added badges to leaderboard screen (thanks @amerikrainian)
- Fixed a bug where the map viewer controls would take priority on screens that opened while the map screen was also open, preventing access to buffers.
- Fixed a bug where the position information for creatures in combat (mostly for other players and temporary summons) would often be incorrect.
- Fixed a bug where downgraded cards were not being properly read out.
- Fixed a bug where the card upgrade/downgrade event would not announce the name of the player in multiplayer who actually got the upgrade/downgrade.
V0.3.0
- Fixed an issue where localization was only using English and not the current game language.
- Fixed an issue where the Chinese localization would not load due to using the wrong localization code.
- All mod text should now be localizable (added roughly 120 missing strings to the locale files.)
- The game’s act banner text is now announced (the act name and number is displayed at the start of each act visually.)
- Fixed a bug where card upgrades would be read out at incorrect times (for example, reward screens with upgraded cards would trigger the upgrade event erroniously)
- Various map improvements thanks to @amerikrainian:
- You can now browse points of interest (shops, elites, etc) with dedicated controls.
- You can mark or unmark those points. Doing so will modify the text of map nodes, telling you whether or not that node will lead you towards that target or diverge away from it.
- Various multiplayer improvements and fixes thanks to @amerikrainian:
- Player intents are now read
- Fixed a bug where the player buffer would not properly update to match the current player when unhovering another player.
- Fixed a bug where player names in multiplayer would be read out as their steam ID (a string of numbers) instead of their display name.
- Fixed a bug where player join announcements would not work when hosting a saved game.
- Added several screens thanks to @amerikrainian:
- The daily run screen, including leaderboard, is now fully supported.
- The custom run screen is now fully supported.
- Added support for run history, stats, potion lab, and relics screens in the compendium.
- You can now press f1 for context-sensitive help on any screen. Use the up/down controls to navigate through all available messages on each screen. If a message contains multiple actions, use left/right to browse each action individually.
- Fixed a bug where UI elements that yielded the same text (such as card reward buttons with identical labels) would be treated as the same element.
- Fixed a bug where epochs within each timeline era were listed in reverse order.
- Fixed a bug where controller focus would act strangely in rest sites if you have the ability to choose multiple actions (control focus neighbors were not being continuously updated.)
- Fixed a bug where ascension text on the character select screen would be read before newly focused characters. The text is now also part of the tooltip for the character button.
- Fixed a bug where post-combat rewards were often missing their type and tooltip.
- Fixed a bug where creatures would have misleading potion info when targeting them with potions or cards. For example, with 3 enemies, the first would be labeled “2 of 4” instead of “1 of 3” due to allies being included in the creature count.
V0.2.0
- The mod now has documentation. It can be viewed on the github for the latest version here. Alternatively you can select view Documentation from the mod menu.
- The mod now has a Simplified Chinese localization (thanks to QgSama.) Note that not all text is localized; more text will be localizable in future mod updates.
- Fixed a number of focus issues with potions and relics outside of combat. The potion slots are now properly treated as separate elements and the relics row now wraps properly.
- Fixed players in multiplayer missing most information from their buffers.
- Fixed the hand card selection screen not wrapping horizontally.
- Fixed a bug where the character select screen was not properly removed from memory when it was closed, leading to a number of focus issues when attempting to start more than one run in a single session. Again. I think for real this time.
- Fixed an issue where all card hover tips in buffers were reported as “stolen card”.
- Implemented missing events for Card Played, Potion Used, and End Turn. These default to not reading for the player but reading for other players; this can be configured from event settings.
- You can now press confirm or select on a player in multiplayer to open their expanded screen. this displays their hand, relics, and potions.
- Fixed an issue where power gained announcements for stackless powers (such as Shrink) would not trigger.
- Fixed an issue where certain settings in the settings menu were listed in the wrong order (such as the speech handler selection.)
V0.1.7
- Updated mod manifest to new game format (added
idfield). The mod now works with the latest Slay the Spire 2 update. - Suppressed mouse hover from stealing focus during keyboard and controller navigation. Previously, if the mouse cursor was on screen, it could cause erratic focus jumping. This could happen even if you didn’t have a mouse plugged in or you were using a laptop trackpad for various reasons. Hopefully this fixes the last of the eratic focus issues but please report anything acting oddly.
- Fixed character select screen container announcing “Lobby” in singleplayer (now says “Characters”).
- Fixed an issue where reported map coordinates were inconsistent between various screens (for example multiplayer votes were off by 1 in both x and y.)
V0.1.6
- Emergency fix for a bug introduced in V0.1.5 which caused the shop items to be processed by our mod as generic buttons, making the shop basically unusable.
- fixed an issue where star costs for Regent cards were not including any modifiers (such as Void Form.)
- Fixed an issue where card rewards has their cards reversed.
V0.1.5
- The installer has received significant updates and it is highly recommended that you download the new version of it. You can now choose which version of the mod to install (including test releases.) You can also choose to disable screenreader support in the installer itself; this is for sighted players so they can play with you in multiplayer (everyone must have the same mods installed.)
- Fixed a bug in the installer where it would consider earlier mod versions as updates.
- Fixed controller bindings: View Exhaust / Tab Right now defaults to just RB (was RT+RB, conflicting with View Discard Pile). Note that if you were using an earlier version of the mod, you must update this binding yourself or reset bindings to defaults.
- The card buffer now condenses name, type, and rarity onto the first line (e.g. “Strike, Attack, Basic”). Feedback would be appreciated for this one.
- Added multiplayer lobby accessibility: character select buttons, player list buffer (shows connected players with character and ready status), join/leave/character change announcements, and ready state announcements.
- Added multiplayer voting announcements for map path voting and shared event voting. Announces who voted for what and the final result.
- Added act ready-up announcements (“Waiting for other players”, “All players ready”) and network timeout warnings.
- Added event source filtering: events with creature sources now have per-source-type toggles (Current Player, Other Players, Enemies) under a Sources subcategory in settings. If you don’t want to hear other players losing block for example, you can turn that off. Events from sources the game doesn’t provide visual feedback for are silently dropped in multiplayer (matches game behavior; you don’t see when another player draws a card for example.)
- Multiplayer shared events now announced with “Shared event.” prefix (some events are per user, others require a vote.)
- Fixed Defect orbs not being focusable in multiplayer (was sometimes checking the wrong player’s orbs).
- Fixed various incorrect readouts in multiplayer (such as you losing gold when it was, in fact, another player losing gold.)
- Removed end-of-turn focus suppression that was blocking card popups and other UI. You may still hear the occasional erronious control read out at end of turn as a result, but it is better than the alternative for now.
- Fixed power events: decreasing a power to 0 no longer double-announces (only “lost PowerName” is announced, not both decreased and removed).
- Non-stacking powers (permanent duration, such as Shrink) no longer show misleading -1 stack count in announcements and buffers.
- Stolen cards (Swipe power) now show in the creature buffer as “Stolen card: CardName”.
- Removed the redundant “Announce All Block Lost” setting; “lost all Block” is now always announced when block hits 0.
- switching to the events buffer now jumps to the most recent item.
- Fixed hand card selection screen (e.g. Well Laid Plans retain) to include the selected cards row. You can now arrow down to see selected cards and back up to the hand. Note that these directions are swapped in game too compared to Slay the Spire 1; this isn’t a mod bug.
- Fixed grid position announcements to use coordinate order to (x, y) instead of (y, x). This should also fix inconsistencies with the Crystal Sphere divination event.
- Refactored the focus system to a centralized update loop, fixing issues where container context wasn’t announced when backing out of settings subcategories or when controls moved between containers.
- Fixed Ctrl+Shift+R (Reset Bindings) to reset the mod’s own keybindings instead of the game’s.
- Fixed card and relic buffers not listing rarity on the first item.
- Fixed certain card selection screens not reading (for example the Dreamcatcher relic card reward)
- Grid card selection screens now announce card selected state and how many cards are selected.
- Fixed various focus issues on the mode select screen, as well as mode buttons lacking tooltips.
V0.1.4
- The Python installer has been replaced with one coded in Rust. This should prevent Windows Defender erroniously flagging the installer as a virus and improve stability of the app overall.
- Fixed numerous focus issues when navigating between rows on the combat screen. Creatures and Defect orbs should now consistently be navigable.
- Added position announcements to combat screen rows (e.g. “card 3 of 5”).
- Added left/right wrap-around navigation for the relics row.
- Added support for the Crystal sphere/divination event. I did my best to match what sighted players are able to see but the event is somewhat nonintuitive; any feedback on how I can make this clearer would be greatly appreciated.
- Added “Announce Intent Before HP” setting under UI/Creature. When enabled, creature focus reads intent before HP (e.g. “Slime, attack 7, 50/50 HP” instead of “Slime, 50/50 HP, Intent attack 7”).
- Added a setting for each UI element to toggle position announcements on/off (defaults to on for all.)
- There is now a hotkey to read out all relic counters (keyboard: ctrl+r, controller: rt+back)
- fixed incorrect controller default for view exhaust/tab right (it is now rt+rb as intended.)
- Changed the default keyboard binding for view exhaust/tab right from X to F (A/S/D/F row).
- The map viewer can now be opened during combat, events, and other screens by pressing the map key (M / Back). It starts on the next node ahead and optionally announces your current location.
- Added “Announce Current Location When Map Opens” setting under Map (defaults to on).
- View exhaust/tab right on keyboard is now f instead of x by default.
- Pressing the map key to view the map from anywhere now properly allows you to browse the map with the usual controls.
- Accessibility is now off by default for Workshop installs. The installer automatically enables it. You can also toggle accessibility with Ctrl+Shift+A (requires a game restart to take effect).
V0.1.3
This is an emergency release to fix a bug where any events would not be announced during a run if you started a run from the character select screen. The character select screen was not properly being removed from memory, which was causing an uncaught exception that silently aborted the event queue processing (so it never got to the events to announce them.)
V0.1.2
- Added orb support for the Defect: orbs now read their name, passive/evoke values, and empty slot tooltips. This also fixes a bug where all Defect orbs were reading out as “The Defect”… Oops.
- Added event announcements for orb channeled and orb evoked, with per-type toggles.
- Added timeline top panel shortcut to jump to the first revealable epoch.
- Improved readouts and card prompts for Choose a Card screens (e.g. Survivor discard, Armaments upgrade).
- Added verbose logging toggle under Advanced settings.
- Added per-type toggles for HP change events (announce damage, announce heals).
- Added per-variant toggles for block events (announce gained, announce lost, announce all lost) and a setting to include or hide block totals.
- Added per-type focus string settings to toggle type, subtype, and tooltip announcements for each UI element type (card, relic, potion, creature, etc.)
- Added rarity to relic and potion buffer readouts.
- Improved focus string format for more consistent and informative readouts. For example, if you don’t want to hear that each map node is in fact a map node since you already have context, you can toggle that off.
- Removed colon punctuation from focus string outputs (e.g. “Intent Attack 7” instead of “Intent: Attack 7”). This should flow much smoother now and feel faster.
- Improved performance when processing controller input. This should feel significantly better now; please report if anything breaks as a result.
- Merchant items, rewards, and other wrapped elements now use the same buffer and focus string behavior as their underlying type (e.g. a merchant card reads the same as a regular card).
- Fixed star cost readouts not showing on Regent character cards; energy and star costs are now combined on one line. Regent stars are also included in the player buffer and energy hotkey readouts.
- Fixed various bugs with screen state that could cause stale data or unexpected behavior after saving, quitting, or switching screens. This should hopefully finally get rid of the duplicated event announcements in combat.
- Fixed focus issues during card selection screens. This should fix certain selections not reading, such as choosing a card for Well Laid Plans.
- Added announce boss keybind (Ctrl+N / RT+B) to read the current act boss. Supports double boss in higher ascensions.
- Added announce summarized intents keybind (Alt+I / RT+X) to read total incoming damage from all enemies.
- Added ascension level announcements on the character select screen, reading the level, title, and description when changed.
- Added accessibility for the card pack bundle selection screen (Scrollboxes event). Pack contents are read out, and preview cards can be navigated with left/right.
- Added unlock requirements and tooltip text to the random character button.
- Fixed intent names using internal enum names instead of the game’s localized names.
- Fixed foul potion “throw at merchant” not completing when using keyboard/controller.
- Fixed creature focus not updating when bosses die and resummon in a new form.
- Fixed block lost event not reading when all block was lost with “Announce All Block Lost” disabled but “Announce Block Lost” enabled.
- Fixed empty treasure chest not announcing when opened.
- Changed the default Top Panel keyboard binding from Tab to T.
V0.1.1
- Added jaws config files to improve the overall experience using jaws (silencing of annoying sentinel initialized announcement, propper handling for arrow keys/escape, etc.) These can be installed via the installer or as part of the manual process.
- Added better logging for combat events to hopefully track down a duplicate announcement bug.
- Fixed incorrect localization lookups for map nodes and merchant slots.
- Map nodes now only announce traveled state (IE you have been there before); the reachable and unreachable state announcements were irrelevant and causing confusion.
- Fixed an issue where the controller focus could get stuck on the character select screen if the user moved the cursor to panels that aren’t yet available (such as the ascension panel.)
- Fixed an issue for rest sites where the focus would move in extremely unpredictable ways. The buttons are now properly a navigable row.
- Added events and announcements for card upgraded, obtained card, obtained potion, and obtained relic.
- End of turn Hand Discarded and start of turn Deck Shuffled announcements can now be toggled under the card piles event.
- Mod settings menus are now sorted alphabetically.
- The default keyboard binding for back is now backspace instead of escape to avoid input conflicts. You will have to adjust this keybinding yourself if you have already played the game though as your settings file doesn’t reset to defaults on mod update.
- Fixed an issue where the focus would glitch during the player’s end of turn sequence resulting in readouts of random controls.
- Reordered card label to read as “{name}, {cost}, {type}”; also added setting for verbose costs (when unchecked costs simply read as numbers with no label.)
- Fixed an issue where various event announcements and hotkeys (such as player hp) were reading from stale data. This may also fix duplicate event announcements in combat.
- Fixed an issue where the buffer controls would cause a crash if used during the early access explanation screen.
- Fixed an issue where the read all enemy intents hotkey was only reading the numbers and not the actual intent associated with them. Also cleaned up intent formatting to be more natural (e.g. “Attack 12” instead of “Attack: 12”).
- Fixed an issue where every single card was announce being added to the draw pile when the deck was reshuffled.
Known Issues
- Some users had issues dismissing the tutorial popups when playing their first run. This may be a game bug or possibly the UI just being nonintuitive, but I am investigating. If this happens, close and reopen your game and it should fix it.
Credits
I would like to thank everyone who has tested the mod so far, the feedback has been invaluable and the mod is much better as a result. I would also like to thank those who have directly contributed to the mod:
- Rashad Naqeeb for contributing the Jaws configuration files.
- Amerikrainian for various code contributions, including new map features and a number of multiplayer improvements.
- QgSama for contributing the Simplified Chinese localization.
- Darrthscorrp for contributing the Russian localization.