Digital archaeology and software preservation
An actual Windows 11 capture of the reconstructed viewer rendering the Taerkasten Zeppelin from the April 1998 prototype asset lineage.
This is a working Windows reconstruction of a missing object-viewer workflow
associated with the 1998 TerraTools/VFM asset pipeline. It loads and renders
the preserved Urban Assault .base, .sklt, .ANM, and .ILBM resources with the recovered
TerraTools engine, provides a new Win32 viewer shell, captures P6 PPM frames,
and assembles deterministic animated GIF89a files.
The shipped example is the Taerkasten Zeppelin used by the April 1998 HELP files. The current build has been exercised on Windows 11 x64 through WOW64. Silent viewing does not require Miles, DirectPlay, a DirectDraw wrapper, administrator changes, or a virtual machine. An opt-in second executable uses the preserved local Miles 3.6C runtime and the Zeppelin sound assigned by the April prototype; neither is installed or registered system-wide.
Download the latest Windows package · Read the provenance ledger · Review every source delta · Explore the Amiga frontend forensics · Read the preservation and rights notice
- Original TerraTools/VFM engine and Amiga viewer code: TerraTools.
- Windows reconstruction, reverse engineering, preservation tooling, and
documentation: Andrei Kiralv
(
andreipemberton) and Lilitari (OpenAI Codex Interlocutor).
This acknowledgement does not relicense recovered historical material; see
NOTICE.md for the exact rights and publication boundary.
Urban Assault was a Windows action/real-time-strategy hybrid developed by Germany's TerraTools and published by Microsoft in 1998. Microsoft described players commanding an army from an overhead map and then taking direct cockpit control of aircraft, helicopters, jeeps, tanks, and other vehicles. Lead programmer André Weissflog later recalled that development began on AmigaOS, moved through DOS, and ultimately shipped on Windows 95 with DirectX 5. After release, the game's core team left TerraTools and founded the independent company that became Radon Labs; TerraTools did not simply rename itself.
The surviving April and August 1998 prototype media preserve major parts of TerraTools' VFM rendering framework, production resources, compiled tools, and documentation, but not the complete Windows object-viewer frontend. This project therefore compiles the recovered renderer behind a new and explicitly documented Win32 shell. It is a source-backed reconstruction of an incomplete production pipeline, not a claim that an intact original viewer was found.
That distinction is the heart of this digital-archaeology project: preserve the historical bytes, record hashes and provenance, document what is absent, and keep every modern compatibility or orchestration step visible.
Download and extract the ZIP from the
latest GitHub release.
PowerShell 7 or newer is required by the integrity-checking launcher. From the
extracted package, double-click View Zeppelin.cmd for silent viewing or
View Zeppelin with Sound.cmd for the preserved prototype loop. The equivalent
commands are:
pwsh -NoProfile -File .\Viewer\Launch-Viewer.ps1 -VerifyOnly
pwsh -NoProfile -File .\View-Zeppelin.ps1
pwsh -NoProfile -File .\View-Zeppelin.ps1 -Sound
pwsh -NoProfile -File .\View-Zeppelin.ps1 -ClassicAmigaControlsThe first command checks all 28 runtime payloads against their recorded size
and SHA-256. The second checks the 25 core payloads and opens the
dependency-free silent viewer; it remains usable even if the optional sound
set is absent. The third checks all 28 and
selects TerraToolsViewerSound.exe, the manifest-pinned April ZEPP.WAV, and
its matching local MSS32.DLL.
The fourth command (also available as View Zeppelin - Classic Amiga
Controls.cmd) enables the control scheme reverse-engineered from the
preserved Amiga HUNK, preferences, and input classes. It is an interactive
option and can be combined with -Sound; modern controls remain the default.
Controls:
- drag with the left mouse button to rotate;
- drag with the right mouse button, use the wheel, or press
W/Sto move the camera; - use the arrow keys or
A/Dto rotate from the keyboard; - press
Spaceto restore the initial camera; - press
F12to capture a PPM frame; - in sound mode, press
Mto stop or restart the Zeppelin loop; - press
Escor close the window to exit.
Classic Amiga controls (-ClassicAmigaControls or -AmigaControls):
- move the mouse with no button to walk and yaw;
- hold left mouse or
Ctrland move vertically to pitch; - hold right mouse or left
Altand move vertically to fly; - hold both mouse buttons and move horizontally to roll (vertical movement still flies);
- use the cursor keys for the saved walk/yaw mappings;
- press middle mouse or
Spaceto centre the active object's angles; - hold
Tabto control the Zeppelin itself, then release it to return control to the camera.
That held-Tab “object possession” behavior is the Amiga viewer's most unusual
UI feature. It uses VFM's recovered generic base.class input handler rather
than a transform gizmo. See the
binary-backed analysis for exact HUNK
offsets, slider expressions, and compatibility limits.
Sound is intentionally interactive-only. PPM captures and animated GIFs do not contain audio, so the launcher keeps both batch modes silent.
The staged launcher can produce one frame or a fixed-step 36-frame turn:
pwsh -NoProfile -File .\Viewer\Launch-Viewer.ps1 `
-Mode Capture -OutputPrefix 'captures\zeppelin' `
-Fit 1.8 -Pitch 30 -Yaw 270
pwsh -NoProfile -File .\Viewer\Launch-Viewer.ps1 `
-Mode Turntable -OutputPrefix 'captures\zeppelin_' `
-Fit 1.8 -Pitch 30 -Yaw 270Capture paths must be relative to the staged runtime. A capture writes one
320 x 200 P6 PPM. A turntable writes frames 000 through 035 at 10-degree
increments. Camera, geometry, and sequencing are fixed, but the Zeppelin's
animated tail effect has produced either of two observed first-frame rasters
on separate process launches. The GIF converter itself remains
byte-deterministic for identical PPM inputs and arguments.
To render the reconstructed HELP-style GIF with the measured historical canvas, frame count, loop, and delays:
pwsh -NoProfile -File .\Make-Help-GIF.ps1The exporter renders a fresh turntable, crops it to 250 x 152, orders the
rotation to match the verified April HELP animation, writes a GIF89a with a
1,200 ms first-frame delay and 100 ms later delays, and emits a JSON manifest
covering the viewer, converter, direct PPM frames, and output GIF. The staged
runtime's separate asset manifest covers the resource inputs. The native
ppmseq2gif.exe converter uses one deterministic adaptive global palette and
has no Python, .NET, ImageMagick, or other conversion dependency.
The isolated stager accepts one extracted bundle containing exactly one
.base and one .sklt, plus any recursively found animation and ILBM
resources:
& .\scripts\stage_viewer_runtime.ps1 `
-BundlePath '..\Taerkasten Zeppelin Reconstruction\extracted\VP_ZEPPL' `
-SoundFile '..\Taerkasten Zeppelin Reconstruction\prototype_analysis\extracted_builds\apr09\GAME\DATA\SOUNDS\ZEPP.WAV' `
-OutputPath '.\build\staged\my-object'It resolves all destination names case-insensitively before writing anything,
rejects conflicting duplicate resources, refuses to merge with an existing
directory, and records provenance and SHA-256 for every staged byte. See
docs/ASSET_STAGING.md for the exact mapping.
Omit -SoundFile to make a 25-payload silent-only stage; when it is present,
the stager admits the sound executable, DLL, and WAV as one complete optional
set. Custom WAV inputs are rejected unless they are canonical RIFF PCM, mono,
8-bit files compatible with the recovered loader.
The public repository preserves the new frontend, build recipes,
documentation, and verification logic. It deliberately does not treat the
archived TerraTools source, prototype media, period SDKs, or proprietary Miles
runtime as newly licensed source code. Rebuilding requires lawfully obtained
historical inputs staged at the paths documented in
docs/PROVENANCE.md. The ready-to-run preservation
package is distributed separately through the GitHub release, with an exact
file manifest and checksum ledger.
Run these commands from this directory:
powershell -ExecutionPolicy Bypass -File .\scripts\build_legacy_vfm.ps1 -ViewerProfile
powershell -ExecutionPolicy Bypass -File .\scripts\build_legacy_vfm.ps1 -ViewerProfile -MilesSound
powershell -ExecutionPolicy Bypass -File .\scripts\build_vfm_probe.ps1
powershell -ExecutionPolicy Bypass -File .\scripts\build_viewer.ps1
powershell -ExecutionPolicy Bypass -File .\scripts\build_viewer.ps1 -MilesSound
pwsh -NoProfile -File .\tests\test_classic_input.ps1
pwsh -NoProfile -File .\tests\test_release_versioning.ps1
pwsh -NoProfile -File .\scripts\build_ppmseq2gif.ps1
pwsh -NoProfile -File .\scripts\build_release.ps1 -Version 1.1.0build_release.ps1 accepts a validated numeric X.Y.Z project version. With
no path overrides, version 1.1.0 publishes
dist\TerraTools-Windows-Viewer-v1.1.0-Windows and the matching .zip; its
RELEASE-MANIFEST.json records project_version as 1.1.0. Explicit
-OutputDirectory and -ArchivePath values remain available for isolated QA.
The source build is intentionally 32-bit. The recovered renderer contains
32-bit pointer storage and uses DirectDraw/Direct3D 2, so a speculative 64-bit
port would change the engine rather than simply compile it. Historical source
exports under recovered remain untouched; verified compatibility edits are
generated beneath the profile-specific build\legacy\patched-* directories.
Each successful profile also emits source-delta.json with
original/generated hashes and its exact source composition.
Important outputs:
build\legacy\vfm_viewer.lib— recovered VFM renderer, viewer profile;build\legacy\vfm_viewer_sound.lib— separately linked Miles profile;build\probe\vfm_probe.exe— headless asset-loader/lifetime probe;build\viewer\TerraToolsViewer.exe— silent Windows viewer, with no Miles import;build\viewer\TerraToolsViewerSound.exe— opt-in Miles Windows viewer;build\tools\ppmseq2gif.exe— deterministic GIF assembler;build\staged\VP_ZEPPL_SOUND— isolated, ready-to-run Zeppelin runtime.
All seven available PC prototype images and all SourceSafe members were
audited. The original PC viewer frontend source is incomplete: the surviving
targets refer to missing winyppsn.c and winplay.c, while neither snap.c
nor a PC view.c/viewer project survives. The Amiga materials contain a
compiled HUNK view, separately archived documentation, preferences, input
classes, and runtime assets. Those bytes are not linked into the Windows build,
but their decoded input/recipient behavior now informs an explicitly selectable
classic mapping in newly authored code.
This build therefore has a precise boundary:
- preserved TerraTools code performs resource loading, hierarchy traversal, transforms, clipping, lighting, texturing, rasterization, and PPM capture;
- the Win32 window, input loop, scene attachment, camera fit, batch turntable, and GIF conversion are source-backed reconstructions;
- the April game script explicitly assigns
sounds/zepp.wavto the Zeppelin; loading that preserved loop in this standalone viewer is a documented reconstructed preview binding; - the HELP preset matches the verified animation's 250 x 152 canvas, 36-frame cadence, direction, loop, and delays, but is not claimed to be pixel- or byte-identical to TerraTools' missing camera/crop/quantizer pipeline.
For the full evidence and bounded source adaptations, see:
docs/PROVENANCE.mddocs/SOURCE_DELTA.mddocs/BUILD_NOTES.mddocs/GIF_EXPORT.mddocs/ASSET_STAGING.mddocs/AMIGA_VIEWER_FORENSICS.md
- Microsoft's 1998 description of Urban Assault
- André Weissflog on the game's development history
- Hidden Palace: August 17, 1998 source prototype
- Hidden Palace: April 9, 1998 prototype
- Library of Congress software and video-game preservation guidance
This project is not presented as an official TerraTools, Microsoft, Ubisoft,
or RAD Game Tools release, and no blanket open-source license is asserted over
recovered historical material. See NOTICE.md for the exact
publication boundary.
