Phase 4 complete + Phase 5: status, popups, damage alerts
Game-file footprint unchanged: still one line in main.lua. All 23 states now have descriptors; 5 patches applied. Final two descriptors: - keybindings_menu has two panels (commands and keys) with independent selection, so it reads currentlyActiveWindow to decide which one has focus. Announcing the wrong panel's row would be actively misleading, since the two lists are unrelated. - research is a 2D node graph rather than a list, and its nodes are drawn as icons with no text label, so the id is the only identifier available. What actually matters is researched / locked / cannot afford / available: without the affordability part the screen is unusable by ear, because pressing enter on an unaffordable node silently does nothing. status.lua adds two pull keys -- ' for health and active effects, , for the current action -- plus unprompted damage alerts. Damage is polled from actor.hp rather than hooked. ingame.checkInterruptions exists but only fires for interruptions during queued movement, so damage taken on your own turn never reaches it. Polling catches every source (combat, poison, fire, falling) with no game edit. Damage speaks immediately and interrupts; healing queues, since it is worth knowing but never urgent. patches/popupstack.lua wraps popupStack.add, the single entry point for loot, recipe, lore, map, quest, tutorial and bestiary popups. None of these go through console.print, so they were entirely silent before. speech.immediate now logs to the console like queued speech does. It bypasses the frame queue and so also bypassed the flush-time logger, which meant damage alerts fired correctly but were invisible in the testbed transcript. Prefixes are now: ! interrupt, * immediate, space queued. 26/26 testbed checks, history unit tests passing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
50b226620e
commit
96ec79ed75
@@ -3,11 +3,11 @@
|
||||
**Read this first on any handoff.** Living document: update it whenever state changes, before ending a turn.
|
||||
|
||||
Last updated: 2026-08-01 · Currently: **Phases 0–3 done + menus/dialogue.
|
||||
Phase 4 mostly done. Phase 5 (status, popups) next.**
|
||||
Phases 4-5 done. Remaining: polish, mod settings, distribution.**
|
||||
|
||||
**Game is playable start-to-finish by ear** from main menu through the intro
|
||||
conversation into gameplay, plus journal, character, actions and inventory —
|
||||
verified by the testbed, **25/25 checks**.
|
||||
verified by the testbed, **26/26 checks**.
|
||||
|
||||
### Run the testbed (do this after any change)
|
||||
```
|
||||
@@ -135,6 +135,8 @@ and by Talon at the keyboard (wall tones).
|
||||
| `PageUp` / `PageDown` | Tracker: previous / next **kind** |
|
||||
| `Shift+PageUp` / `Shift+PageDown` | Tracker: previous / next **instance** |
|
||||
| `Home` | Tracker: distance, direction and path length to current instance |
|
||||
| `'` | Health and active effects |
|
||||
| `,` | Current selected action |
|
||||
|
||||
Game keys worth knowing: **`x`** enters examine mode (not `e`), `f` finds exits
|
||||
while examining, `j` journal, `i` inventory, `c` character, `a` actions menu.
|
||||
@@ -390,8 +392,46 @@ alchemy table and real items. The patch is confirmed *applied* by the self-test;
|
||||
the testbed has the walk-to-bed machinery ready (`walkTo`, tracker lookup) for
|
||||
when a real bed is reachable.
|
||||
|
||||
### Done — Phase 4 complete + Phase 5: status, popups, damage alerts
|
||||
|
||||
**All 23 states now have descriptors. 5 patches. 26/26 testbed checks.**
|
||||
Final two descriptors:
|
||||
|
||||
- **`keybindings_menu`** — two panels (commands / keys) with independent
|
||||
selection; `currentlyActiveWindow` says which has focus. Announcing the wrong
|
||||
panel's row would be actively misleading, as the lists are unrelated.
|
||||
- **`research`** — a 2D node graph, not a list. Nodes are icons with **no text
|
||||
label**, so the id is the only identifier; the useful facts are
|
||||
researched / locked / cannot afford / available. Without the affordability
|
||||
part the screen is unusable by ear, since enter on an unaffordable node
|
||||
silently does nothing.
|
||||
|
||||
**Phase 5 — `accessibility/status.lua`:**
|
||||
|
||||
| Key | Action |
|
||||
|---|---|
|
||||
| `'` | Health + active effects — `Health 20 of 20. no active effects` |
|
||||
| `,` | Current action — `Action: Interact` |
|
||||
|
||||
Plus **unprompted damage alerts**, polled from `actor.hp`:
|
||||
`Hit, minus 3, health 17 of 20` (immediate + interrupting), and
|
||||
`Healed 3, health 20 of 20` (queued — worth knowing, never urgent).
|
||||
|
||||
⚠ Damage is **polled, not hooked**. `ingame.checkInterruptions(hpLoss)` exists
|
||||
but only fires for interruptions during *queued movement* — damage taken on your
|
||||
own turn never reaches it. Watching `hp` catches every source (combat, poison,
|
||||
fire, falling) with no game edit.
|
||||
|
||||
**`patches/popupstack.lua`** wraps `popupStack.add`, the single entry point for
|
||||
loot / recipe / lore / map / quest / tutorial / bestiary popups. None of these go
|
||||
through `console.print`, so they were completely silent before.
|
||||
|
||||
**`speech.immediate` now logs too** (`[speech]*`). It bypasses the frame queue,
|
||||
so it also bypassed the flush-time logger — meaning damage alerts fired but were
|
||||
invisible in the testbed transcript. Log prefixes: `!` interrupt, `*` immediate,
|
||||
` ` queued.
|
||||
|
||||
### Known gaps (next up)
|
||||
- **Phase 4 remainder**: `research` and `keybindings_menu` have no descriptors.
|
||||
- **Phase 5**: player status key (HP, statuses, current action), popup
|
||||
announcements (`popupStack.add`), damage alerts
|
||||
(`ingame.checkInterruptions`), mod settings.
|
||||
|
||||
Reference in New Issue
Block a user