Skip to content

Pictures and words ​

2026-10-23, fourth session.

Three formats this time, and each one decodes completely: every byte of every file is accounted for, which is the bar GameFrame sets before a format counts as done.

The .IMG files are not in the block container at all. The game's reader, FUN_0047a454, makes four reads: a 12-byte header, one 16-byte entry per picture, a set of 512-byte palettes, and the pixel data. An entry gives the width and height, the slot the game stores the picture in, the offset of its pixels, and a palette number. Palette 0xFFFF means the picture has 16-bit pixels instead.

The first drawings had the right shapes and noisy green colours. That pattern is the signature of 15-bit colour read as 16-bit: the extra green bit picks up the low bit of red. Read as RGB555, the title plaque came out in rusty bronze and the car previews in their real paint. All 146 files decode, including the localised menu screens.

Video stills ​

Four menu images: the title plaque, the Arc car preview, the Beltane track map and a French menu screen

MIMG/62.IMG, ARC.IMG, BELTANE.IMG and FRENCH/0.IMG, read as RGB555. © Ubi Soft; shown from our own viewer.

The .BBM files turned out to hold ordinary Windows bitmaps behind a few bytes of header: the Ubi Soft logo, the "requires MMX" notice, the 3dfx plaque. The credits file holds six pages, each with a name like page1.bmp, its size and the bitmap. The end of each file is unused space that the game wrote without encoding, so it shows up as the key repeated.

Text tables ​

Four stills: the Ubi Soft logo, a credits page, the MMX notice and the 3dfx plaque

VIDEO/UBILOGO.BBM, CREDITS.BVB page 2, MMX.BBM and PLAK3DFX.BBM. © Ubi Soft; shown from our own viewer.

The .BMD files are small dictionaries: a pool of strings, then sections such as CHRONO and ERROR, each with keys such as BSTLAP that point into the pool. All four languages share the same keys, so the viewer can show them side by side later. There is no English table on this disc.

The French race messages table: sections CHRONO and AFFICH with their keys and strings

DICOS/FRENCH/DIC_GAM.BMD in the viewer. © Ubi Soft; shown from our own viewer.

One detail is still open: 80 bytes between the pool and the sections, read by a fixed-size read in the loader. Their size is the same in every file.

The plan ​

The project now has a plan. The Python decoders are prototypes. They will become a Rust workspace with one library per concern: the container, the formats, pixel formats and other hardware details worth sharing. A viewer will run both natively and in the browser, with a view for every kind of asset. The biggest piece is a 3D track viewer, which needs the track sections decoded first.

Prose CC0 1.0, code Apache 2.0. POD: Planet of Death is © Ubi Soft; none of its files are on this site.