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.
Reproducible installed payload (2026-10-14)
node tools/fetch-candidate-corpus.js --id=gog-free-shadow-warrior-classic --force
now reconstructs installed/app/ from the existing pinned package using
innoextract1.9, installer language GOGCustom, excluding temporary files.
The181 original files total400,345,582 bytes, matching the previously recorded
app-tree size. test/candidate-corpus/gog-free-shadow-warrior-classic-files.json pins every
output; node test/test-shadow-warrior-recovery.js verifies pristine recovery.
Fresh recipe output was byte-compared with an independent original extraction.
The former restored installation was absent locally, so no restored-tree
comparison or gameplay retest is claimed.
Keep both GAME.DAT and GAME.GOG unchanged: the1017-byte GAME.DAT is a
cue sheet naming GAME.GOG as MODE2/2352 and separate Ogg audio tracks, not an
ISO sector payload. Existing ToyVM entry metadata names GAME.DAT; native CD
support must interpret that original cue/media layout, not treat its text as
disc sectors or rename it into an ISO. This recipe preserves the original
configuration, data and expansion directories without changing runtime code.
Original installer and evidence: scratch/runs/20261014-shadow-warrior-recovery/.
Forced recovery replaces the fixture tree; preserve local saves separately.
No public redistribution or deployment is implied.
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.