Shadow Warrior Classic Complete (GOG build 2.0.0.7)

Provenance and distribution status

The local fixture came from the Internet Archive gog_collection item and is pinned in test/candidate-corpus/manifest.json as SHA-1 92f1c925d235c3176ab4c21b6f1f0461b1b602c8. The corresponding GOG product was listed at USD 0.00 when inventoried on 2026-08-25. This is a zero-price proprietary game, not shareware and not freely redistributable. The installer and extracted payload therefore remain gitignored local research fixtures.

The PE32 installer is 241,578,288 bytes. GOG packages the original DOS game, its two expansions, music, and a Windows DOSBox 0.74 runtime. The locally extracted app tree is 400,345,582 bytes; notable files are the 136,829,952-byte GAME.GOG, 2,323,389-byte Sw.exe, and 3,727,360-byte DOSBOX/DOSBox.exe.

Installer investigation

The outer installer was run directly in Wine-Assembly, without host Wine. It unpacked a 1,233,216-byte Inno Setup runner at C:\windows\temp\is-n3ssn.tmp\setup_shadow_warrior_complete_2.0.0.7.tmp and crossed the CreateProcessW boundary with:

/SL5="$10001,241033519,205824,C:\setup_shadow_warrior_complete_2.0.0.7.exe"

Renaming that inner executable and launching it directly avoids its temporary path collision and opens Setup - Shadow Warrior Complete, but a bounded 60-second silent run produced only Inno support files, not the game payload. The local fixture was therefore unpacked with innoextract; no host Wine was used for installation or execution.

Confirmed launch path

The original GOG Windows DOSBox hosts the DOS SW.EXE payload inside Wine-Assembly:

node test/run.js \
  --exe=test/binaries/candidates/gog-free-shadow-warrior-classic/installed/app/DOSBOX/DOSBox.exe \
  '--args=-conf "c:\dosbox_swarrior.conf" -conf "c:\dosbox-wa.conf" -noconsole' \
  '--vfs-include=*' '--vfs-include=../**/*' \
  '--vfs-mount=test/binaries/candidates/gog-free-shadow-warrior-classic/installed/app/dosbox_swarrior.conf=c:\dosbox_swarrior.conf' \
  '--vfs-mount=test/configs/shadow-warrior-wine-assembly.conf=c:\dosbox-wa.conf' \
  --no-build --screen=800x600 --max-batches=10000 --max-seconds=360 \
  --batch-size=5000000 --real-ticks --repaint-every=20 \
  --stuck-after=1000000 --quiet-api --quiet-blocks --no-close \
  --png=/private/tmp/shadow-warrior.png

node test/test-shadow-warrior-dosbox.js automates this long local acceptance. The dynamic core retains SW as the active program and visibly renders the Shadow Warrior 1.2 startup banner plus keyboard/input initialization. A measured frame had 17,948 green title pixels, 4,943 white copy pixels, 233,109 black pixels, and five guest-frame colors.

That bounded test is a startup acceptance. A subsequent longer scripted probe continued through the intro and menu into first-person play. The visually reviewed frame at /private/tmp/free-gog-screenshots.EC8yad/4-shadow-warrior.png shows active combat in Wang's bar, with enemies, weapon, and rendered world present. This is manual gameplay evidence; the shorter automated test retains its narrower startup assertions.

Apparent dynamic-core hang

The first run used Wine-Assembly's synthetic --tick-ms-per-batch=200 clock and appeared stuck at DOSBox's SDL _DX5_CheckInput, immediately after GetMessageA. API tracing showed a repeating private message (0x7FF0, timer ID 1) installed by SDL's high-frequency multimedia timer. Each fast API call advanced the synthetic clock by at least one millisecond, so consuming one timer message made the next timer immediately due. This was a host-clock feedback loop, not divergent execution in DOSBox's dynamic recompiler.

--real-ticks breaks the feedback loop and lets the unmodified dynamic core enter SW.EXE. In an equal 120-second comparison, core=simple was still at the DOS/4GW banner while core=dynamic had rendered the game-specific startup screen and initialized input. Raising the fixed cycle target from 50,000 to 500,000 only reduced host throughput, and substituting Daggerfall's newer GOG DOSBox 0.74-2.1 did not advance farther. The title's original DOSBox 0.74 with core=dynamic, 50,000 fixed cycles, and real ticks remains the canonical path.