Each DGN file fully describes a level of the dungeon.
The entrance of the dungeon shown during the title sequence is stored in LEV00.DGN (not playable). The automap for this level (SMAP00.BIN) is in fact an unused duplicate of the automap for LEV02.
The other DGN files (LEV01.DGN to LEV15.DGN) are the actual dungeon levels. LEV1.DGN is the hall of champions where the game starts.
The files are structured in 800h = 2048 bytes blocks.
There is one block for the header followed by 3 structures of variable size.
In the header, the offsets and sizes of the 3 structures are not specified in bytes but in numbers of blocks.
At the end of each structure, 00h bytes are padded until the next 2048 bytes block boundary. A DGN file looks like:
Offset Description 0000 byte 01 0001 byte Level number (value is 1 for both levels 0 and 1) 0002 00 24 01 01 01 00 00 00 00 00 000C word Offset of Structure1 (in number of 800h blocks) 000E word Size of Structure1 (in number of 800h blocks) 0010 dword Size of Structure1 useful data in bytes (without the padding bytes) 0014 word Offset of Structure2 (in number of 800h blocks) 0016 word Size of Structure2 (in number of 800h blocks) 0018 dword Size of Structure2 useful data in bytes (without the padding bytes) 001C word Offset of Structure3 (in number of 800h blocks) 001E word Size of Structure3 (in number of 800h blocks) 0020 dword Size of Structure3 useful data in bytes (without the padding bytes) 0024 Padding until end of 2048 bytes block
Offset Description 0000 00 50 40 40 00 00 00 00 50h = 80 may be the size of each tile (collision data ranges from -40 to +39). 40 40 may be the size of map (64x64 cells), same value for all maps 0008 byte Unknown. 0009 byte Ceiling texture index 1. Each tile in the dungeon contains a 2-bit index to select one ceiling texture here (or 0 for no texture at all). 000A byte Ceiling texture index 2 000B byte Ceiling texture index 3 000C dword Number of entries in Structure1A 0010 dword Offset of Structure1A 00000038h 0014 dword Offset of Structure1B. Structure 1B is always 8000h bytes. 0018 dword Offset of Structure1C (= Offset of Structure1B + 8000h) 001C dword Offset of Structure1G May be 00000000h in which case there is no Structure1G 0020 dword 00000000h 0024 dword Offset of Structure1D 0028 dword 00000000h 002C dword 00000000h 0030 dword Offset of Structure1E 0034 dword Offset of Structure1F 0038 Structure1A Models 24 bytes entries. The number of entries is specified in the Structure1 header 0000 byte ? 00h, 01h or 02h (in LEV1.DGN, only model #34 has 01h here, and it is the talking head apparition at dungeon entrance) 0001 byte Index of 3D model in Structure3. 0002 byte Model rotation along Z-axis (value range 0 to 255). Add 64 to rotate 90°. 00: None 40: 1/4 turn 80: 1/2 turn C0: 3/4 turn 0003 byte 00h or 80h 0004 byte 00h or FFh 0005 byte 00h, 01h, FEh, FFh 0006 byte 00h, 40h, 60h, 80, A0h, C0h 0007 byte Always 00h 0008 byte Always 00h 0009 byte Always 00h, 01h, 02h, 03h 000A byte 00h, 08h, 28h, 80h, 90h, 98h, C0h, E0h 000B byte Always 00h 000C byte 00h or FFh 000D byte 00h, 01h, 02h, FEh, FFh 000E byte 00h, 20h, 40h, 60h, 80, A0h, C0h 000F byte Always 00h 0010 dword Always FFFFFFFFh 0014 dword Always 00000000h xxxx Structure1B Grid Size is always 8000h = 32768 bytes This represents the level map as a grid of 64x64 cells with 8 bytes per cell. Note: The current version of the script decodes this data as an image to visualize the data. Resize the produced images from 512x64 pixels to 64x64 pixels with any image editor. The result for LEV1.DGN clearly looks like the map of the hall of champions (remember there are 2 hidden areas that do not appear on the automap). word: Bits15-14: Floor texture trigonometric rotation (00: No rotation, 01: 90°, 10: 180°, 11: 270°) Bit13: Flip floor texture Y Bit12: Flip floor texture X If bit4 = 1, then Bits3-0 = 0001 Bits11-7: 5 bits value = Index of floor texture in Structure2. The specified floor texture is always drawn, even if there is a 3D model on the tile. A fully transparent texture is used when the floor should not be visible. Bit6: Always 0 Bit5-4: Tile slope. This applies to both the floor and ceiling textures which are always parallel and separated by a fixed height 00: Tile is flat, height in Byte3. 01: Tile is flat (Value never used) 10: Tile is a slope on X axis, source height is height of tile at X+1 destination height in Byte3. Only set on 2 tiles for stairs to level 2 on LEV1.DGN 11: Tile is a slope on Y axis, source height is height of tile at Y+1, destination height in Byte3. Only set for 3 tiles for small stairs between rooms on LEV1.DGN Bit3: Always 0 in LEV0, 1 & 2. Set to 1 on some tiles in LEV3 (Room where floor height changes in game when 9 buttons are pressed, and a few other tiles) and other levels. Bit2-1: Ceiling texture: 00: no texture for ceiling 01, 10, 11: index of the byte containing the ceiling texture index in the dungeon header. Texture is drawn with X and Y coordinates swapped. Bit0: 0: There is no door on this tile 1: There is at least one door on this tile. (1 or more entries in Structure1E refer to this tile) Byte2: ?? Value 00: Regular Value 01: Floor and ceiling textures not shown, ignores 3D model reference as index in Structure1A Value 02: Floor and ceiling textures not shown, ignores 3D model reference as index in Structure1A Value 03: Floor and ceiling textures not shown, ignores 3D model reference as index in Structure1A Value 08: Regular Value 0B: Floor and ceiling textures not shown, ignores 3D model reference as index in Structure1A Value 10: Regular Value 18: Regular Value 20: Regular Value 28: Regular Value 30: Regular Value 38: Regular Value 40: Regular Value 48: Regular Byte3: Floor height. Signed byte. Height: 10h = 32768 units. 32768/65536 = 0.5 1 signed unit here = 2048 units in 3D coordinates = 1/32 = 0,03125 Byte4: Bit7-6: 00: Field XXY is not used 01: Field XXY contains a reference to another tile where a 3D model is present and overflows on this tile 10: ? Field XXY contains the index in Structure1A of a 3D model present on the tile 11: ? Field XXY contains the index in Structure1A of a 3D model present on the tile Bit 5: ?? Bit 4: 0: 3D model is visible by default 1: 3D model is invisible by default (set only for Grey Lord in LEV1.DGN) Bits3-0: Only values 0, 1, 2, 3 1: Only used on level 9, 10, 11 and 14 2: Only used for 79 tiles on level 15 3: floor texture is an animated texture. Only used for 41 tiles on level 8 using animation #0. Bytes5-6-7: XX YY ZZ. Two 12 bit values XXY: 3D model on tile If Bit7-6 of Byte4 = 00 then XXY = 000h (unused) If Bit7-6 of Byte4 = 01 then XXY = Index in Structure1B of a tile where a 3D model (y * 64 + x) overflows on this tile If Bit7 of Byte4 = 1 then XXY = Index in Structure1A of a 3D model present on the tile YZZ: Tile collision 000: You may move freely on the tile ('Corridor') n: Ordinal of Tile collision descriptor entry in Structure1C which specifies margins, how much and where you can enter the tile FFF: You cannot enter the tile ('Wall') xxxx Structure1C Tile collision descriptors Each tile is considered to contain 80x80 parts. Each collision descriptor defines which parts of the tile may / may not be entered by the player. 0000 byte Number of collision descriptors + 1. For example, 15h = 21 means there are 20 collision descriptors. 0001 00 00 00 0004 Collision descriptors, 4 bytes each. If Byte3=80h then the collision descriptor defines a circle else it defines a rectangle. Each byte is signed and may have values ranging between -40 and +40 (except last byte which can also have special value 80h). Square: Byte0: X1 (offset from center of tile) Byte1: Y1 (offset from center of tile) Byte2: X2 (offset from center of tile) Byte3: Y2 (offset from center of tile) Circle: Byte0: X of center of circle (offset from center of tile) Byte1: Y of center of circle (offset from center of tile) Byte2: Radius Byte3: 80h Example: Hexadecimal byte values: ECh ECh 27h 27h Decimal byte values: -20, -20, 39, 39 The large square represents the tile (80x80). The small square represents the parts that the player may not enter. The remaining areas (the bands on the top and left) represent the parts that the player may enter. +-------------------+ | | | (X1,Y1=-20,-20) | | +--------------- | | | | | + Center | | | | | | | | | | | | | +----+--------------+ <- (X2,Y2 = 39,39) xxxx Structure1D 0000 128 bytes with value 00h xxxx Structure1E Doors 16 bytes entries First byte of last entry is FFh 0000 byte Y Coordinate in 64x64 grid (Y is before X) 0001 byte X Coordinate in 64x64 grid 0002 byte ? Flags? 00h, 01h, 02h, 08h, 09h, 0Ah, 12h, 1Ah Bit 0: Mirror door model (for double doors, one has 0, the other has 1) Bit 1: ? Bit 3: ? Bit 4: ? 0003 byte Bit7: Orientation. 0: x axis, 1: y axis Bits 0-6. Door index. Increasing values starting from 0. 0004 byte Index of 3D model in Structure3. 0005 byte ? Width of door ? Always 28h = 40 for all double doors 50h = 80: vertical doors? (true for LEV1.DGN) 70h = 112: horizontal doors? (none in LEV1.DGN) 0006 byte FFh: door is not part of a double door or door is the second door of a double door Other values: Door is part of a double door and is the first door. The value is the door index of the second door 0007 byte FFh: door is not part of a double door Other value: Door index of first door for double door (on the same tile). For the first door, this the same door index as in byte3. For the second door, this is the door index of the other door. 0008 byte Initial door state: 00h (Closed) or 01h (Open) 0009 byte Always 00h 000A byte Always 00h 000B byte Always 00h 000C byte Always FFh 000D byte Door type. 04h: movable wall 000E byte Always FFh 000F byte Always FFh xxxx Structure1F 0000 word Index of first texture to use for wall sensors (door buttons, wall texts, others?) 0002 word Unknown2. Index of first Structure3 to use for wall sensors/decorations? 0004 word Number of entries in Structure1Fa (Items on floor) 0006 word Number of entries in Structure1Fb (Floor decorations) 0008 word Number of entries in Structure1Fc (Floor sensors) 000A word Number of entries in Structure1Fd (Alcoves) 000C word Number of entries in Structure1Fe (Wall decorations) 000E word Number of entries in Structure1Ff (Wall sensors) 0010 Structure1Fa Items on floor (items in alcoves are listed with Alcoves). 8 bytes per entry These entries define items present in the dungeon. 0000 byte Always 10h 0001 byte X Coordinate in 64x64 grid 0002 byte Y Coordinate in 64x64 grid 0003 byte Location on tile 0: North West 1: North East 2: South East 3: South West 4: Center 0004 byte Item number (see ITEM.IBS for item descriptors) 0005 byte Item attribute1. Set for some magic items. 0006 byte Always 00h 0007 byte Item attribute2. Charges. In LEV1.DGN, Item 42h (Torch) has Byte7=0F (charges) and item 9Eh (Waterskin) has Byte7 = 03 (full). Example: Structure1Fa of LEV1.DGN - Hall of champions 10 20 10 04 8E 00 00 00 Apple 10 1E 0D 04 90 00 00 00 Bread 10 23 0C 03 42 00 00 0F Torch 10 1F 0B 02 9E 00 00 03 Waterskin 10 23 0D 03 8F 00 00 00 Corn 10 22 0F 04 90 00 00 00 Bread 10 22 11 04 91 00 00 00 Cheese 10 24 11 04 8E 00 00 00 Apple | | | | | | | | | | | | | | | +-- Item attribute2. Charges. | | | | | | +----- Always 00h | | | | | +-------- Item attribute1. Set for some magic items. | | | | +----------- Item number (see ITEM.IBS) | | | +-------------- Location on tile (0=North West, 1=North East, 2=South East, 3=South West, 4=Center) | | +----------------- Y Coordinate in 64x64 grid | +-------------------- X Coordinate in 64x64 grid +----------------------- Always 10h xxxx Structure1Fb Floor decorations. 12 bytes per entry These entries define 3D objects to add in the dungeon. 0000 byte Always 11h 0001 byte X Coordinate in 64x64 grid 0002 byte Y Coordinate in 64x64 grid 0003 byte X position from center of cell (signed byte, values seen ranging from -30 to +30) 0004 byte Y position from center of cell (signed byte, values seen ranging from -30 to +30) 0005 byte Index of 3D model in Structure3. 0006 byte Rotation along Z-axis (value range 0 to 255). Add 64 to rotate 90°. 0007 byte Floor decoration type. 03h: model. 82h: texture (only used for two candlesticks on dining table on level 8). 0008 byte Texture width 0009 byte Texture height 000A byte ? 000B byte ? In LEV1.DGN, coordinates point to all champion mirrors + 8 columns in corners of the first two rooms at entrance. For the champions, this is the "ice" in front of their portraits. xxxx Structure1Fc Floor sensors. 16 bytes per entry 0000 byte Always 12h 0001 byte X Coordinate in 64x64 grid 0002 byte Y Coordinate in 64x64 grid 0003 byte Always 00h 0004 byte Always 00h 0005 byte Index of 3D model in Structure3 for 'disabled' state or FFh if no model. (27h used for pressure plate in LEV1) 0006 byte Index of 3D model in Structure3 for 'enabled' state or FFh if no model. (28h used for pressure plate in LEV1) 0007 byte ? 0008 byte Always 00h 0009 byte ? 000A byte Width of active area on tile (0..80) 000B byte Height of active area on tile (0..80) 000C byte Unknown. Sensor type ? Sensor effect ? 000D byte Destination X coordinate in 64x64 grid 000E byte Destination Y coordinate in 64x64 grid 000F byte Unknown. Destination orientation? In LEV1.DGN, 4 floor sensors: - Start animation of character face at level entrance. Uses texture #0 (texture is transparent but visible if modified). - Start music ?. Uses texture #0 - Pressure plate on floor to open door to exit. Uses texture #0, visible under the pressure plate - Stairs down to level 2. Uses texture #0 xxxx Structure1Fd Alcoves. 12 bytes per entry 0000 byte Always 20h 0001 byte Face number in model where item (if present) is drawn 0002 word Index of StructureA associated with alcove 0004 byte Rotation on Y axis (seems ignored as items are always drawn facing the player) 0005 byte Horizontal position on face. 00: decoration is on the leftmost side of the face FF: item is at the rightmost side of the face 0006 byte Vertical position on face. 00: decoration is at the topmost side of the face FF: item is at the very bottom of the face 0007 byte Index of item in alcove (FF means alcove is empty). Example: in level 2, scroll #CF in alcove near entrance, guarded by mummy 0008 0009 000A 000B byte Always 00 LEV01.DGN: Only 1 entry (Vi altar near level exit) xxxx Structure1Fe Wall decorations. 12 bytes per entry 0000 byte Always 21h 0001 byte Face number in model where decoration is attached 0002 word Index of Structure1A associated with wall decoration 0004 byte Rotation on Y axis 0005 byte Horizontal position on face. 00: decoration is on the leftmost side of the face FF: decoration is at the rightmost side of the face 0006 byte Vertical position on face. 00: decoration is at the topmost side of the face FF: decoration is at the very bottom of the face 0007 byte Aspect. Depending on the decoration type, this may be a model index (in Structure3) or a texture delta index. In LEV1.DGN this is used only with models for 40 projectors and 1 stairs handrail. 0008 byte Decoration type 0009 byte Texture width 000A byte Texture height 000B byte Always 00 xxxx Structure1Ff Wall sensors. 16 bytes per entry 0000 byte Always 22h 0001 byte Face number in model where sensor is attached 0002 word Index of Structure1A associated with wall sensor 0004 Rotation on Y axis 0005 Horizontal position on face. 00: decoration is on the leftmost side of the face FF: decoration is at the rightmost side of the face 0006 Vertical position on face. 00: decoration is at the topmost side of the face FF: decoration is at the very bottom of the face 0007 Aspect when sensor is disabled. Depending on the sensor type, this may be a model index (in Structure3) or a texture delta index (must be added to Structure1F header value 'Index of first texture to use for wall sensors' to get the actual texture index) In LEV1.DGN, Byte7 contains Structure3 entry indices for Champion portraits (2C to 3F) (entries 14 to 33) Byte7=FF : Wall text. Text index is encoded in Byte13 (encoding unknown) Byte13=01h => String #3 in RLOWFIX.BIN TEXT5 Byte13=22h => String #84 in RLOWFIX.BIN TEXT5 Byte13=23h => String #83 in RLOWFIX.BIN TEXT5 Byte13=24h => String #82 in RLOWFIX.BIN TEXT5 0008 Aspect when sensor is enabled. Depending on the sensor type, this may be a model index or a texture delta index. 0009 Sensor type 10, 13: Door button Byte7/8: Delta index of texture for disabled/enabled sensor. FF means no texture 60, 63 (Champions and other): Byte7/8: Index of Model for disabled/enabled sensor. FF means no model 8B: Wall inscription Byte7 = FF. Byte8: Delta index of texture for wall inscription 000A Texture width 000B Texture height 000C Unknown. Probably an item number to trigger the sensor (for example: specifies item indices of keys for locks) 000D Unknown 000E Values 00h ,80h ,81h, 82h 000F Always 00h 0000 word xxxx Structure1G: Animated textures Note: some DGN files do not have any data in this section. In that case, the offset of Structure1G is set to 0 in the Structure1 header. Structure1G has the same format as the last part of ITEM.IBS. This is animation data declaring sequences of textures. LEV01.DGN There is only one animation declared which is used for the flame behind the face of the character talking at the entrance of the dungeon and also behind champion portraits. Texture indices start at 14Ch = 332 (There are 332 images in ITEM.IBS). For example 156h = 342 corresponds to texture #10 (the 11th texture in the DGN file). LEV01.DGN There are animations for water fountains (textures 26 & 27, and 28 & 29), teleporters (23 to 25), others... LEV15.DGN 00 09 Number of animated textures (including last entry starting with FFh). 9 entries of 8 bytes each. 00 4C Offset of animation data = Number of animated textures * 8 + 4 (this header) = 76 First part - Animated texture descriptors, 8 bytes each byte0: Animated texture ID byte1: ? Always 00. word1: ? Always 00 01. word2: Index of first image in animation sequence (also found in second part as first word of each entry data) Image indices start at 0x14C = 332, right after all images found in ITEM.IBS (contains images #0 to #331) word3: index of first dword of the record in the second part 00 00 00 01 01 56 00 00 01 00 00 01 01 53 00 04 02 00 00 01 01 58 00 08 08 00 00 01 01 5B 00 0C 09 00 00 01 01 5D 00 10 0A 00 00 01 01 62 00 14 0B 00 00 01 01 65 00 19 0C 00 00 01 01 66 00 1E FF 00 00 00 00 00 00 00 Second part - Animation data: one list of 4 bytes entries for each animated texture. Ends with a FF FF xx xx Each entry consists of two words: Instruction / parameters Instruction may be: Image index. Parameters define duration + flags ? FF FE. Goto another animation step. Parameter is a signed integer pointing to the next step to run FF FF. Mark end of animation sequence. Parameters are ignored? 01 56 80 06 01 57 80 06 FF FE FF FE Goto -2 = go back to beginning of animation sequence FF FF 00 00 01 53 80 04 01 58 80 04 FF FE FF FE FF FF 00 00 01 58 80 04 01 53 80 04 FF FE FF FE FF FF 00 00 01 5B C0 06 01 5C C0 06 FF FE FF FE FF FF 40 00 01 5D 80 06 01 5E 80 06 FF FE FF FE FF FF 00 00 01 62 C0 08 01 61 C0 08 01 60 C0 08 FF FE FF FD FF FF 40 00 01 65 C0 08 01 64 C0 08 01 63 C0 08 FF FE FF FD Goto -3 = go back to beginning of animation sequence FF FF 40 00 01 66 C0 06 01 67 C0 06 01 68 C0 06 FF FE FF FD FF FF 40 00
Structure2 contains a list of texture descriptors. 20 bytes per texture descriptor. These descriptors use the same format as the ones used in ITEM.IBS to declare item on floor images.
The last descriptor in the list starts with FFFFh and does not declare a texture itself.
After the texture descriptors is raw data containing color palettes and images. The offsets of each palette and image are defined in the descriptors. These offsets are relative to the start of Structure2.
A texture descriptor has the following format:
Offset Description 0000 word Image ID 0002 word Encoding. 0008h: 4 bits per pixel. 0028h: 2 bytes per pixel (1BBBBBGG GGGRRRRR). Color is encoded like in a color palette entry. The last entry (Image ID = FFFFh) contain unknown 'random' values. 0004 word Palette ID. The meaning of this value depends on the value of the last dword in the texture descriptor which is the Palette offset: If Palette offset <> 0, associates this ID with the palette at speficied offset If Palette offset = 0, refers to a previously associated Palette ID 0006 word Image width 0008 word Image height 000A word Unknown. 000C dword Image offset 0010 dword Palette offset
In the raw data following the descriptors, color palettes have 16 colors (32 bytes per palette).
Images are stored in 4 bits per pixel. The first pixel is stored in the 4 most significant bits. Pixels are stored from left to right and then top to bottom.
Each model is a 3D object that can be placed in the dungeon.
Offset Description 0000 dword Number of entries 0004 Offsets (based on offset of Structure3). One offset (a dword) for each entry xxxx Entry data one after the other
Format of a Structure3 entry:
Each entry has a header of 40 bytes following by three structures
Offset Description 0000 dword Unknown. Flags ? Often 00000100h 0004 word Number of 12 bytes entries in Structure3a 0006 word Number of 12 bytes entries in Structure3b & Structure3c 0008 dword offset of structure 3a based on offset of Structure3 000C dword Always 0 0010 dword offset of structure 3b based on offset of Structure3 0014 dword offset of structure 3c based on offset of Structure3 0018 dword Often 0 but not always 001C dword Always 0 0020 dword Always 0 0024 dword Always 0 xxxx Structure3a Vertices. 12 bytes per vertex. A vertex: 0000 dword X coordinate (signed int32, must be divided by 65536) 0004 dword Y coordinate (signed int32, must be divided by 65536) 0008 dword Z coordinate (signed int32, must be divided by 65536) xxxx Structure3b Faces. 12 bytes per face. A face: 0000 word Index of 1st Vertex (in associated Structure3a) 0002 word Index of 2nd Vertex 0004 word Index of 3rd Vertex 0006 word Index of 4th Vertex (If 3rd=4th face is a Triangle, otherwise face is a Quad) 0008 byte Flags bit7: Always set to 0. Game may fail to load if set (tested with one-off colors) bit6: 0: Fill face with one-off color. 1: Fill face with texture (normal or animated) bit5: Unknown bit4: Unknown bit3-1: Always set to 0. bit0: Draw texture with 'Mesh' transparency: 0: MeshOff. 1: MeshOn (grid of alternating pixels, 1 transparent, one opaque) LEV1.DGN: Used only on model 34 (face of talking man), 41 (ice 1), 42 (ice 2) 0009 byte Flags bit7: Unknown bit6: Texture color 0 tranparency: 0: Transparent. 1: Opaque bit5: if one-off color: Light level 0: Dark. 1:Light bit4: if one-off color: face not rendered if set to 1 bit3: Unknown bit2-0: Always set to 0. 000A word (=Byte10-11) Face fill Byte10-11: Face fill: Texture index, Animated texture ID or Single Color 00xx: xx=Texture index Byte8-9 = 4088h 40C8h 40E8h 5088h 50C8h 50E8h 51C8h 6088h 60C8h 60E8h 6188h 61C8h 08xx: xx=Animated texture ID (values do not start at 0) Byte8-9 = 40B8h ??? Only animated flame behind champion portaits (ID is first byte of entry in Structure1G) 40F8h 41F8h 50F8h 51F8h 60B8h 60F8h 61B8h 61F8h 8xxx: One-off color Byte8-9 = 00E8h 8000: 0, 0, 0 Black 01E8h 8C22: 2, 1, 3 2000h ??? Only used with texture 0! A108: 8, 8, 8 Dark Grey 20E8h FFFF: 31, 31, 31 White 21E8h 8821: 2, 1, 1 |||| Bits used Values found |||+-- Bit 3 0 8 ||+--- Bit 0, 1, 2, 3 0 8 B C E F |+---- Bit 0 0 1 +----- Bit 0, 1, 2 0 2 4 5 6 (1BBBBBGG GGGRRRRR). Color is encoded like in a color palette entry. xxxx Structure3c Normals. 12 bytes per face 0000 dword X coordinate (signed int32, must be divided by 65536) 0004 dword Y coordinate (signed int32, must be divided by 65536) 0008 dword Z coordinate (signed int32, must be divided by 65536) One entry per face. the length of the normal vector is always 1: Sqrt(X² + Y² + Z²) = 1 Structure3 in LEV01.DGN: #00 Brick wall (both sides) + ceiling #01 Incomplete white model (not textured) #02 Brick archway + ceiling #03 Four alcoves for champion portraits #04 Dark wall (1 side only) + ceiling #05 Dark inside corner + ceiling #06 Dark pillar + ceiling #07 Dungeon wall + ceiling very Dark #08 Dungeon wall + ceiling Dark #09 Entrance room #10 Incomplete green model (not textured) #11 Inside Brick corner + ceiling #12 Outside Brick corner #13 Outside Brick corner + ceiling #14 Walls + cailing + archway brick #15 Single archway brick #16 Dungeon wall + ceiling, Side 1 only, brick #17 Ceiling (circle) #18 Ceiling #19 Large stairs (end of level) #20 Small walls around a door #21 Simple Wall #22 Two opposite walls #23 Simple Wall with border #24 Simple Wall 2 Side 1 #25 Simple Wall 2 Side 2 #26 Small stairs between rooms #27 Large Walls around a door #28 Ice in front of champion + Wall + Ceiling #29 Double dark archway #30 Two opposite alcoves for champion portraits #31 Vi altar #32 Dungeon wall + ceiling, Side 1 only, blue #33 Dungeon wall + ceiling, Side 2 only, blue #34 Head at dungeon entrance + animated flame #35 Dungeon Entrance door Left #36 Stairs handrail #37 Projector (on the walls on each side of each champion) #38 Wooden Door with window #39 Pressure plate (not pressed) #40 Pressure plate (pressed) #41 Ice in front of champion portraits 1 #42 Ice in front of champion portraits 2 #43 Wooden door without window #44 Champion portrait + animated flame. Texture 67h #45 Champion portrait + animated flame. Texture 4Ch #46 Champion portrait + animated flame. Texture 68h #47 Champion portrait + animated flame. Texture 69h #48 Champion portrait + animated flame. Texture 6Ah #49 Champion portrait + animated flame. Texture 6Bh #50 Champion portrait + animated flame. Texture 6Ch #51 Champion portrait + animated flame. Texture 6Dh (24,20)?. Champion Texture is flipped horizontally #52 Champion portrait + animated flame. Texture 6Eh #53 Champion portrait + animated flame. Texture 6Fh #54 Champion portrait + animated flame. Texture 70h (26,19). Champion Texture is flipped horizontally #55 Champion portrait + animated flame. Texture 71h #56 Champion portrait + animated flame. Texture 72h (26,23) #57 Champion portrait + animated flame. Texture 73h (28,21). Champion Texture is flipped horizontally #58 Champion portrait + animated flame. Texture 74h #59 Champion portrait + animated flame. Texture 75h #60 Champion portrait + animated flame. Texture 76h #61 Champion portrait + animated flame. Texture 77h #62 Champion portrait + animated flame. Texture 78h #63 Champion portrait + animated flame. Texture 79h On tile (x,y)=(32,32) #64 Column in first two rooms of the level