Phase 2: tile examination and surroundings
Game-file footprint unchanged: still one line in main.lua. - describe.lua: shared spatial formatting. 8-point compass and Chebyshev distance, since the game moves 8-directionally and Euclidean would overstate diagonal travel. Verbosity setting, because sweeping eight neighbours and inspecting a single tile want different amounts of detail. - states/ingame_observe.lua: narrates the game's existing examine cursor. - surroundings.lua: probe one direction, scan all eight, or report location, without moving anything or touching game state. - patches/popups.lua: wraps inventoryCursorPopup.set, covering inventory, craft, refine and trade in a single patch. Q3 resolved as augment rather than relay: the game's descriptions carry no position, which is fine on screen and useless by ear, so distance and direction are appended. Examine mode is polled rather than driven by levelCursorPopup. That popup is set from an animation-completion callback, so unless the player has enabled the game's quickExaminationPopup option the text arrives a full keypress late -- in testing you heard the previous tile while standing on the next. Polling level.cursorX/Y is same-frame and setting-independent. hotkeys.isCtrlDown/isShiftDown are now overridable fields rather than direct love.keyboard calls: real hardware state cannot be faked by love.event.push, so without that seam every modifier-gated hotkey would be untestable. 11/11 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
da512fc67e
commit
8b1eb44c38
@@ -50,16 +50,30 @@ end
|
||||
|
||||
-- Presses a key and waits long enough for the event to be pumped, handled, and
|
||||
-- for our end-of-frame speech flush to run.
|
||||
local function press(scancode, note)
|
||||
local function press(scancode, note, mods)
|
||||
local before = focusText()
|
||||
print(string.format("[testbed] (%s) press %-8s focus_before=%s %s",
|
||||
currentState(), scancode, before and ('"' .. before .. '"') or "nil", note or ""))
|
||||
print(string.format("[testbed] (%s) press %-8s%s focus_before=%s %s",
|
||||
currentState(), scancode,
|
||||
mods and (mods.ctrl and " +ctrl" or mods.shift and " +shift" or "") or "",
|
||||
before and ('"' .. before .. '"') or "nil", note or ""))
|
||||
|
||||
-- Modifier state is read from real hardware, which synthetic events cannot
|
||||
-- affect -- so override the hotkey layer's modifier probes for this press.
|
||||
local hotkeys = require("accessibility.hotkeys")
|
||||
local realCtrl, realShift = hotkeys.isCtrlDown, hotkeys.isShiftDown
|
||||
|
||||
if mods then
|
||||
hotkeys.isCtrlDown = function() return mods.ctrl == true end
|
||||
hotkeys.isShiftDown = function() return mods.shift == true end
|
||||
end
|
||||
|
||||
love.event.push("keypressed", scancode, scancode, false)
|
||||
love.event.push("keyreleased", scancode, scancode)
|
||||
|
||||
wait(6)
|
||||
|
||||
hotkeys.isCtrlDown, hotkeys.isShiftDown = realCtrl, realShift
|
||||
|
||||
local after = focusText()
|
||||
print(string.format("[testbed] -> state=%s focus_after=%s",
|
||||
currentState(), after and ('"' .. after .. '"') or "nil"))
|
||||
@@ -202,6 +216,28 @@ local function scenario()
|
||||
press("[", "review previous")
|
||||
press("]", "review next")
|
||||
press("\\", "repeat current")
|
||||
|
||||
-- Phase 2: surroundings probing (no state change, no game side effects).
|
||||
press("/", "scan all eight neighbours")
|
||||
press(";", "where am I")
|
||||
press("kp8", "probe north", {ctrl = true})
|
||||
press("kp6", "probe east", {ctrl = true})
|
||||
press("kp5", "probe standing-on", {ctrl = true})
|
||||
|
||||
-- The game's own examine mode, now narrated via levelCursorPopup.
|
||||
press("x", "enter examine mode")
|
||||
wait(10)
|
||||
check("entered examine mode", currentState() == "ingame_observe",
|
||||
"got " .. currentState())
|
||||
|
||||
if currentState() == "ingame_observe" then
|
||||
press("right", "examine: cursor east")
|
||||
press("down", "examine: cursor south")
|
||||
press("escape", "leave examine mode")
|
||||
wait(10)
|
||||
check("left examine mode", currentState() == "ingame",
|
||||
"got " .. currentState())
|
||||
end
|
||||
end
|
||||
|
||||
print(string.format("[testbed] === %d checks, %d failures ===", checks, failures))
|
||||
|
||||
Reference in New Issue
Block a user