Tomb Raider III demo (India / Jungle)

Core Design's 1998 Windows playable demo, tr3_demo_01.exe from tombraiderchronicles.com. The installer archive is extracted statically (7z for the WinZip SFX, then unshield -O on data1.cab); provenance, URLs and hashes are in test/binaries/candidates/tomb-raider-3-demo/provenance.json. Registry id tomb_raider_3_demo (localhost-only).

Route (headless, default 200 ms/batch clock)

node test/run.js --app=tomb_raider_3_demo --quiet-api --quiet-blocks \
  --max-seconds=90 --max-batches=68001 --stuck-after=0 --no-close \
  --input=8:dlg-cmd:1,40:dlg-cmd:1,18000:keydown:13,18100:keyup:13,\
19000:keydown:13,19100:keyup:13,62000:keydown:38,67000:keyup:38,68000:png:out.png
batch screen
~5 dialog 110, "Welcome to the playable demo" (OK = 1)
~35 dialog 115, setup: Direct3D HAL, 640x480x16, ZBuffer (OK = 1)
~6000 Title.bmp. Batches 6000-17000 are CPU-bound bitmap conversion (the loop at 0x4a3536), not a wait.
~17000-22000 title ring, passport selected ("Game"). Enter opens it on "New Game"; Enter again starts.
~23000 left idle, the ring times out into the jungle.DEM attract demo. Any key there aborts back to the title. That is why a key pressed "in game" looked like it reset the run.
~25000 INDIA.BMP loading screen
~45000 Jungle start, with a Controls overlay that any key dismisses
62000+ VK_UP runs Lara forward down the path

Emulator gaps fixed (commit c0081348)

Draw shape for reference: about 16 DrawPrimitive(TRIANGLELIST, TLVERTEX) calls per frame, one per texture page (SetRenderState(TEXTUREHANDLE)), with TL sz in 0.97-0.99, rhw 0.2-2.6 and specular 0.

Open, not blocking gameplay

Evidence: scratch/runs/20261005T222600Z-tomb-raider-3-demo-claude202b4b39-jungle (dirty tree) and ...-jungle-c0081348 (committed build, byte-identical PNGs).

Parked follow-ups (2026-10-06)

Partly investigated, not fixed:

Repro for the passport: --app=tomb_raider_3_demo --input=8:dlg-cmd:1,40:dlg-cmd:1,18000:keydown:13,18100:keyup:13,18500:png:out.png --dx-surfaces.

Page route (claude:202b4b39, 2026-10-06)

The page reaches Jungle gameplay on WebGL; an earlier "title only" result was route timing, not input (scratch/runs/20261006T2030Z-tr3-web-title-input). With web-input-probe --gpu: OK both startup dialogs, then the title ring is up ~28 s later and, left idle, times out into the jungle.DEM attract demo by ~60 s (any key there returns to the title). Press Enter (hold ~300 ms) while the ring is up to open the passport on New Game, wait ~6 s for the passport to finish opening (a press 3 s in is swallowed by the animation), Enter again, and Jungle loads with its Controls overlay; one key dismisses it and Up runs Lara forward.