Total Annihilation Demo

Original installer

The local fixture is the unchanged 21,540,864-byte Total Annihilation.exe self-extractor linked from sources.md. Wine-Assembly runs that executable directly. Its numeric ADD resources produce TADemo.exe, TADemo.hpi, and the readme; the browser/CLI app launches those installer-produced files rather than a host-extracted substitute. The installer and installed payload remain local and gitignored.

Frozen gameplay route

test/test-total-annihilation-gameplay.js launches the registered total_annihilation_demo app through the headless CLI with frozen stdio control at 20,000-block batches and a 16 ms guest tick, the candidate route's settings (total-annihilation.md). It clicks Single, New Campaign, the default Arm campaign on Medium, and the briefing's Start (batches 1600-4600), then plays: a left-click on the Stumpy tank at (212,228) selects it (orders panel down the left, "Stumpy / Standby" bar), and a left-click on open ground at (430,390) orders a move (TA's default interface; right-click and a ground click with nothing selected deselect). The tank drives there and reports Standby about 800 batches later. The test asserts terrain, minimap, HUD, the panel opening, the tank leaving its start and arriving.

Do not run TA at 1,000-block / 200 ms batches. The battlefield renders, but a TA frame costs more than such a batch and the simulation paces off the guest clock: no unit moves, the economy never ticks, and a pointer move only changes the cursor. The previous version of this test did exactly that and its "pointer response" was the cursor sprite.

Frame counter

TA draws its 8bpp primary with Lock/Unlock and never calls Flip, Blt or BltFast. Over a gameplay window the main thread does exactly one primary Lock (returns to 0x47c211) and Unlock (returns to 0x47c34a) of one surface per frame, and dx_present on presentation slot 1 fires once per Unlock, so --present-distinct/--frame-stats count frames 1:1. From batch 4700 to 6100 (22.3 guest-s, covering the move): 321 frames, 291 changing the picture, 14.3 frames per guest-second, interval p50 4 / p99 10 batches, identical across runs. --frame-stats-out=FILE writes the raw intervals. Evidence: scratch/runs/20261010T0250Z-total_annihilation_demo-control-frames. Browser FPS is not measured.