Modding Whiplash/Fatal Racing
Contents
Track (TRK) files
The tracks.
Definition
| Header |
| Empty line |
| Empty line |
| Geometry |
| Signs |
| Empty line |
| Stunts |
| Empty line |
| Textures |
| Empty line |
| Race info |
| Empty line |
//denotes a single line comment- integer values are 32-bit signed integers
- floating point values are double precision
Header
Geometry lengthint |
Initial X positionint |
Initial Y positionint |
Initial Z positionint
|
Initial X and Y positions are always 0 in retail tracks. Z is vertical.
Geometry
Track geometry.
| Row 0 | |||||||||||||||||||||||||||||
| Row 1 | |||||||||||||||||||||||||||||
| Row 2 | |||||||||||||||||||||||||||||
| Empty line | |||||||||||||||||||||||||||||
| ... | |||||||||||||||||||||||||||||
Row 0
| Column index | Field | Type | Notes |
|---|---|---|---|
| 0 | Left shoulder width | int |
|
| 1 | Left lane width | int |
|
| 2 | Right lane width | int |
|
| 3 | Right shoulder width | int |
|
| 4 | Left shoulder height | int
|
|
| 5 | Right shoulder height | int
| |
| 6 | Length | int |
|
| 7 | Yaw rotation | float |
counter-clockwise (°) |
| 8 | Pitch rotation | float |
upwards (°) |
| 9 | Roll rotation | float |
counter-clockwise (°) |
| 10 | AI line | int
|
|
| 11 | AI line | int
| |
| 12 | AI line | int
| |
| 13 | AI line | int
| |
| 14 | Track grip | int
|
0: full grip |
| 15 | Left shoulder grip | int
| |
| 16 | Right shoulder grip | int
| |
| 17 | AI max speed | int |
|
| 18 | Ground height | int |
Height at which a car stops falling and resets Setting equal to outer floor height makes it appear as if one fell on it |
| 19 | Audio (above trigger) | int |
Index of audio to play when driven over (order in SOUND.INI)0: no audio Plays when over trigger speed |
| 20 | Audio trigger speed | int |
200 is about 67 mph |
| 21 | Audio (below trigger) | int |
Index of audio to play when driven over (order in SOUND.INI)0: no audio Plays when between ~26 mph and trigger speed |
Row 1
| Column index | Field | Type | Notes |
|---|---|---|---|
| 0 | Left surface type | int |
|
| 1 | Center surface type | int |
|
| 2 | Right surface type | int |
|
| 3 | Left wall type | int
|
Left and right must exist to draw roof -1: not present |
| 4 | Right wall type | int
| |
| 5 | Roof type | int |
-1: not present |
| 6 | Left upper outer wall type | int |
|
| 7 | Left lower outer wall type | int |
|
| 8 | Outer floor type | int |
|
| 9 | Right lower outer wall type | int |
|
| 10 | Right upper outer wall type | int |
|
| 11 | Environment floor type | int |
Value of geometry currently being driven on determines entire color below the horizon |
| 12 | Building/Sign type | int |
See Building/Sign type |
| 13 | Building/Sign horizontal offset | int
|
|
| 14 | Building/Sign vertical offset | int
| |
| 15 | Building/Sign yaw | float |
counter-clockwise (°) |
| 16 | Building/Sign pitch | float |
upwards (°) |
| 17 | Building/Sign roll | float |
counter-clockwise (°) |
Row 2
| Column index | Field | Type | Notes | Observed values[N 1] |
|---|---|---|---|---|
| 0 | Left upper outer wall horizontal offset | int
|
| |
| 1 | Left lower outer wall horizontal offset | int
| ||
| 2 | Left outer floor horizontal offset | int |
||
| 3 | Right outer floor horizontal offset | int |
||
| 4 | Right lower outer wall horizontal offset | int
|
| |
| 5 | Right upper outer wall horizontal offset | int
| ||
| 6 | Left upper outer wall height | int |
||
| 7 | Left lower outer wall height | int |
||
| 8 | Left outer floor height | int |
||
| 9 | Right outer floor height | int |
||
| 10 | Right lower outer wall height | int |
||
| 11 | Right upper outer wall height | int |
||
| 12 | Wall/roof height | int |
||
| 13 | Near chunks (forward) | int |
Number of chunks for collision/render while going forward Range: 8-128 Default: 32 | |
| 14 | Near chunks (forward extra start) | int |
Chunk index of extra range for collision/render while going forward Default: -1 (disabled) | |
| 15 | Near chunks (forward extra) | int |
Number of chunks for collision/render while going forward Range: 8-128 Default: 0 | |
| 16 | Subdivide distance (left shoulder) | int
|
Distance at which geometry should subdivide Smaller is closer |
20,40,60 |
| 17 | Subdivide distance (center lane) | int |
20,40,60,80 | |
| 18 | Subdivide distance (right shoulder) | int |
20,40 | |
| 19 | Subdivide distance (left wall) | int |
20 | |
| 20 | Subdivide distance (right wall) | int |
20 | |
| 21 | Subdivide distance (roof) | int |
20,40,60,80 | |
| 22 | Subdivide distance (left upper outer wall) | int |
1 | |
| 23 | Subdivide distance (left lower outer wall) | int |
20 | |
| 24 | Subdivide distance (outer floor) | int |
1,20,40 | |
| 25 | Subdivide distance (right lower outer wall) | int |
20 | |
| 26 | Subdivide distance (right upper outer wall) | int |
1 | |
| 27 | Near chunks (backward) | int |
Number of chunks for collision/render while going backward Range: 8-128 Default: 32 | |
| 28 | Near chunks (backward extra start) | int |
Chunk index of extra range for collision/render while going backward Default: -1 (disabled) | |
| 29 | Near chunks (backward extra) | int |
Number of chunks for collision/render while going backward Range: 8-128 Default: 0 |
Notes
- ↑ These properties only ever have these values over all 11018 geometry segments of the retail tracks.
Surface type bit flags
These apply for road surface, wall/roof, and outer wall/floor.
| Bit | Mask | Surface type | Notes |
|---|---|---|---|
| 0 | 0x000000FF | Texture |
|
| 1 | |||
| 2 | |||
| 3 | |||
| 4 | |||
| 5 | |||
| 6 | |||
| 7 | |||
| 8 | 0x00000100 | Apply texture | |
| 9 | 0x00000200 | No extras | Excludes the designated "extra" chunks as possible chunks to land on after a jump Can be used to prevent shortcuts on overlapping portions of track Center lane only |
| 10 | 0x00000400 | Partial transparency |
Toggles transparency on textures that contain transparent sections, e.g. guardrail |
| 11 | 0x00000800 | Back |
Toggles application of a different texture on the outside face of walls |
| 12 | 0x00001000 | Flip horizontally | |
| 13 | 0x00002000 | Flip backface | |
| 14 | 0x00004000 | Concave | Renders as concave polygon |
| 15 | 0x00008000 | Prevent jump | Prevents jumping/falling off non-magnetic chunks with speeds of at least ~80 mph Used for top portion of loops |
| 16 | 0x00010000 | Texture pair | |
| 17 | 0x00020000 | Skip render | As if it were nonexistent |
| 18 | 0x00040000 | Flip vertically | |
| 19 | 0x00080000 | Non-magnetic | Car aren't glued to the road |
| 20 | 0x00100000 | Fall off | Allows falling off track (no invisible wall if walls not set) Left/right lanes only |
| 21 | 0x00200000 | Transparent | Requires no texture Changes what texture index does, see texture bits |
| 22 | 0x00400000 | Wall | Cannot be driven on |
| 23 | 0x00800000 | AI fast zone | Forces fast strategy only Center lane only |
| 24 | 0x01000000 | Pit zone | Yellow on track map (any lane) Must have sufficiently long contiguous section for AI to pit Center lane only for other effects |
| 25 | 0x02000000 | Pit | Actual pit work area |
| 26 | 0x04000000 | Pit box | AI pit targets and respawn points Must be at least one pit box for AI to pit (max 10) Center lane only |
| 27 | 0x08000000 | Placement disabled | Disallow spawn here Applies to grid, respawn, flip/fall |
| 28 | 0x10000000 | AI target speed override | Max speed regardless of strategy/difficulty/target Center lane only |
| 29 | 0x20000000 | Echo | Tunnel effect |
| 30 | 0x40000000 | Bounce off walls | Center lane only |
| 31 | 0x80000000 | Special toggle |
|
Building/Sign type
| Value | Name | Description | Requires apply bit? | Texturing |
|---|---|---|---|---|
| 0 | TOWER | tall box | Yes | Index |
| 1 | TOWER 2 | tall box, different texture | No | Fixed (22) |
| 2 | SIGN 1 | small, back upside down, on one leg | Yes, but not for legs | Index, legs fixed (20) |
| 3 | SIGN 2 | small, back upside down, on two legs | Yes, but not for legs | Index, legs fixed (21) |
| 4 | BUILD | complex building, drawn differently, different texture | No | Fixed (20, 21) |
| 5 | BUILD 1 | giant tall folded boxes, different texture | No | Fixed (0) |
| 6 | BUILD 2 | more giant tall folded box, different texture | No | Fixed (20) |
| 7 | BUILD 3 | WIDE short box | Yes | Index |
| 8 | HEELBAR | cube, different texture | No | Fixed (8) |
| 9 | BALLOON | flat square, always face camera | Yes | Index |
| 10 | TREE | flat skinny rectangle, always face camera | No | Fixed (1) |
| 11 | ADVERT | flat small square, fixed, same back | Yes | Index |
| 12 | ADVERT 2 | fixed flat square, back upside down | Yes | Index |
| 13 | QUAD BLD | 4 tall skinny boxes | No | Fixed (23, 24, 25, 26) |
| 14 | BLD 0 | tall box with pyramid top, different texture | No | Fixed (20, 21) |
| 15 | BIG BALL | flat square, always face camera, larger than BALLOON | Yes | Index |
| 16 | BIG AD | fixed flat square, back upside down, smaller than ADVERT 2 | Yes | Index |
| >=256 | no idea |
Textures are determined by BLD file.
- Index: first 9 bits work just like road textures
- Fixed: Same texture is always applied (index in parentheses)
Signs
Empty on some tracks.
Signable geometry indexint |
Textureint
|
| ... | |
| -1 | -1 |
- Signable geometry index
- 0: first geometry section with
0 <= sign type < 256 - 1: second, etc
- 0: first geometry section with
- Texture
- Bits 0-7: index in BLD texture file
- Bit 8: apply texture
- Bit 15: invisible
- No other bits seem to have an effect
Stunts
Controls geometry that moves and potrudes. Empty on some tracks.
Geometry indexint
|
Ramp chunk countint
|
Number of ticksint
|
Tick start indexint
|
Timing groupint
|
Height change per tickint
|
Time bulgingint
|
Time flatint
|
Ramp side lengthint
|
Bulge Sectionint
|
| ... | |||||||||
| -1 | |||||||||
- Ramp chunk count
- Increases the length and height of the "ramp" by increasing the number of chunks before and after the stunt chunk included in the ramp
- Number of ticks
- Number of game ticks the stunt expansion process takes
- 0 breaks the track
- Tick start index
- Index within the animation of the stunt that it will be in when the track loads
- If it's higher than or equal to the number of ticks the stunt glitches out
- Timing group
- With otherwise identical config, two bumps with same number move together
- Appears to be a boolean, 1 is group 1, any other value is group 2
- Height change per tick
- Negative values break the track
- Ramp side length
- The length that the chunks before and after the stunted chunk change to when the stunt is active
- Value is percentage, 1024 = 100%
- Value appears to be the hypotenuse or actual surface length rather than the flat length beneath
- If this value is incompatible with height change per tick * num ticks, it will take priority limiting the max height of the stunt, otherwise the chunk indicated as the "stunt" is stretched in length to make this fit
- Bulge section
- Bit flags to specify which section of the track moves
- Bit 0: left shoulder
- Bit 1: left wall
- Bit 2: left lane
- Bit 3: right lane
- Bit 4: right shoulder
- Bit 5: right wall
- Higher bits move nothing
- Bit flags to specify which section of the track moves
- Ramps are pitch-based, calculate pitch by height/length
- Ramp pitch takes the place of chunk's base pitch rather than being added to it
- Ramps on pitched chunks have odd behavior and will do things like teleport the car to the outside of a loop when active on upsidown sections
- In the release tracks all stunts are on chunks with a base pitch very close to 0
Textures
Texture fileTEX:<DRH file>
| |
Building/Sign texture fileBLD:<DRH file>
| |
BACKS:
| |
Geometry indexint |
Textureint
|
| ... | |
| -1 | |
Backs
The outside texture of walls when there is a wall between the track and the shoulder. Transparent when texture index does not correspond to an actual texture. This indexes into the texture tile list, e.g. when a wall is set to texture x, texture y will display on the "back" side when the show backs flag is set
Race info
Not present on some tracks.
Track numberint
| |||||
Impossible lapsint |
Hard lapsint |
Tricky lapsint |
Medium lapsint |
Easy lapsint |
Girlie lapsint
|
Track map scale, smaller is largerfloat |
Track map chunk sampling intervalint |
Track preview scale, smaller is largerfloat
|
Effects
Bonus 7
- Swapping yaw and pitch: loop
- Swapping yaw and roll: twisting line
- Swapping yaw and pitch, roll 90.00000: vertical ring to the left
- Negative yaw: turnright
Length
Given Pulse at its maximum 193 mph on a modified Bonus 4 where all 494 sectors are 1200 long can complete at lap in 28.36 seconds and on the same track but with 50 flat sectors on each side shortened to 100 can complete a lap in 27.41 seconds, 1000 length units is equivalent to 13.45 ft or 4.10 m. Additionally, the rotated portions of the track contribute approximately 0.20 seconds extra compared to flat.
Palette (PAL) files
Texture color palettes.
PALETTE.PAL
Index 0x00 may be treated as having a fully transparent alpha (RBGA #00000000). All other colors are fully opaque, including the other black at index 0x70 (RBGA #000000FF).
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
| 0x | ||||||||||||||||
| 1x | ||||||||||||||||
| 2x | ||||||||||||||||
| 3x | ||||||||||||||||
| 4x | ||||||||||||||||
| 5x | ||||||||||||||||
| 6x | ||||||||||||||||
| 7x | ||||||||||||||||
| 8x | ||||||||||||||||
| 9x | ||||||||||||||||
| Ax | ||||||||||||||||
| Bx | ||||||||||||||||
| Cx | ||||||||||||||||
| Dx | ||||||||||||||||
| Ex | ||||||||||||||||
| Fx |