## Contents

## Introduction[]

The .4ds format in version 41 is the basic format for 3D objects in Hidden & Dangerous 2. 4ds was also used for Mafia and Chameleon but in different versions.

## Structure[]

For having a better and easier understanding, we split the file into three parts: header, images and objects.

### Header[]

Each .4ds file has following values at its beginning.

Map.4ds | meaning | example |
---|---|---|

first 4 bytes | file format | 4ds. |

16-bit INT | file version | 2900 (41) |

8 bytes | timestamp | 002E 9F89 5048 C301 |

### Images[]

Here all images listed which are used. Allowed are Bitmaps(.bmp) and Targa Image Files (.tga)

First we have the attribute for the total amount of pictures. If you added a picture in your map.4ds file, don't forget to update this value.

It's a 16-bit INT e.g. **0700**, 7 images.

After the amount, each image is listed after the following structure:

Image | ||
---|---|---|

4x 8-bit INT | unknown, activates Alpha channel (transparency) | 0 128 63 15 (1 128 21 32) |

4x 32-bit FLOAT | Ambient color | 0.5 0.5 0.5 0 |

4x 32-bit FLOAT | Diffuse color | 0.5 0.5 0.5 0 |

4x 32-bit FLOAT | Specular color | 0.045 0.045 0.045 0 |

4x 32-bit FLOAT | Self illumination color | 0.0 0.0 0.0 0.0 |

32-bit FLOAT | shininess/glossiness | 25 |

8-bit INT | unknown | 0 |

32-bit FLOAT | opacity | 0(0%) to 1 (100%) |

8-bit INT | amount of characters (of label) | 14 |

differs | label | MAPA_AF3_2.BMP |

### Objects[]

The last image is followed by a 16-bit INT, which represents the number of objects e.g. 0A00 (10 objects).

Each object has a header, which is described below. After the header comes the actual object data. A list of all object types can be found here: object types

#### Object header[]

The visual object type and flags are only present if the object type is a visual object.

Description | Example | |
---|---|---|

8-bit INT | object type | object types |

8-bit INT | visual object type | visual types |

16-bit INT | flags | static collision? receive shadows? cast shadows? |

16-bit INT | father index (0: none) | 2 |

3x 32-bit FLOAT | position: x, y, z | -0.192 -0.132 -0.273 (position relavitly to father object) |

4x 32-bit FLOAT | rotation: x, y, z, w (quaternions) | 0.5 0.5 -0.5 0.5 |

3x 32-bit FLOAT | scale: x, y, z | 1 1 1 |

32-bit FLOAT | unknown | always 0 |

8-bit INT | unknown | always 9 for non sector objects |

8-bit INT | number of letters | 10 |

Label | unique object name |
"objective1" |

8-bit INT | number of letters | 7 |

Label | custom user properties | "VOLB,36" |

#### Visual[]

##### MeshObject[]

Description | Example | |
---|---|---|

16-bit INT | instance ID | |

8-bit INT | number of LODs (Level of Detail) | |

for each LOD | ||

32-bit FLOAT | LOD draw distance | |

32-bit INT | extra data (length) | |

16-bit INT | number of vertices | |

for each vertex | ||

3x 32-bit FLOATs | vertex position: x, y, z | |

3x 32-bit FLOATs | vertex normal: nx, ny, nz | |

2x 32-bit FLOATs | texture vertex: u, v | |

end for each vertex | ||

8-bit INT | number of face groups | |

for each face group | ||

16-bit INT | number of faces | |

Nx (3x 16-bit INT) | face vertex indices: a, b, c | |

16-bit INT | bitmap id |

##### SingleMesh[]

Inherits MeshObject data.

Description | Example | |
---|---|---|

8-bit INT | number of joints | |

4x 32-bit FLOAT | minimum position? x, y, z, 0 | |

4x 32-bit FLOAT | maximum position? x, y, z, 0 | |

N x 8-bit INT | parent index of N-th joint | |

for each joint | ||

16x 32-bit FLOAT | joint transform matrix | |

