---===[ SM64DS LEVEL FORMAT DOC ]===--- By Mega-Mario ---===[ WHERE TO FIND THE DATA ]===--- In a clean ROM, the level data is found in overlays 8 to 59 (one overlay per level). However, that level data has no unified structure, and is all surrounded with code and data relating to certain objects, so it is a pain to modify without breaking the game. SM64DSe, since version 1.1, creates new overlays (typically overlays 103 to 154), and moves each level's data in its new overlay, restructuring it in a more unified structure. The new overlays are also programmed to load the old overlays they are replacing, so that objects relying on the old overlays still work. ---===[ LEVEL HEADERS ]===--- Level header as generated by SM64DSe v2.1x (patch version 4). Offset Size Desc 00 84 Overlay initializer/deinitializer code 54 1 Object bank 0 setting 55 1 Object bank 1 setting 56 1 Object bank 2 setting 57 1 Object bank 3 setting 58 1 Object bank 4 setting 59 1 Object bank 5 setting 5A 1 Object bank 6 setting 5B 1 Zero 5C 4 Object bank 7 setting 60 4 Address of the CLPS chunk 64 4 Address of the 'misc' objects table 68 2 Internal file ID of the level model (.bmd) 6A 2 Internal file ID of the level collision map (.kcl) 6C 2 Internal file ID of the minimap tileset (.icg) 6E 2 Internal file ID of the minimap palette (.icl) 70 4 Address of the level area data 74 1 Number of level areas 75 1 Zero - start with normal camera, 1 start the level with 'far' camera 76 2 Scale factor for minimap coordinates 78 1 bit0-3: ??? (always 0xF), bit4-7: sky/background (0=none, or 1-11) 79 3 Zero (?) 7C 3 Music data (byte 1: unknown (SWAR (1-) index?), byte 2: unknown, byte 3: SSEQ (0-) index) 7F 21 Reserved for future use 94 ... Level data This header is generated by SM64DSe's patching, and isn't found under this form in the original game data. However, the block from 0x60 to 0x7C (28 bytes) can be found in a similar format in the original level overlays, but at varying offsets. The block from 0x54 to 0x5B (7 bytes) is originally hardcoded in the game binary. The dword at 0x5C isn't an original feature of the game engine-- it is made possible by the new level format only. The level music data was previously stored in a 156 byte table consisting of 52 3-byte entries. Since version 2.1x, music data has been moved to within the individual overlays. All the data past 0x94 is copied from the original level overlays. ---===[ LEVEL AREA DATA ]===--- Each entry is 12 bytes. Number determined by header[0x74]. Offset Size Desc 00 4 Address of the objects table (NULL = no table) 04 4 Address of the texture animation data (NULL = no data) 08 1 Minimap tilemap index 09 3 ??? The objects table uses the same format as the one header[0x64] points to. Except it typically only contains objects of type 0 and 5. The other object types are contained by the header[0x64] table. ---===[ OBJECT TABLES ]===--- First part: 8 bytes Offset Size Desc 00 4 Number of entries in table 04 4 Address of the object table Object table: 8 bytes per entry Offset Size Desc 00 1 Bit0-4: object type; Bit5-7: layer (0=all stars, 1-7=star 1..7) 01 1 Number of objects 02 2 Zero (?) 04 4 Address of the object list Valid object types: * 0: level objects, standard format (16 bytes per object) * 1: level entrances (16 bytes per object) * 2: path nodes (6 bytes per object) * 3: paths (6 bytes per object) * 4: views/camera anchors (14 bytes per object) * 5: level objects, simple format (8 bytes per object) * 6: teleport source points (8 bytes per object) * 7: teleport dest. points (8 bytes per object) * 8: fog (8 bytes per object) * 9: doors/inter-area warps (12 bytes per object) * 10: level exits (14 bytes per object) * 11: minimap tilemap file IDs (2 bytes per object) * 12: minimap scale (2 bytes per object) * 14: unknown (4 bytes per object) ---===[ OBJECT TYPE 0: LEVEL OBJECTS (STANDARD) ]===--- 16 bytes per object. Offset Size Desc 00 2 Object ID 02 2 X position (divide by 1000 to obtain 3D coordinate) 04 2 Y position 06 2 Z position 08 2 Object-specific parameter (2) 0A 2 Y rotation (0x0400 = 90°) 0C 2 Object-specific parameter (3) 0E 1 Object-specific parameter (1) 0F 1 Object-specific parameter (4) The first two object-specific parameters (2 and 3 in SM64DSe) should be X and Z rotation, respectively. However, most objects ignore them. A few objects use them as X/Z rotation, and some other objects use it for other purposes. ---===[ OBJECT TYPE 1: ENTRANCES ]===--- 16 bytes per object. Offset Size Desc 00 2 Must be zero (?) 02 2 X position 04 2 Y position 06 2 Z position 08 2 Parameter (?) 0A 2 Y rotation 0C 2 Parameter (?) 0E 2 Parameter (meaning=idk; weird) ---===[ OBJECT TYPE 2: PATH NODES ]===--- 6 bytes per object. Offset Size Desc 00 2 X position 02 2 Y position 04 2 Z position ---===[ OBJECT TYPE 3: PATHS ]===--- 6 bytes per object. Path ID set in 0xF in supported objects. Offset Size Desc 00 2 Start Node Index 02 1 Number of Nodes 03 1 Parameter (? always 255) 04 1 Parameter (? inheritance?) 05 1 Parameter (? always either 255 or 127) ---===[ OBJECT TYPE 4: VIEWS/CAMERA ANCHORS ]===--- 14 bytes per object. Offset Size Desc 00 2 Parameter (?) 02 2 X position 04 2 Y position 06 2 Z position 08 2 Parameter (?) 0A 2 Y Rotation 0C 2 Parameter (?) ---===[ OBJECT TYPE 5: LEVEL OBJECTS (SIMPLE) ]===--- 8 bytes per object. This format is commonly used for objects like trees and coins, that don't require extensive parameters. Offset Size Desc 00 2 bit0-8: object ID; bit 9-15: object-specific parameter (1) 02 2 X position 04 2 Y position 06 2 Z position ---===[ OBJECT TYPE 6: TELEPORT SOURCE ]===--- 8 bytes per object. Offset Size Desc 00 2 X position 02 2 Y position 04 2 Z position 06 1 Parameter (?) 07 1 Destination index (0-) * 10 ---===[ OBJECT TYPE 7: TELEPORT DESTINATION ]===--- 8 bytes per object. Offset Size Desc 00 2 X position 02 2 Y position 04 2 Z position 06 2 Parameter (?) ---===[ OBJECT TYPE 8: FOG ]===--- 8 bytes per object. Adds fog to a level. Offset Size Desc 00 1 Density (0 = None, 1 = Show fog) 01 1 Red Colour Component (0 - 255) 02 1 Green Colour Component (0 - 255) 03 1 Blue Colour Component (0 - 255) 04 2 Start distance 06 2 End distance ---===[ OBJECT TYPE 9: DOOR OBJECTS ]===--- 12 bytes per object. Offset Size Desc 00 2 X position 02 2 Y position 04 2 Z position 06 2 Y Rotation 08 1 For virtual doors, the width and height of the door plane (bits 0 - 3 Plane X, 4 - 7 Plane Y) 09 1 IDs of 'inside' and 'outside' areas (bits 0 - 3 inside ID, 4 - 7 outside ID) 0A 1 Door type ---===[ OBJECT TYPE 10: EXITS ]===--- 14 bytes per object. Offset Size Desc 00 2 X position 02 2 Y position 04 2 Z position 06 2 Paramater (?) 08 2 Y Rotation 0A 1 Destination level ID 0B 1 Destination level entrance ID 0C 2 Parameter (?) ---===[ OBJECT TYPE 11: MINIMAP TILE ID ]===--- 2 bytes per object. Offset Size Desc 00 2 minimap tilemap file ID ---===[ OBJECT TYPE 12: MINIMAP SCALE ]===--- 2 bytes per object. Offset Size Desc 00 2 Minimap scale (Divide by 1000?) ---===[ OBJECT TYPE 14: UNKNOWN ]===--- 4 bytes per object. Seems to do absolutely nothing. Offset Size Desc 00 2 Parameter (?) 02 2 Parameter (?) 04 2 Parameter (?) 08 2 Parameter (?) ---===[ TEXTURE ANIMATION DATA ]===--- 24 bytes per entry. Offset Size Desc 00 4 Total number of frames 04 4 Address of the scale values table (4 bytes each, 20:12 fixedpoint) 08 4 Address of the rotation values table (2 bytes each, 0x0400 = 90°) 0C 4 Address of the translation values table (4 bytes each, 20:12 fixedpoint. Translation orientation defined by rotation) 10 4 Number of animations 14 4 Address of the animation data Animation data: 28 bytes per entry. Offset Size Desc 00 4 ??? 04 4 Address of the name of the material with the texture to animate (null-terminated ascii string) 08 4 ??? 0C 2 Number of scale values 0E 2 Start offset in dwords in the scale values table 10 2 Number of rotation values 12 2 Start offset in words in the rotation values table 14 2 Number of translation values 16 2 Start offset in dwords in the translation values table 18 4 ???