ASSET ARCHAEOLOGY
Much of the art is not in image files. It is linked into the executables as data segments assembled from generated include files, so recovering it means reading OMF object records.
.OBK / .OBJ the interference rings, the forest, the end logo and all 21 credits paintings live inside LEDATA records as raw bitmaps. .EXE two parts had to be identified by unpacking the shipped executables — PKLITE, sometimes with LZEXE underneath — and disassembling them.
That is how we know 3DSINFLD.EXE is not the program in the GRID/ directory at all: it is COMAN/, renamed at build time.
It is also how the finished credits artwork was recovered. Seven of the 21 pictures in the development objects are placeholders; the shipped executable has the real ones. Where a picture exists both as a linked object and as a re-exported GIF beside it, the object is the original — the GIF has been re-quantised.
Every asset the port consumes is regenerated from the release by a tool in unreal2/tools/, so nothing in the repository is a binary of unknown origin.
WHAT THE PORT LOADS
83 files, about 4 MB, in unreal2/assets/ — and not one of them is an image file:
.bin 62 raw bitmaps and tables, as they sat in the objects (21 of those are the credits paintings, in cred/) .dat 8 the original's precomputed tables, shipped verbatim .up 3 packed pictures, still packed .json 3 geometry and constants recovered from the executables .s3m 2 the two modules, still scrambled .sci .clx .fli .txt one or two each, all as shipped
Nothing was converted to PNG, re-quantised, or re-encoded on the way in. The port fetches these as raw bytes and does the unpacking at runtime, with the original's own routines: PRAX4.FLI is decoded frame by frame the way PAM decoded it, the .UP pictures are unpacked the way the parts unpacked them, the S3Ms are descrambled in memory.
The reason is not purity. It is that a converted asset is a second opinion about what the original meant — a re-quantised palette, a resampled row — and the port has no way to notice when that opinion is wrong. Raw bytes plus the original's own decoder either produce the release's picture or fail loudly.