Serious Sam: The First Encounter — demo (serious_sam_demo)

Croteam, 2001, OpenGL. Registered as serious_sam_demo (4cbde5326); candidate serious-sam-demo in test/candidate-corpus/manifest.json (archive.org SeriousSamDemo.exe, Disk1 mounted at C:\). Reaches player-controlled gameplay on main with the winmm timer thread on.

An untracked, migration-era docs/re-notes/serious-sam.md in the main checkout recorded private-build experiments (some superseded, some wrong). This file is the current state; the claims it corrects are listed under "Ruled out / stale".

Running it

Boat only: the ops box's memory reaper killed local runs, and OpenGL needs --headless-gl (@node-3d/webgl + @node-3d/glfw, Xorg :0).

DISPLAY=:0 node test/run.js --app=serious_sam_demo --no-build --quiet-api --quiet-blocks \
  --no-close --stuck-after=0 --batch-size=10000 --tick-ms-per-batch=1 --headless-gl \
  --max-batches=73000 --input=...

Route (1 ms of guest time per batch; ~60 batches/s while rendering, ~1800 while loading):

batch input effect
~2000 — first-run "Information" MessageBox
4000 Enter (keydown 13) dismisses it
~20000 — intro (Godgames logo, Levels\Intro.wld)
21000 / 23000 / 25000 / 27000 Enter skip intro, SINGLE PLAYER, NEW GAME, NORMAL
~60000 — NETRICSA briefing "Thebes - Karnak"
62000 mousedown/up at (585,19) NETRICSA Exit button — Escape keydown does not close it (keyboard focus is window 0x10008)
64000 — Karnak temple room, revolver, health 100
hold W — walks through the door into the courtyard; an enemy runs in

No console setting is needed (see hooks below). Evidence: scratch/runs/20261011T0545Z-serious-sam-noconsole-w6 (default input), scratch/runs/20261011T0400Z-serious-sam-levelload-w6 (first gameplay).

Module bases (seeded order Engine, Game, Entities)

module runtime base original base
Engine.dll 0x574000 0x600c0000
Game.dll 0x811000 0x604a0000
Entities.dll 0x93f000 0x60280000
msvcrt.dll 0xbee000 0x78000000

Engine runtime = original − 0x600c0000 + 0x574000. Engine exports its C++ methods by mangled name (tools/pe-exports.js), which names most addresses below.

Identified functions (Engine originals unless noted)

Fix chain (all on main)

027c12a54 DLL static TLS · c7c234629 fault mode 5 reservedPageFaults · ce3aeaad5, 32b9526ec nested fault run keeps $ip/page registers · bc110628c OPENGL32.DLL system-file stub · 8ed49c3dc glGetTexLevelParameteriv · 5529ce4aa, 13da5a055 MEM_DECOMMIT unmaps (size-0 bound) · d10ba697's 26aba0e61, d81e4b7e8, 212959d8d decoded-code spill + SEH-walk $ip · f6c58213a page-crossing accessors re-translate after a fault filter (the straddling dword that corrupted the state-stack count) · 4cbde5326 registry entry + browser reservedPageFaults.

Ruled out / stale