Files
alchemist-accessibility/accessibility/docs
Accessibility ModandClaude Opus 5 da512fc67e Dialogue narration and wall tone retrigger fix
Game-file footprint unchanged: still one line in main.lua.

Wall tones: stop the previous tone per direction before playing the new one.
The tones are 2.33s mono; steps land far faster than that and up to four
directions sound at once, so overlapping them stacked into a continuous drone
instead of reading as a per-step cue. Cutting the old tone also means the
distance/volume you hear always reflects where you are standing now.

ingame_dialogue descriptor: speaks speaker and message on a node change, but
only the response on a selection change -- re-reading the whole speech every
time you move between responses would be unusable.

Two more bugs found by the testbed:

4. Nested states.switch announced in reverse. ingame.open() sees
   world.pendingDialogue and switches straight to ingame_dialogue; because we
   announce after realSwitch returns, the inner announcement fired first and the
   outer one interrupted and clobbered it, so entering a conversation said
   'Game' rather than 'Conversation'. Now we stay quiet if we are no longer the
   current state.

5. The game already numbers response text ('1. (Continue)'), matching the number
   key that picks it, so our own numbering produced '1. 1. (Continue)'.

9/9 testbed checks, history unit tests passing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 20:59:04 +02:00
..

Accessibility mod — documentation

Research and planning for making Sulphur Memories: Alchemist 0.4.2 blind-accessible.

Doc Contents
01-architecture.md How the game is built: states, console, level model, keybindings, where text already exists.
02-hooking-strategy.md How to attach the mod with (near) zero edits to game files.
03-implementation-plan.md Six phases, each independently testable.
04-open-questions.md Decisions needed before/while building.
05-decisions.md Answers given so far, and what they imply. Supersedes Q1/Q2/Q7/Q10.

The short version

Three findings shape everything:

  1. The game is already keyboard-complete. All 28 states implement keypressed; there's a full rebindable-keys system with contexts. The accessibility gap is that nothing announces what is focused — not that things are unreachable. This makes the job much smaller than a typical mouse-driven game.

  2. The game already writes the text we need to speak. console.print is a single chokepoint for all log messages. level.getCursorMessage() returns tile/creature descriptions. getCursorPopupStats() feeds the item popups in five screens. We are mostly re-routing existing strings to speech, not writing a description engine.

  3. Everything is a required singleton, and debug.getupvalue works. Module functions can be monkey-patched in place, and the file-local selectedOption variables in menu states are readable from outside. A one-line bootstrap in main.lua is the only unavoidable edit.

Proposed footprint: 1–3 lines added to main.lua, everything else new files under accessibility/. A git baseline tagged vanilla-0.4.2 makes re-application on future versions a rebase.