Name strings
Inside the block containers (container.md), section names, texture names and difficulty words are stored as encoded strings. The reader is FUN_00468958 (pod_read_name) in WINPOD.EXE.
Reader: decoders/podstring.py. State: decoded and round-trip on the 144 entry names of the 18 .BL4 tracks and BELTANE.BL3 (measured, 2026-10-23).
Layout
| Offset | Size | Content |
|---|---|---|
| 0 | 1 | Length L (0 to 255) |
| 1 | L | Text: byte i (from 0) is stored XORed with (0xFF - i) & 0xFF |
Observed in FUN_00468958: it reads the length byte, reads L bytes, puts a zero after them, takes the length of the result up to the first zero, and XORs each byte with a key that starts at 0xFF and goes down by one per byte.
Example: the bytes 06 b2 bb b9 b5 ae b7 hold MEDIUM (b2 ^ ff = 'M', bb ^ fe = 'E', …).
Pitfalls
- The game measures the text up to the first zero byte before decoding. A stored byte of
0x00cuts the name short in memory (inferred from the code; not yet seen in a file). - The word
NEANT(French: "nothing") marks an absent section: the track loader compares each section name with it (strings at0x4f198f,0x4f1995,0x4f199b,0x4f19a1,0x4f19b5).