The setup is unusual enough to need its own page, and the facts were scattered across scratch.md, CLAUDE.md and publish.sh: the mod is developed inside a copy of a commercial game, so the dev tree deliberately has no remote and publishing means rebuilding a filtered repo and force-pushing that instead. docs/00-dev-setup.md covers the two-tree arrangement and which one you are in, prerequisites and why the game must be an extracted folder rather than a .love (ffi.load goes through the OS loader), building a dev tree from scratch including the vanilla-0.4.2 baseline tag and the one main.lua line, the everyday commands, the save location, reading the [speech] console and the startup self-test, and the publish flow with its leak check. Linked from CLAUDE.md and the docs index. No code change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Accessibility mod — Sulphur Memories: Alchemist
Blind-accessibility mod adding screen-reader speech, an object tracker, tile exploration and directional wall tones.
Speech goes through Tolk, so it uses your running screen reader (NVDA, JAWS, System Access) and falls back to SAPI 5 if none is running.
Running
"C:\Program Files\LOVE\love.exe" "D:\code\Sulphur Memories Alchemist 0.4.2 sanctified"
Use lovec.exe instead of love.exe to get a console window — every spoken line
is mirrored there, which is useful for reporting bugs.
The TTS libraries live in accessibility/lib/ and are loaded by absolute path,
so nothing needs installing or copying into Program Files.
If speech does not work, check the console for the startup self-test:
[accessibility] TTS: available
[accessibility] speech channel: yes
speech channel: NO means Tolk loaded but found no screen reader and no SAPI.
Keys added by the mod
All of these are in addition to the game's own controls, and none of them replace a key the game uses.
Reading the message log
| Key | Action |
|---|---|
[ |
Previous message |
] |
Next message |
Shift+[ |
Oldest message |
Shift+] |
Newest message (and resume following new messages) |
\ |
Repeat the current message |
Shift+\ |
Copy the current message to the clipboard |
New messages are spoken automatically. Pressing any key that does something in
the game cancels whatever is still queued, so you are never stuck listening to a
backlog. While you are moving through the history, new messages do not drag
the cursor away — press Shift+] to return to the newest.
Looking around
| Key | Action |
|---|---|
/ |
Scan all eight neighbouring tiles, clockwise from north |
Shift+/ |
Cycle automatic announcements of what comes in and out of view |
; |
Where am I — area name, in-game date and time, coordinates |
Ctrl + numpad 1–9 |
Describe the tile in that direction without moving |
Ctrl + numpad 5 |
Describe the tile you are standing on |
Announcing things as they come into view (Shift+/)
/ tells you what is around you now. Shift+/ decides how much of that
happens by itself as you walk, cycling three settings:
- View announcements when you stop (the default) — changes pile up while you are moving and are read out once you have stood still for a moment. A single step reports as soon as the step lands. A ten-tile walk gives you one combined summary at the end rather than ten reports on top of each other, and it is a net change: something that came into view halfway along and went out again before you stopped is not mentioned.
- View announcements on every step — each step reports its own change. Best when you are creeping along carefully; too talkative for crossing a room.
- View announcements off.
You hear things arriving — In view: a rat, 4 tiles north-east. barrel, 3, nearest 2 tiles east — and creatures leaving: Out of view: a rat. Only
creatures are reported when they leave. Furniture drops out of sight constantly
as walls come between you and it, and being told the bed is out of view every
other step would bury everything useful; a creature you can no longer see is
worth knowing about.
These announcements are queued rather than urgent, so anything you asked for yourself is spoken first, and any key that acts in the game clears them.
Nothing outside your current field of view is ever reported.
The game's own examine mode (x) is also fully spoken: the arrow keys move a
cursor around the map and each tile is described with its distance and direction
from you. Press f in examine mode to jump between exits.
Object tracker
Finds everything you have seen, sorted by distance.
| Key | Action |
|---|---|
Ctrl+PageUp / Ctrl+PageDown |
Previous / next category |
PageUp / PageDown |
Previous / next kind of thing in that category |
Shift+PageUp / Shift+PageDown |
Previous / next instance of that kind |
Home |
Distance, direction, and number of steps by path |
Ctrl+Home |
Walk to it |
Categories: Creatures, Items, Alchemy, Interactables, Exits, Terrain features.
So Ctrl+PageDown to reach "Creatures", PageDown to move between rat / beetle
/ guard, and Shift+PageDown to step through the individual rats. Home gives
you the walking distance, which indoors is often very different from the
straight-line distance.
Ctrl+Home does exactly what left-clicking the tile does with a mouse: it queues
a walk along the game's own path. If the thing itself cannot be stood on — a
creature, a chest, a bed — you walk to the nearest tile beside it instead, and
the announcement says "next to" rather than "to". As with a mouse click, the walk
stops early if something interrupts you, and while an enemy is in view the game
only ever commits one step at a time.
Your selection sticks. The list is rebuilt and re-sorted by distance every turn, but the tracker follows the thing you picked rather than the slot it was in, so a rat you are tracking stays selected as it moves around. It is only let go when it genuinely stops being visible.
The tracker only ever reports things you have actually seen.
The journal (j)
The journal has three parts, and all three are spoken:
| Key | Moves |
|---|---|
q / e |
Between tabs — Quests, Lore, Bestiary, Components, Recipes, Tutorials |
| Up / Down | Between entries in the current tab |
| Left / Right | Between pages of the selected entry |
Selecting an entry reads its title, its position in the list, and then the text of the page itself. The tab name is only spoken when you change tabs, and the title only when you change entry, so flipping pages doesn't make you sit through the heading again.
Long entries run to several pages; you are told page 2 of 3 when there is more
than one. The page text also goes into the message history, so [ and ] will
walk back through it and \ re-reads a line — useful for a long lore entry you
want to take in a piece at a time.
Your character
| Key | Action |
|---|---|
' |
Health and active effects |
, |
Currently selected action |
You are also told automatically when you take damage or are healed.
Wall tones
Each step you take, a tone sounds from the direction of any wall within five tiles, positioned in 3D so you can hear where it is. Further walls are louder.
Reporting problems
Run with lovec.exe and include the console output. Lines beginning [speech]
show exactly what was spoken and when:
[speech]!— interrupted whatever was being said[speech]*— urgent alert, spoken immediately[speech]— queued normally
If something is silent that should not be, that is the most useful thing to report, together with the screen you were on and the key you pressed.
For developers
See accessibility/docs/ — start with docs/README.md, and read
docs/scratch.md first if you are picking the work up mid-stream.