War Wind (USA) and War Wind II — Human Onslaught (Europe)

Both are DreamForge / SSI RTS games shipped as CD images (.cue/.bin) with InstallShield 3 setups. Verified 2026-09-28: both install from the mounted CD and reach real gameplay with the CD still mounted.

Discs

Game Setup Installed exe Notes
War Wind IS3 Win16 SETUP.EXE WARWIND\WW.EXE music streams from D:\warwind\data\res.003 at runtime, so the CD must stay mounted
War Wind II IS3 SETUP.EXE → _ins0432._mp engine C:\WarWind II\warwind2.exe + smackw32.dll data in data\res.000/001/008, network\*.lvl

Bugs fixed to get here

Headless commands

The CLI resolves import DLLs beside the host exe, so for War Wind II copy smackw32.dll out of the install overlay next to a host copy of warwind2.exe (otherwise: UNIMPLEMENTED API: <ord>).

War Wind II also runs straight off the disc, no install needed: WW2\WARWIND2.EXE and WW2\SMACKW32.DLL are stored uncompressed on the CD. Extract both beside each other and point the guest path at D::

node tools/cue-bin-to-iso.js "<disc>.cue" ww2.iso
node tools/iso-dir.js ww2.iso --extract='WW2\WARWIND2.EXE' --out=host/warwind2.exe
node tools/iso-dir.js ww2.iso --extract='WW2\SMACKW32.DLL' --out=host/smackw32.dll
node test/run.js --exe=host/warwind2.exe --exe-guest-path='d:\ww2\warwind2.exe' \
  --media-mount="<disc>.cue" --media-exe=SETUP.EXE --cwd='D:\WW2' \
  --screen=800x600 --no-build --quiet-api --count=0xa205c0

Intro movie (Smacker, through the game's own smackw32.dll)

WW2OPEN.SMK is 2169 frames, 640x160 at 15 fps (144.6 s), shown letterboxed in a 640x480 DDraw surface. It plays in full with no WAT Smacker code: smackw32.dll runs as ordinary guest x86. The DLL loads at 0xa1c000 (origBase 0x400000), so _SmackDoFrame@4 (+0x4045c0) is 0xa205c0, _SmackWait@4 0xa1f170, _SmackOpen@12 0xa20ef0. --trace-at on DoFrame prints nothing (it is not called on the main thread's batch boundary); --count works.

Decode throughput, measured 2026-09-28 by running to fixed --max-batches (deterministic) and reading the DoFrame count, on the M1 at load 5-8:

batch frames wall
10,000 334 8.2 s
20,000 617 16.1 s
40,000 1,199 26.4 s
80,000 2,169 72.0 s

That is ~36-56 decoded fps against the 15 fps the movie needs, 2.5-3.5x real time headless. The headless clock runs ahead, so the decoder never waits and this is its ceiling; browser paint is not included. On the 10,000-batch runs, ~30 batches go by per frame.

# install (drive with tools/ctl.js on the control port)
node test/run.js --media-mount="<disc>.cue" --media-exe=SETUP.EXE \
  --overlay-dir=/tmp/ww2-overlay --screen=800x600 --quiet-api \
  --control=8133 --frozen --max-seconds=3000

# run the installed game with the CD mounted
node test/run.js --exe=<host>/warwind2.exe --exe-guest-path='c:\warwind ii\warwind2.exe' \
  --media-mount="<disc>.cue" --media-exe=SETUP.EXE --cwd='C:\WarWind II' \
  --overlay-dir=/tmp/ww2-overlay --screen=800x600 --no-build --quiet-api \
  --control=8133 --frozen

Driving it (screen/PNG coordinates at --screen=800x600)

Both games poll GetKeyState for the button, so a bare ctl click is lost: send mousemove, step ~60, mousedown, step ~60, mouseup.

Open questions

Multiplayer Wizard (WW1) -- 2026-09-28

Clicking the centre icon of the race screen (320,240 at --screen=800x600) runs FlipToGDISurface and then PropertySheetA: the DreamForge "Multiplayer Wizard", a one-page-at-a-time wizard over the exclusive 640x480 DirectDraw display. Its Welcome page has two labels, an SS_OWNERDRAW static (id 101) that the dialog proc fills with a 120x225 BitBlt of the character artwork on WM_DRAWITEM, and the Back/Next/Cancel buttons.

Two bugs made it look like "no text and wrong fullscreen":

WW1 runs straight off the disc, with no install needed for this route:

node test/run.js --exe=<host>/ww.exe --exe-guest-path='d:\warwind\ww.exe' \
  --media-mount="<War Wind (USA).cue>" --media-exe=SETUP.EXE --cwd='D:\WARWIND' \
  --screen=800x600 --no-build --quiet-api --no-close --png-canvas --png=ww1.png \
  --input=1500:mousedown:320:240,1560:mouseup:320:240,3000:mousedown:320:240,3060:mouseup:320:240 \
  --max-batches=4500 --max-seconds=100

The first click skips the intro; the second opens the wizard. The caption really is "test wizard"; that is the game's own string. WW2's tutorial text rendered correctly headless, and its failure was not reproduced.