Browse Community

Dungeon Master Nexus DGN files

Overview

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:

  • Header (always 1 block)
  • Padding with 00h bytes until next 2048 boundary
  • Structure1
  • Padding with 00h bytes until next 2048 boundary
  • Structure2
  • Padding with 00h bytes until next 2048 boundary
  • Structure3
  • Padding with 00h bytes until next 2048 boundary

Format

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

Structure1: Map

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: Textures

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.

Structure3: Models

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