fix(engine): burn lamp one segment per wait

This commit is contained in:
2026-05-12 20:31:50 -05:00
parent 52fb869976
commit e7b74c827a
2 changed files with 17 additions and 7 deletions
+16 -6
View File
@@ -501,22 +501,32 @@ describe('light/extinguish verbs (implicit lighter)', () => {
expect(texts).toContain('The book is empty.')
})
it('burns two segments on wait and extinguishes on the third wait', () => {
it('burns one segment on each wait and extinguishes when the last segment expires', () => {
const world = w()
let state = initialStateFor(world)
state = { ...state, inventory: [{ id: 'lamp', state: { lit: true, burn: 6 } }] }
const first = dispatch(state, { kind: 'verb-only', verb: 'wait' }, world)
expect(first.state.inventory.find((i) => i.id === 'lamp')?.state['burn']).toBe(4)
expect(first.state.inventory.find((i) => i.id === 'lamp')?.state['burn']).toBe(5)
expect(first.state.inventory.find((i) => i.id === 'lamp')?.state['lit']).toBe(true)
const second = dispatch(first.state, { kind: 'verb-only', verb: 'wait' }, world)
expect(second.state.inventory.find((i) => i.id === 'lamp')?.state['burn']).toBe(2)
expect(second.state.inventory.find((i) => i.id === 'lamp')?.state['burn']).toBe(4)
const third = dispatch(second.state, { kind: 'verb-only', verb: 'wait' }, world)
expect(third.state.inventory.find((i) => i.id === 'lamp')?.state['burn']).toBe(0)
expect(third.state.inventory.find((i) => i.id === 'lamp')?.state['lit']).toBe(false)
expect(third.appended.map((l) => l.text)).toContain('The flame dies.')
expect(third.state.inventory.find((i) => i.id === 'lamp')?.state['burn']).toBe(3)
const fourth = dispatch(third.state, { kind: 'verb-only', verb: 'wait' }, world)
expect(fourth.state.inventory.find((i) => i.id === 'lamp')?.state['burn']).toBe(2)
const fifth = dispatch(fourth.state, { kind: 'verb-only', verb: 'wait' }, world)
expect(fifth.state.inventory.find((i) => i.id === 'lamp')?.state['burn']).toBe(1)
expect(fifth.state.inventory.find((i) => i.id === 'lamp')?.state['lit']).toBe(true)
const sixth = dispatch(fifth.state, { kind: 'verb-only', verb: 'wait' }, world)
expect(sixth.state.inventory.find((i) => i.id === 'lamp')?.state['burn']).toBe(0)
expect(sixth.state.inventory.find((i) => i.id === 'lamp')?.state['lit']).toBe(false)
expect(sixth.appended.map((l) => l.text)).toContain('The flame dies.')
})
it('burns one segment on movement', () => {
+1 -1
View File
@@ -421,7 +421,7 @@ function passOutFromDrunk(state: GameState, world: World, preface: string): Disp
}
function handleWait(state: GameState, world: World): DispatchResult {
const lightTick = advanceLightState(state, 2, world)
const lightTick = advanceLightState(state, 1, world)
return narrate(lightTick.state, [
{ kind: 'narration', text: 'Time passes.' },
...lightTick.lines,