Skip to content

The rest of the tracks ​

2026-10-23, track session.

Until today the track files were read as far as the lighting. About a third of each file was still unexplained. This session read on from there to the end of every entry, on all 36 files.

Six horizon panoramas

The horizon of Beltane, HQ, City, Sewer, Canyon and Veitland, from top to bottom, unrolled by pod-viewer export. © Ubi Soft; shown from our own viewer.

How the reading went ​

Each step began in load_track_file (FUN_0046ef04). It calls one routine per section, and each section starts with a file name such as beltane.anc, or NEANT when the track has none. The size of every read is a register argument, so a small script lists each call with its size from the disassembly. A prototype in decoders/track.py then walked the files, and a section counted as done when the next name came out readable.

The container's entry table gave a strict test. Entry 0 must end exactly where entry 1 begins, and entries 1 to 7 each where the next begins. All 36 files pass. The same checks run in the Rust reader's tests.

Animations ​

The animation library (.anc, FUN_0046d390) holds small animated models. Each frame gives every object a rotation and a position. Every track has wrongway.ani, eight objects that end in two rows of five and three: the letters of WRONG WAY flying into place. Going by their names, Nuke has a reactor, Roc a dish and Sewer a fan.

Sewer's fan at two moments

CIRCUITS/SEWER.BL3, the fan in its shaft seen from below, at 0 and 0.3 seconds (pod-viewer render SEWER.BL3 --focus 259,-524,65 --pitch -1.3 --time S). © Ubi Soft; shown from our own viewer.

The sky is a horizon and a cloud layer ​

Two named texture blocks follow, with a few words around them. The first is the horizon. Drawn as a square it made no sense. As a strip of 1024 by 64 pixels, stored column by column from the bottom up, it shows the skyline. The .BL4 file stores the same panorama as four strips side by side. Comparing the two files pixel by pixel confirmed both layouts.

The second block is a tiling cloud texture. Its eight words set the layer's height and a drift that FUN_0048fb50 adds every frame. The .BL4 file has 32 KB more after it. The 3dfx build always reads that with a mode of its own: four grey sprites for light flares.

Cloud textures and the light sprites

Cloud layers of Beltane, HQ, City and Pompeii, and the four light sprites from BELTANE.BL4. © Ubi Soft; shown from our own viewer.

Animated textures ​

Nine tracks have a .ita section. It lists animations as frames, each a page and four corners, with a timed sequence. Then it names the faces that show them, per sector, by their index among the triangles or quads. That numbering was checked against the data: 112 of the 129 animated faces already hold one of their animation's frames.

Three texture animations, frame by frame

Frames of HQ's monitor screen, Sewer's slime and Pompeii's fan, cut from the texture pages by pod-viewer export. © Ubi Soft; shown from our own viewer.

The race ​

The rest of entry 0 is the race. It holds the beacons with their events (Depart, Arrivee, FinCourse) and eight start records. Then come the paths for EASY: cross-sections, and a graph of nodes and links that the opponents most likely drive.

The other entries finally have a meaning. Entries 1 and 2 hold the MEDIUM and HARD paths. Entry 3 starts the reverse track: every name in it has its first letter replaced by a dash (-eltane.bal). Entries 4 and 5 hold its harder paths. Entries 6 to 8 list the seven opponents for each difficulty, with their names and cars: Maverick, Shane, Raze up to Nitro, Rage and Val on HARD.

After entry 8, each file's last block holds up to 16 KB that no routine reads. The small-formats session spotted what it is in the font files, and it holds here too: the writer's previous block, left in its buffer and still encoded. Every tail byte equals the byte one block earlier XORed with the key. So a writer can rebuild it exactly.

What is next ​

Many records are read as whole blocks of bytes whose fields are not traced: zones, beacons and start records. They are the next step toward changing a track. After them come a writer and a round trip. The path graph is ready to be drawn as a racing line in the viewer. The game's animation clock is also open: the viewer plays the animations at a speed it chose itself.

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