Skip to content

Best times and lists ​

2026-10-23.

This session took the smaller files: the ones that hold lists and tables. All of them now decode to the last byte, and writing the decoded form gives the original file. The viewer shows each one as a table.

Best times ​

The .BRT files were already known to use the block container with key 0xEAFA. Inside there is one 0xE5C-byte area, which load_records (FUN_004b2300) reads to 0x693A84 and save_records (FUN_004b23f4) writes back from the same address. It holds four tables: 15 best races with their lap times, 15 best laps with their sector times, the splits of the best race, and one table of 15 best times for each timing sector. A time is seconds in 16.16 fixed point. FUN_0047e4d0 prints them as m'ss"hh, and that gave the unit.

Beltane's best times in the viewer: the race table and the best-lap table with sector splits

The file name also carries state. The code swaps the last letter of the name for the mode (T time attack, E/M/H difficulty) and the first letter for - on a mirrored circuit. Only the .BRT files ship on the disc. The shipped times look generated: every lap in a row is the same, and each row is a fixed step slower than the one above. The game's own "no file" routine, FUN_004b1d84, builds its tables in the same way.

The circuit list ​

CIRCUITS.BIN is 32 rows XORed with 0x50, 17 of them in use. Each row gives the file stem, the title, the map and sky pictures, the flags, the length in metres, the laps and the timing sectors. The sector counts match the .BRT files for 15 circuits. Bank and Special have 4 sectors in the list but only 3 sector tables in their records.

The circuit list: 17 circuits with their pictures, length, laps and sectors

BETAMNU.BIN holds the menu editor's own data: 33 menus and 503 items. Each item has a screen rectangle, an action number and a type. It even keeps the addresses the items had in the editor's memory, which the game overwrites at start-up. HABI.BIN is text XORed with 0x80: 219 race-display elements, each a ten-field line read with sscanf and followed by its options.

The menu tree in the viewer: the root menu, the records screen and the options screen

The race display layout: one row per element, with its font and options

The rest ​

  • The music tables (CDAREF.TXT and the others) list CD audio tracks 2 and 3, and two test scripts.
  • .BI2: all three effect files decode. SHADOTIN's odd first byte is the length of a 44-byte name. The bytes after the pixels turned out to be the writer's previous block, still encoded in its buffer. Every byte of both large files fits that rule.
  • DATA\Params\ and DATA\Com\ are empty on the disc. The code shows what the game writes there: per-car set-ups (<car>.prb, five sliders sharing 300 points, with a check word) and the modem phone book.
  • The AVI videos and LOADER.EXE now have structural readers, so the catalogue counts them.

The catalogue now reads 198 of 289 files to the last byte, 78% of the bytes. What is left is the track and car data, which other sessions are working on, plus the sound banks and the font glyph tables.

Next ​

  • Load a changed .BRT in the game, and let the game write one. This needs a writable copy of DATA/RECORDS under Wine, so the shared disc copy stays untouched.
  • The .MEG sound-bank structure and the .BP3 glyph tables, so those files decode to the last byte too.

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