HZC is a collision format used in some Nintendo DS and Nintendo 3DS games developed by Firebrand Games such as Cartoon Network Racing DS and Race Driver: Create & Race.
File Format
The file byte order is always little endian.
The file starts with the following header:
| Offset |
Type |
Description
|
| 0x00 |
UInt16 |
Version number.
|
| 0x02 |
UInt16 |
Number of vertices (V).
|
| 0x04 |
UInt16 |
Number of triangles (T).
|
| 0x06 |
UInt16 |
Number of custom attributes (A).
|
Vertex Data
Followed by the header, there's plain vertex position data stored as a sequence of groups of 3 Int32s (one per axis). The values are divided by 1024.
| Offset |
Type |
Description
|
| 0x00 |
Int32[3][V] |
Vertex XYZ coordinates.
|
Triangle Index Data
After the vertex data, there's a list of T * 3 UInt16s that correspond to the indices of each triangle.
| Offset |
Type |
Description
|
| 0x00 |
UInt16[3][T] |
Triangle indices.
|
Triangle Normal Data
Directly after the triangle indices there are the triangle's face normals, consisting of 3 Int32s per triangle. They seem to match the cross product of the triangle's first two edges with a magnitude of 4096.
| Offset |
Type |
Description
|
| 0x00 |
Int32[3][T] |
Triangle XYZ normals.
|
Grid
Followed by the triangle normal data, there's a spatial grid consisting of 3D cells used for better collision detection. Each cell corresponds to an index to the Linked List Array.
| Offset |
Type |
Description
|
| 0x00 |
Int32 |
Number of cells (C).
|
| 0x04 |
UInt16[C] |
Cell indices. 0xFFFF if empty.
|
Grid Info
| Offset |
Type |
Description
|
| 0x00 |
Int32[3] |
Number of cells in the grid's XYZ dimensions.
|
| 0x0C |
Int32[3] |
Grid bounding box minimum XYZ position.
|
| 0x18 |
Int32[3] |
Grid bounding box maximum XYZ position.
|
| 0x24 |
Int32 |
Unknown. Always 0?
|
Linked List Array
After the grid data there's an array of triangle/cell links.
| Offset |
Type |
Description
|
| 0x00 |
Int32 |
Number of links (L).
|
| 0x04 |
UInt16[2][L] |
Triangle index and next index. The next index is 0xFFFF at the end of a cell's chain, otherwise another index into this same array (?)
|
Custom Attribute Table
This section is only present if A > 0. It contains a list of T UInt16s that link each triangle to a Key-Value Property in a string table. Some tracks contain unused attributes.
| Offset |
Type |
Description
|
| 0x00 |
UInt16[T] |
Attribute IDs. 0xFFFF if none.
|
String Table
Key-Value Property
| Offset |
Type |
Description
|
| 0x00 |
UInt16 |
Key string length (PK).
|
| 0x02 |
String (Char[PK]) |
Attribute key.
|
| 0x02 + K |
UInt16 |
Value string length (PV).
|
| 0x04 + K |
String (Char[PV]) |
Attribute value. Always float(SurfaceType)=X.000000.
|
Seen attributes (Cartoon Network Racing DS)
| Key |
Value |
Found in
|
| COL_grass
|
float(SurfaceType)=1.000000
|
- CrossTown.hzc
- evilGlade.hzc
- IslandDash.hzc
|
| grass
|
float(SurfaceType)=1.000000
|
Townsville.hzc
|
| Grass
|
float(SurfaceType)=1.000000
|
- AronSpeed.hzc
- MandarkLab.hzc
- MidNowhere.hzc
|
| heavyTerrain
|
float(SurfaceType)=2.000000
|
- CrossTown.hzc
- MandarkLab.hzc
- SnowSunday.hzc
|
| HeavyTerrain
|
float(SurfaceType)=3.000000
|
- IslandDash.hzc
- MandarkLab.hzc
|
| MudPuddle
|
float(SurfaceType)=5.000000
|
IslandDash.hzc
|
| not_track
|
- float(SurfaceType)=1.000000
- float(SurfaceType)=4.000000
|
- MandarkLab.hzc
- MidNowhere.hzc
- Townsville.hzc
|
| raceTrackFloor
|
—
|
DextersLab.hzc
|
| raceTrackWalls
|
—
|
DextersLab.hzc
|
| RoughGround
|
- float(SurfaceType)=0.000000
- float(SurfaceType)=4.000000
|
- AronSpeed.hzc
- MandarkLab.hzc
- MidNowhere.hzc
|
| terrainLight
|
float(SurfaceType)=0.000000
|
- MandarkLab.hzc
- MountRush.hzc
|
Version List
Version List
Tools
The following tools can handle HZC files: