Game-file footprint unchanged: still one line in main.lua.
The slider turned out to be genuinely generic: modules/slider.lua is a factory,
so one wrapper on it narrates all four users -- craft, refine, trade and
ingame_wait (the wait-N-turns screen). Same leverage as the console.print and
inventoryCursorPopup patches.
The options screens do NOT share it, though: config_menu changes values through
config.increase/config.decrease, so it needed its own descriptor. It reports tab,
option name and value, and its focus key includes the value so left/right
re-announce even though the focused option has not moved.
states/_itemgrid.lua is now shared by inventory, craft, refine and trade, all of
which build a views/inventoryWindow. It stays silent while
confirmationWindowEnabled is set so the slider owns speech during quantity
selection instead of the two fighting.
testbed gains walkTo(), which navigates using the game's own pathfinder rather
than hardcoded direction sequences -- those drift as soon as anything moves the
player. The config test only adjusts a value when the focused option is
demonstrably safe, and puts it straight back.
The slider patch is applied and confirmed by the self-test but not exercised
live: ingame_wait is unreachable in the prologue because tutorial_bed overrides
bed's tryInteractFunction with an empty function by design, and the crafting
screens need an alchemy table and real items. Recorded as a NOTE rather than a
failing check, since it is a property of the game and not of the mod.
25/25 testbed checks, history unit tests passing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Game-file footprint unchanged: still one line in main.lua.
Adds descriptors for actions_menu, worldmap, alchemy_table, journal, character,
inventory, and a shared one for the full-screen prose states (menu_text,
ingame_message, menu_message). The prose states also push their text into the
console history, so the existing review keys walk the manual paragraph by
paragraph rather than delivering it as one unusable utterance.
Two driver improvements, both prompted by real failures the self-test caught:
- menus.getAnyUpvalue finds a file-local across all of a state's functions and
one level into inner closures. Safe because a Lua file-local is a single
shared upvalue. Needed because actions_menu and worldmap build their lists in
open() and never reference them in keypressed, so the named probe function
found nothing. The generic probe path now falls back to this.
- menus.hasUpvalue checks that a local exists rather than that it holds a value.
getUpvalue cannot distinguish 'no such local' from 'declared but currently
nil', which made the self-test report PROBE BROKEN for worldmap, whose
'local options' is nil until the screen is first opened.
patches/popups.lua now stands down for any state that has a descriptor.
inventoryCursorPopup.set only fires when an item is under the cursor, so empty
slots and empty tabs were silent and you could not tell the cursor had moved.
The inventory descriptor reports item-or-empty plus slot and tab instead.
21/21 testbed checks, history unit tests passing.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>