Ghosts
A ghost is a recorded run: the car’s state sampled at a fixed period, packed and compressed, beside the player’s input events and the versions of the game that recorded it. Observed · 15 ghosts of 9 downloaded maps
CGameCtnGhost is 0x03092000. The layouts below read all 15 ghosts of 9 maps of the 2026 top-downloads list to their end, and
the chunks found in them are the ones GBX.NET finds. Observed · 15 ghosts
Samples (chunk 0x0303F005)
Section titled “Samples (chunk 0x0303F005)”The chunk is a u32 uncompressed size and a u32 length followed by that many zlib bytes. Observed · 15 ghosts The stream
inside:
| Order | Field | Type | Confidence |
|---|---|---|---|
| 1 | Vehicle class | u32, 0x0A02B000 |
Observed |
| 2 | Fixed step | bool | Observed |
| 3 | Unknown | i32, 0 |
Unknown |
| 4 | Sample period | i32, 100 ms |
Observed |
| 5 | State version | i32, 9 in all 15 |
Observed |
| 6 | State data | a buffer of the samples’ records | Observed |
| 7 | Sample count | i32 |
Observed |
| 8 | Offsets | the first sample’s offset (i32), then a size per sample (i32), or −1 and then count − 1 sizes |
Observed |
| 9 | Times | present when the step is not fixed | Observed |
Car record (state version 9)
Section titled “Car record (state version 9)”A sample is 61 bytes. Observed · 15 ghosts The first record of each ghost decodes to a plausible start position. Observed · 15 ghosts
The names of fields after the position follow GBX.NET's; only the position is checked against the map.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 12 | vec3 f32 | position | Observed | |
| 0xC | 2 | u16 | rotation angle | Sourced | |
| 0xE | 4 | u32 | rotation axis (packed) | Sourced | |
| 0x12 | 4 | u32 | velocity (packed) | Sourced | |
| 0x16 | 4 | u32 | angular velocity (packed) | Sourced | |
| 0x1A | 6 | u16[3] | speeds and rpm | Sourced | |
| 0x20 | 8 | u16[4] | wheel rotations | Sourced | |
| 0x28 | 1 | u8 | steer | Sourced | |
| 0x29 | 1 | u8 | gas | Sourced | |
| 0x2A | 1 | u8 | brake | Sourced | |
| 0x2B | 4 | u8[4] | unknown | Unknown | GBX.NET's u11 to u14 |
| 0x2F | 1 | u8 | turbo | Sourced | |
| 0x30 | 1 | u8 | front steer | Sourced | |
| 0x31 | 8 | (u8, u8)[4] | per wheel: dampen, material | Sourced | |
| 0x39 | 3 | u8[3] | unknown | Unknown | GBX.NET's u25 to u27 |
| 0x3C | 1 | u8 | dirt blend | Sourced |
Inputs and versions (chunk 0x03092019)
Section titled “Inputs and versions (chunk 0x03092019)”| Order | Field | Type | Confidence |
|---|---|---|---|
| 1 | Events duration | u32; when 0 nothing else of the inputs follows |
Observed |
| 2 | Input store version | 0 | Observed |
| 3 | Input names | counted idents | Observed |
| 4 | Event count, limit | Observed | |
| 5 | Events | 9 bytes each: time + 100,000 (u32), an input-name index (u8), data (u32) |
Observed |
| 6 | Executable version | string | Observed |
| 7 | Checksum, OS, CPU | Observed | |
| 8 | Race settings | string | Observed |
| 9 | Seed | i32, after the inputs |
Observed |
Observed · 15 ghosts
Ghosts recorded with the TMF Competition Patch carry a further chunk, 0x0304F001: a u32 and counted bytes, which are
high-entropy. It is skippable. Observed · the patched ghosts among the 15
Chunk 0x0304F001’s bytes look encrypted or compressed; they are not read.