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>
This commit is contained in:
Accessibility Mod
2026-08-01 20:59:04 +02:00
co-authored by Claude Opus 5
parent 9945703fb7
commit da512fc67e
5 changed files with 191 additions and 6 deletions
+13
View File
@@ -141,14 +141,27 @@ local function scenario()
-- Intro sequence: narration / dialogue / message screens vary, so just advance
-- until we land in gameplay.
local sawDialogue = false
local dialogueText
for i = 1, 20 do
if currentState() == "ingame" then
break
end
if currentState() == "ingame_dialogue" and not sawDialogue then
sawDialogue = true
dialogueText = focusText()
-- Exercise response navigation before advancing.
press("down", "dialogue: next response")
press("up", "dialogue: previous response")
end
press("return", "advancing intro (" .. currentState() .. ") " .. i)
wait(10)
end
check("dialogue was described", sawDialogue and dialogueText ~= nil,
"text=" .. tostring(dialogueText))
check("reached gameplay", currentState() == "ingame", "got " .. currentState())
if currentState() == "ingame" then