BCO (File Format)
A BCO contains the track's collision data in Mario Kart: Double Dash!!. It is split into 4 parts, where only 2 are known, and are listed below.
File Header
Offset | Type | Description |
---|---|---|
0x00 | String | File magic. Always will be 0003 in ASCII. |
0x04 | UInt16 | Grid width. |
0x06 | UInt16 | Length of grid. |
0x08 | Int32 | X Start of grid. |
0x0C | Int32 | Z Start of grid. |
0x10 | Int32 | Grid cell X size. |
0x14 | Int32 | Grid cell Z size. |
0x18 | Int16 | The number of entries in the last section. |
0x1A | Int16 | Possible padding. Always 0x0000. |
0x1C | UInt32 | Triangle indices offset. |
0x20 | UInt32 | Triangle list offset. |
0x24 | UInt32 | Vertex list offset. |
0x28 | UInt32 | Material list offset. |
0x2C | End of File Header |
Triangles
Triangles are parts of the collision format that are formed from 3 vertices. Triangles also have the collision type for the defined triangle. The structure is a 0x24 byte structure defined below.
Offset | Type | Description |
---|---|---|
0x00 | Int32 | The index of the first point of the triangle, from the vertex list. |
0x04 | Int32 | The index of the second point of the triangle, from the vertex list. |
0x08 | Int32 | The index of the third point of the triangle, from the vertex list. |
0x0C | Float | Unknown |
0x10 | Int16 | X Direction of normal vector. |
0x12 | Int16 | Y Direction of normal vector. |
0x14 | Int16 | Z Direction of normal vector. |
0x16 | UInt16 | Collision Flags |
0x18 | Byte | Table for getting Min/Max X/Z values. |
0x19 | Byte | Camera Code - relates to the position of the player's view camera.
|
0x1A | Int16 | Neighboring Triangle 1 |
0x1C | Int16 | Neighboring Triangle 2 |
0x1E | Int16 | Neighboring Triangle 3 |
0x20 | Byte | Unknown. Values in the stock courses are: 0x00, 0x01 (only in 0x0A__ dead zones), 0x30, and 0x50.
|
0x21 | Byte | Appears to be a flag.
|
0x22 | Byte |
|
0x23 | Byte | ID of the associated GeoSplash object where applicable. Seen in:
|
0x24 | End of Section |
Vertices
Vertices are sets of 3 floats that form a triangle. Each vertex structure is defined in a 0x0C byte structure below.
Offset | Type | Description |
---|---|---|
0x00 | Float | X position of the vertex. |
0x04 | Float | Y position of the vertex. |
0x08 | Float | Z position of the vertex. |
0x0C | End of Section |
Material Table
This is a section with an unknown purpose. It is referred to as the matTable in game code. The number of entries is defined in byte 0x18 in the header. The 0xC byte structure is defined below.
Offset | Type | Description |
---|---|---|
0x00 | UInt16 | Collision flag |
0x02 | Int16 | Sound ID |
0x04 | UInt32 | unknown |
0x08 | UInt32 | Unknown |
0x0C | End of Section |
Collision Flags
Each triangle face has a collision flag that defines how the face acts when the player interacts with it. This can define whether it's sand, mud, ice, and more.
ID | Basic Type | Second Byte | Description | Details (Vanilla examples) | Debug String |
---|---|---|---|---|---|
0x00__ | Road | Particles | Medium offroad | Used for the mud sections in Waluigi Stadium and sand in Luigi Circuit | DIRT |
0x01__ | Road | Particles | Normal Road | Normal road | ROAD |
0x02__ | Wall | - | Kart and item wall | - | WALL |
0x03__ | Road | Particles | Medium offroad | Used for grass in multiple courses | GRASS |
0x04__ | Road | Particles | Slippery Ice | - | ICE |
0x05__ | Deadzone | Respawn Point | Horizontal bar deadzone | Used for deadzones on level with the road, like in Mushroom City | RESQ |
0x06__ | - | - | Mario Circuit grassy wall (possibly) | Should be investigated further | SLIP |
0x07__ | Boost | Respawn Point (Optional) | Zipper on a ramp | Found in Bowser's Castle and Wario Colosseum | DASHJ |
0x08__ | Boost | - | Zipper Boost | - | DASHB |
0x09__ | Boost / Teleportation | Respawn Point | Cannon Boost | Requires a GeoCannon object | CANNON |
0x0A__ | Deadzone | Respawn Point | Circle deadzone | Usually used in the air, such as in Rainbow Road | |
0x0B__ | Road | Respawn Point | Peach Beach sand | - | BEACH |
0x0C__ | Road | - | Weak Offroad | Used for yellow Dry Dry Desert sand | |
0x0D__ | Teleportation | Respawn Point | Pipe / Teleportation collision | Used in Peach Beach and Mushroom Bridge pipes | |
0x0E__ | Deadzone | Respawn Point | Sand deadzone | Used in Dry Dry Desert in vanilla | RESQD |
0x0F__ | Deadzone | Respawn Point | Wavy deadzone | Used for water - in vanilla, requires a GeoSplash object | RESQS |
0x10__ | Deadzone | Respawn Point | Quicksand Sinkhole | Must have an inner and an outer circle of deadzone triangles - the deadzone is the inner circle | VALLEY |
0x11__ | Deadzone | Respawn Point | PB sand | Function as a deadzone when interacting with heavy water | |
0x12__ | Wall | Sound | Kart wall - not item wall | - | OUTF |
0x13__ | Road | Particles | Heavy Offroad | Used for orange Dry Dry Desert sand | |
0x37__/0x47__ | Boost | Respawn Point | Zippers with respawn points | Used on ramps, usually before a gap to ensure a higher jump |
Sound Types
Each triangle also has a Sound-Type associated with it that defines how the face sounds when the player interacts with it. These are not part of the material name, but instead set in the obj_sound.txt files.
ID | Sound | Vanilla examples |
---|---|---|
0x00 | Asphalt / Street | Used for the main road in Luigi Circuit and Baby Park |
0x01 | Dirt / Gravel | Used for the main road in DK Mountain and Dino Dino Jungle |
0x02 | Stone / Pavement | Used for the inside of the cave in Dino Dino Jungle and the castle in Bowser's Castle |
0x03 | Wooden Curb | Used for the curbs in Luigi Circuit and Mario Circuit |
0x04 | - | - |
0x05 | Wooden Bridge | Used for the bridges in Dino Dino Jungle and Bowser's Castle |
0x06 | Ice | Used for the slippery ice and the inside of the cave in Sherbet Land |
0x07 | Grass | Used in a lot of courses |
0x08 | Stone Wall | Used in a lot of courses |
0x09 | Metal Wall | Used in a lot of courses |
0x0A | Sand | Used for the medium offroad in Dry Dry Desert |
0x0B | Rainbow | Used for the main road in Rainbow Road |
0x0C | Metal Grid | Used for the metal grids in Wario Colosseum and Bowser's Castle |
0x0D | Mud | Used for the deep Mud in Waluigi Stadium |
0x0E | - | - |
0x0F | Grass Wall | Used for the hedges in Mario Circuit |
0x10 | Dirt Wall | Used in a lot of courses |
0x11 | Wood Wall | Used for the ramp walls on Peach Beach |
0x12 | - | - |
0x13 | Small Pipe Wall | Used for the small pipes on Luigi Circuit |
0x14 | Metal | Used for the main road in Wario Colosseum and the bridge in Mushroom Bridge |
0x15 | Carpet / Smooth | Used for the carpet in Bowser's Castle and the arrow markings in Wario Colosseum |
0x16 | Snow | Used for the main road and the offroad in Sherbet Land |
0x17 | Wood / Parquet | Used for the wooden floors in Daisy Cruiser |
0x18 | Glass | Used for the glass floors in GameCube and Tilt-a-Kart |
0x19 | Jelly Wall | Used for the jelly walls in Cookie Land |
0x1A | DDJ Logs | Used for the logs in Dino Dino Jungle |
0x1B | Big Pipe Wall | Used for the big pipes in Waluigi Stadium (much deeper than 0x13 and features reverb) |
0x1C | Silent Sand | Used for the main road in Dry Dry Desert (much quieter than 0x0A) |
0xFF | Default Wall | Used for the walls around Deadzones |