=====LEV File Specification===== ====Main Header==== 4 bytes: size of the level file header \\ 2 bytes: (with 3 bytes of padding) that describes the version number of the header \\ 4 bytes: Unknown/Unused \\ 4 bytes: A 32 bit integer that refers to the position in the file where some now obsolete data is. \\ 4 bytes: Unknown/Unused \\ 4 bytes: A 32 bit integer that refers to the position in the file where the navigation data is. \\ ===Map Data Header=== 1 byte: size of the file header \\ 4 bytes: An 8 bit integer (with 3 bytes of padding) that describes the version number of the header \\ 8 bytes: A 64 bit integer that describes how many Unique IDs for things that have been used. \\ 4 bytes: width (32 bit integer) \\ 4 bytes: height (32 bit integer) \\ 1 byte: A Boolean which is always true \\ ====Map Data==== 33792 bytes: A "palette" of themes that can be on the height field \\ 4 bytes: Ambient Sound Version. 3 = Global, 0 = Use Heightmap Sound \\ 4 bytes: The number of sound themes that are available. \\ 33792 bytes: A "palette" of sound atmosphere themes that can be on the height field. \\ 4 bytes: A checksum. this exists only if the map header pad byte 2 is 9 loop of number of sound themes - 1 uint string length char[string length] string endloop ===HeightMap=== Then, the real meat of the file: the heightfield data. (Width+1)*(Height+1) (read in above) cells are written out. A cell consists of the following data: 4 bytes: A 32 bit integer that's the size of the cell being written (should always be the same for every cell). \\ 1 bytes: An 8 bit integerthat describes the version number of the cell \\ 4 bytes: A 32 bit floating point number that's the height of the ground at that point divided by 2048. \\ 1 byte: Should be 0. \\ 3 bytes: These are actually an array of 3 single bytes. Each byte refers to a ground theme in the palette defined in the header. \\ 2 bytes: A 2 element array that contains the strength of the ground themes in the previous array. The 2 numbers should add up to 255 (less if 3 themes are used). \\ 1 byte: A Boolean that specifies whether the hero can walk on the ground at this point. \\ 1 byte: A Boolean that specifies whether the camera is allowed to pass over the ground at this point. \\ 1 byte: Sound Theme \\ 1 byte: Should be 0. \\ 1 byte: Boolean that specifies whether this cell is a shore point \\ 1 byte: Unknown/Unused \\ ===Sound Map=== There then follows a Width*Height amount of cells. These cells have the following format: 4 bytes: A 32 bit integer that's the size of the cell being written. \\ 1 byte: An 8 bit integer that describes the version number of the cell \\ 3 bytes: A 3 element array with each byte referring to a sound atmosphere theme in the palette defined in the header. \\ 2 bytes: A 2 element array that contains the strength of the sound atmosphere themes in the previous array. The 2 numbers should add up to 255 (less if 3 themes are used) \\ 1 byte: A sound theme palette index. \\ =====Navigation Data===== ====Main Header==== 4 bytes - Start of Navigation Data \\ 4 bytes - Number of Navigation Sections \\ [Section Names] \\ 4 bytes - String Length [String Length] String 4 bytes - Start of Section's Navigation Data [/Section Names] ====Section Header==== 4 bytes - Size \\ 4 bytes - Version \\ 4 bytes - Level Width \\ 4 bytes - Level Height \\ 4 bytes - Unknown //Number of levels, see navigation nodes// \\ 4 bytes - Number Interactive Nodes \\ [[lev#Interactive Nodes|[Interactive Nodes]]] //Location of Interactive Items//\\ 4 bytes - Number of SubSets \\ 4 bytes - Number of Level Nodes \\ [[lev#Level Nodes|[Level Nodes]]] //Walkable Area layered by accuracy// \\ ===Interactive Nodes=== 4 bytes - X coord \\ 4 bytes - Y coord \\ 4 bytes - SubSet \\ ===Level Nodes=== A Subset has 7 Layers (0-6), each defining blocks of walkable area. \\ Layer 0 = 32 X 32 \\ Layer 1 = 16 X 16 \\ Layer 2 = 8 X 8 \\ Layer 3 = 4 X 4 \\ Layer 4 = 2 X 2 \\ Layer 5 = 1 X 1 \\ Layer 6 = 0.5 X 0.5 \\ ==Standard and Root Nodes== **//00 00 00 00//** \\ **//00 01 00 00//** \\ struct NAV_STANDARD_NODE { BYTE unknown BYTE ROOT BYTE unknown BYTE END BYTE Layer; //0-6 BYTE SubSet; FLOAT X Coord; FLOAT Y Coord; DWORD NodeID; DWORD ChildNode; //Top Right DWORD ChildNode; //Top Left DWORD ChildNode; //Bottom Right DWORD ChildNode; //Bottom Left }; ==Navigation Nodes== **//00 00 00 01//** \\ **//00 01 00 01//** \\ struct NAV_NODE { BYTE unknown BYTE ROOT BYTE unknown BYTE END BYTE Layer; //0-6 BYTE SubSet; FLOAT X Coord; FLOAT Y Coord; DWORD NodeID; DWORD Level; //Represents some sort of z level attribute BYTE Unknown; //So far, Subset 0 = 0 or 128, SubSet 1+ = 64 DWORD NumberNodes; DWORD AdjacentNode[NumberNodes]; //Adjanent navigation or exit nodes }; ==Exit Node== **//01 00 00 01//** \\ **//01 00 01 01//** \\ struct EXIT_NODE { BYTE unknown BYTE ROOT BYTE unknown BYTE END BYTE Layer; //0-6 BYTE SubSet; FLOAT X Coord; FLOAT Y Coord; DWORD NodeID; DWORD Level; //Represents some sort of z level attribute BYTE Unknown; //So far, Subset 0 = 0 or 128, SubSet 1+ = 64 DWORD NumberNodes; DWORD AdjacentNode[NumberNodes]; //Adjanent navigation or exit nodes DWORD NumberUIDs; QWORD TNG_UID[NumberUIDs]; // Stripped UID to create the real uid add 18446741874686296064 to this value }; ==Blank Node== **//00 01 01//** \\ struct BLANK_NODE { BYTE unknown; BYTE ROOT; BYTE unknown; };