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.