4x 32-bit FLOAT | minimum position? x, y, z, 0 | |

4x 32-bit FLOAT | maximum position? x, y, z, 0 | |

end for each joint | ||

for each LOD (from Object) | ||

32-bit INT | number of weighted vertices | |

for each weighted vertex | ||

8-bit INT | joint index | |

8-bit INT | vertex weight? |

##### SingleMorph[]

Inherits SingleMesh and Morph data.

##### Billboard[]

Inherits MeshObject data.

Description | Example | |
---|---|---|

32-bit INT | axis? | |

8-bit INT | unknown |

##### Morph[]

Inherits MeshObject data.

Description | Example | |
---|---|---|

8-bit INT | number of morph targets | |

8-bit INT | number of morphed parts (hand, eye, etc) | |

8-bit INT | unknown | |

for each morphed parts | ||

16-bit INT | number of morphed vertices | |

for each morphed vertex | ||

for each morph target | ||

3x 32-bit FLOAT | morphed vertex position: x, y, z | |

3x 32-bit FLOAT | morphed vertex normal: nx, ny, nz | |

end for each morph target | ||

end for each morphed vertex | ||

Nx 16-bit INT | mapping from N-th morphed vertex to origial vertex | |

end for each morphed parts | ||

12x 32-bit FLOAT/INT | unknown |

##### Lens[]

Description | Example | |
---|---|---|

8-bit INT | number of glows | |

for each glow | ||

32-bit FLOAT | unknown | |

32-bit FLOAT | unknown | |

16-bit INT | material ID |

##### Mirror[]

Description | Example | |
---|---|---|

33x 32-bit FLOAT/INT | unknown | |

32-bit INT | number of vertices | |

32-bit INT | number of faces | |

Nx (4x 32-bit FLOAT) | vertex positions: x, y, z, 0 | |

Nx (3x 16-bit INT) | face vertex indices: a, b, c |

#### Sector[]

Description | Example | |
---|---|---|

32-bit INT | unknown | |

32-bit INT | unknown | |

32-bit INT | number of vertices | |

32-bit INT | number of faces | |

4x 32-bit FLOAT | minimum vertex position: x, y, z, 0 | |

4x 32-bit FLOAT | maxmimum vertex position: x, y, z, 0 | |

N x (4x 32-bit FLOAT) | vertex positions: x, y, z, 0 | |

N x (3x 16-bit INT) | face vertex indices: a, b, c | |

8-bit INT | number of portals | |

for each portal | ||

8-bit INT | number of portal vertices | |

3x 32-bit FLOAT | portal plane normal | |

32-bit FLOAT | portal plane distance | |

32-bit INT | portal flags? | |

32-bit FLOAT | portal near range? | |

32-bit FLOAT | portal far range? | |

32-bit FLOAT/INT | unknown | |

Nx (4x 32-bit FLOAT) | portal vertex positions: x, y, z, 0 |

#### Dummy[]

Dummies are cuboids, mostly cubes. The 2 extents are two points in space which form the diagonal of a cuboid/box.

Description | Example | |
---|---|---|

3x 32-bit FLOAT | minimum extent of dummy box | |

32-bit INT | unknown | |

3x 32-bit FLOAT | maximum extent of dummy box | |

32-bit INT | unknown |

#### Target[]

Description | Example | |
---|---|---|

16-bit INT | unknown | |

8-bit INT | unknown : N | |

Nx (16-bit INT) | target ID? |

#### Joint[]

Description | Example | |
---|---|---|

32-bit INT | unique joint ID |

#### Occluder[]

Description | Example | |
---|---|---|

32-bit INT | number of vertices | |

32-bit INT | number of faces | |

Nx (4x 32-bit FLOAT) | vertex positions: x, y, z, 0 | |

Nx (3x 16-bit INT) | face vertex indices: a, b, c |

### Animation[]

Finally, at the end of each .4ds file comes a 8-bit INT value, which is always 0 unless an corresponding .5ds animation file exists.