MAZExxxx.DAT files contain the information for each map, where xxxx is the map ID in decimal. It does not contain the specific graphic information. A seperate *.TIL file must be loaded for the minimap, as well as seperate *.WAL and *.SRF files for the 3D window. If the mapID is greater than 99, the first x becomes a literal X. ie, MAZEX123.DAT is the file for map ID 123.
Note that "outdoor" vs "indoor" is somewhat of a misnomer. It should really be "overworld" vs "innerworld": innerworld consists of towns, towers, caves, etc... while the overworld consists of the vast outside area, including the sky road on the Darkside of Xeen.
Usage[]
A map is composed of 16x16 tiles. Each tile in the map is comprised of four 4 bit nibbles. The (0, 0) coordinate is in the lower left, which differs from most systems which have (0, 0) in the upper left. In order to draw the map correctly, it must be flipped vertically.
Wall Data[]
The first 512 bytes of the file form a 16x16x4 array of nibbles. Each tile is therefore comprised of a single uint16. This tile represents the physical map data.
Outdoor[]
The low nibble of the low byte is the base surface, denoted as iBase, comprised of the ground surfaces such as water, grass, paths, etc. It can be found as {iBase = map[y*32+x]&0x0F;}. It is a reference into a table of OUTDOOR.TIL for 2D map drawing and SRF files for 3D map drawing as follows:
- 0 = no surface drawn, the default ground sprite shows through
- 1 = DIRT.SRF
- 2 = GRASS.SRF
- 3 = SNOW.SRF
- 4 = SWAMP.SRF
- 5 = LAVA.SRF
- 6 = DESERT.SRF
- 7 = ROAD.SRF
- 8 = WATER.SRF
- 9 = TFLR.SRF
- 10 = SKY.SRF
- 11 = CROAD.SRF
- 12 = SEWER.SRF
- 13 = CLOUD.SRF
- 14 = SCORTCH.SRF (TODO: my notes say "SCORTCH" but should it be "SCORCH"? did I misspell it in my notes or is the file itself actually misspelled? A: It is actually misspelled, "SCORCH.SRF" hashes to 0x526A, which is not in the CC table of contents, but the hash of "SCORTCH.SRF", 0x2ACD, is.)
- 15 = SPACE.SRF
The high nibble of the low byte is the middle layer, denoted as iMiddle, comprised of wall layers such as mountains, trees, and wall. It can be found as {iMiddle = (map[y*32+x]>>4)&0x0F;}
The low nibble of the high byte is the top layer, denoted as iTop, comprised of objects, such as towers, towns, and tents. It can be found as {iTop = (map[y*32+x]>>8)&0x0F;} This does not draw them in the 3D view, this is strictly for the 2D map. A corresponding entry in the MOB file must be made for the 3D view. This can allow you to place things on the 2D map that can't be seen in the 3D view (or perhaps were present but was removed), or vice versa, having something appear in the 3D view that doesn't appear on the 2D map.
The high nibble of the high byte is the overlay layer, denoted as iOverlay. It currently serves an unknown purpose. It can be found as {iOverlay = (map[y*32+x]>>12)&0x0F;}
Indoor[]
Each nibble (4 bits) of the cell data represents a wall, facing towards the centre of the cell, starting with north at the lowest nibble and working clockwise. It does not automatically imply an outward facing wall. For example, if all four walls for a given tile are populated, then the player standing in that tile will be surrounded by walls, but if the player were to be one tile north of that tile and turn around, the "north" wall would appear to have disappeared, unless the tile to the north had a corresponding "south" wall placed. Usually you will want to place corresponding walls in both tiles, but it is not necessary and can give a sort of "illusion" or "trap" wall effect, depending on the direction the player is walking.
The actual values of the wall are references into the FWL and SWL sprite files for 3D rendering, and the respective TIL as noted in the Environment_Set. (TODO: My note says something about this not being a direct mapping. What the heck was I talking about? Probably something like a wall value of 0 means no wall, 1 means regular wall, 2 means torch frames, 3 means door, etc... or something to do with the WallTypes value)
Mapping---
Wall Value (0-15) |
Value inside combined FWL1/2 0-7 = tileset1.FWL 8+ = tileset2.FWL |
---|---|
1 | 9 |
2 | 17 |
3 | 11 |
4 | 8 |
5 | 0 |
6 | 15 |
7 | 16 (unless tileset CAVE is being used .. then 15 again) |
8 | 0 |
9 | 10 |
10 | 14 |
11 | 6 |
12 | 1 |
13 | 8 |
14 | 12 |
15 | 13 |
Note that while the outdoor map has an explicit "object" layer for displaying things on the 2D map, no such layer exists for indoor: objects are placed exclusively from the MOB file.
Cell Flags[]
This is a 16x16 array, each byte corresponding to the equivalent map tile. It is a bit array representing certain "features" depending if you are on an indoor or outdoor map.
Outdoor[]
- 0x80 = Grate (used only as a reference, there is a "grate" object)
- 0x40 = Water (requires swimming or walk on water, cannot rest on this tile)
- 0x20 = Drain (used only as a reference, there is a "drain" object)
- 0x10 = Event auto executes (used for signs, benches, etc...)
- 0x08 = Object exists (used only as a reference)
The lowest 3 bits (0x04, 0x02, 0x01) indicate if there are monsters present in the left, centre, and right positions of that tile. It's not clear what, if anything, this is used for since it stores the monsters MOB file anyway.
Indoor[]
Similar to outdoor:
- 0x80 = ??
- 0x40 = Water (requires swimming or walk on water, cannot rest on this tile)
- 0x20 = unknown (TODO: not aware of any indoor map that has this set. If you find one, please post it to the talk page for investigation)
- 0x10 = Event auto executes (used for signs, benches, etc...)
- 0x08 = Inside (if set, then the player is "inside" and there is a ceiling to be drawn from the sky sprite. If not set, then the player is "outside" and the regular SKY.SKY sprite is drawn)
The lowest 3 bits are actually a numbered value (found as cell&0x0F) that references the ground of the tile, drawn from the corresponding SRF file exactly the same as above in the outdoor maps wall data. If the water flag (0x40) is set, then this surface value is ignored and set to 8, always using WATER.SRF.
ToDo: It seems if ground tile position 4 resolves to 0 it will draw water regardless of flag. There are no sleep or walk restrictions unless the water flag is set. No other positions seem to have this functionality.
2D Outdoor Map Drawing[]
Each tile is 4 layered 10x8 pixel frame sprite. Each layer is drawn on top of the last, taking advantage of transparency. The frames are all used from the same file. If the map is an outdoor map (mazeFlags2 & 0x8000 == TRUE) then the default file to load is OUTDOOR.TIL.
To draw the first two layers, you must use indirect lookup. The bottom layer is frame number at surfaceTypes[iBase] and consists of such tiles as water, dirt, road, and lava. The second layer is frame number at wallTyps[iMiddle]+16 and consists of such tiles as trees and mountains. The third and forth layer are mapped directly to the tile file as frame number iTop+32 and iOverlay+48 respectively.
Pseudocode for displaying the map[]
for (y = 0; y < 16; y++) { for (x = 0; x < 16; x++) { iBase = (map[y*16 + x] & 0x0F); iMiddle = (map[y*16 + x]>>4 & 0x0F); iTop = (map[y*16 + x]>>8 & 0x0F); iOverlay = (map[y*16 + x]>>12 & 0x0F); tileset.drawSprite(surfaceTypes[iBase], x*10, 128-(y*8)); tileset.drawSprite(wallTypes[iMiddle]+16, x*10, 128-(y*8)); tileset.drawSprite(iTop+32, x*10, 128-(y*8)); tileset.drawSprite(iOverlay+48, x*10, 128-(y*8)); } }
Note that the y position is 128-(y*8). This is to account for the fact that the origin (0,0) of the map is in the lower left, whereas most systems have the origin at the upper left. Without this simple subtraction, the map would appear upside down.
3D Window Drawing[]
Outdoors[]
The outdoor display works by populating a list of "DrawStruct" structures, and then draws that list.
The following list is updated with the expected sprite/frame values and then rendered to the screen.
NOTE: X and Y are offset by 8 to account for drawing inside the "window" which has an 8 pixel border. Developers intending to change this behaviour should account for this offset.
Outdoor DrawStruct list[]
Default Sprite | Frame | X | Y | Scale | Flags | Description |
---|---|---|---|---|---|---|
0x0000 | 0 | 8 | 8 | 0 | 0x0000 | Top half of sky |
0x0000 | 1 | 8 | 25 | 0 | 0x0000 | Bottom half of sky |
0x0000 | 0 | 8 | 67 | 0 | 0x0000 | Ground |
0x0000 | 0 | 8 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 3 left |
0x0000 | 0 | 38 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 2 left |
0x0000 | 0 | 84 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 1 left |
0x0000 | 0 | 134 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 3 right |
0x0000 | 0 | 117 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 2 right |
0x0000 | 0 | 117 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 1 right |
0x0000 | 0 | 103 | 67 | 0 | 0x0000 | Surface tile directly 4 steps forward |
0x0000 | 0 | 8 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 3 left |
0x0000 | 0 | 8 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 2 left |
0x0000 | 0 | 30 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 1 left |
0x0000 | 0 | 181 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 3 right |
0x0000 | 0 | 154 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 2 right |
0x0000 | 0 | 129 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 1 right |
0x0000 | 0 | 87 | 73 | 0 | 0x0000 | Surface tile directly 3 steps forward |
0x0000 | 0 | 8 | 81 | 0 | 0x0000 | Surface tile 2 steps forward, 2 left |
0x0000 | 0 | 8 | 81 | 0 | 0x0000 | Surface tile 2 steps forward, 1 left |
0x0000 | 0 | 202 | 81 | 0 | 0x0000 | Surface tile 2 steps forward, 2 right |
0x0000 | 0 | 145 | 81 | 0 | 0x0000 | Surface tile 2 steps forward, 1 right |
0x0000 | 0 | 63 | 81 | 0 | 0x0000 | Surface tile directly 2 steps forward |
0x0000 | 0 | 8 | 93 | 0 | 0x0000 | Surface tile 1 step forward, 1 left |
0x0000 | 0 | 169 | 93 | 0 | 0x0000 | Surface tile 1 step forward, 1 right |
0x0000 | 0 | 31 | 93 | 0 | 0x0000 | Surface tile directly 1 step forward |
0x0000 | 0 | 8 | 109 | 0 | 0x0000 | Surface tile directly 1 step left |
0x0000 | 0 | 201 | 109 | 0 | 0x0000 | Surface tile directly 1 step right |
0x0000 | 0 | 8 | 109 | 0 | 0x0000 | Surface tile player is currently on |
0x0000 | 1 | -64 | 61 | 14 | 0x2000 | Wall tile 4 steps forward, 4 steps left |
0x0000 | 1 | -40 | 61 | 14 | 0x0000 | Wall tile 4 steps forward, 3 steps left |
0x0000 | 1 | -16 | 61 | 14 | 0x0000 | Wall tile 4 steps forward, 2 steps left |
0x0000 | 1 | 8 | 61 | 14 | 0x0000 | Wall tile 4 steps forward 1 step left |
0x0000 | 1 | 128 | 61 | 14 | 0xA000 | Wall tile 4 steps forward, 4 steps right |
0x0000 | 1 | 104 | 61 | 14 | 0x8000 | Wall tile 4 steps forward, 3 steps right |
0x0000 | 1 | 80 | 61 | 14 | 0x8000 | Wall tile 4 steps forward, 2 steps right |
0x0000 | 1 | 56 | 61 | 14 | 0x8000 | Wall tile 4 steps forward, 1 step right |
0x0000 | 1 | 32 | 61 | 14 | 0x0000 | Wall tile directly 4 steps forward |
0xFFFF | 0 | -9 | 61 | 14 | 0x0000 | Outdoor object directly 4 steps forward |
0xFFFF | 0 | -58 | 61 | 14 | 0x0000 | Outdoor object 4 steps forward, 1 step left |
0xFFFF | 0 | 40 | 61 | 14 | 0x0000 | Outdoor object 4 steps forward, 1 step right |
0xFFFF | 0 | -82 | 61 | 14 | 0x0000 | Outdoor object 4 steps forward, 2 steps left |
0xFFFF | 0 | 64 | 61 | 14 | 0x0000 | Outdoor object 4 steps forward, 2 steps right |
0xFFFF | 0 | -41 | 61 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | -26 | 61 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | -34 | 61 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | -16 | 61 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | 23 | 61 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | 16 | 61 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | -58 | 61 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | 40 | 61 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | -17 | 61 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | -1 | 58 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | -9 | 58 | 14 | 0x0000 | Monsters 4 steps forward ??? |
0xFFFF | 0 | 72 | 58 | 12 | 0x0000 | Projectile Weapon sprite 4 steps forward |
0xFFFF | 0 | 72 | 58 | 12 | 0x8000 | Projectile Weapon sprite 4 steps forward |
0xFFFF | 0 | 69 | 63 | 12 | 0x0000 | Projectile Weapon sprite 4 steps forward |
0xFFFF | 0 | 75 | 63 | 12 | 0x8000 | Projectile Weapon sprite 4 steps forward |
0xFFFF | 0 | 73 | 53 | 12 | 0x0000 | Projectile Weapon sprite 4 steps forward |
0xFFFF | 0 | 71 | 53 | 12 | 0x8000 | Projectile Weapon sprite 4 steps forward |
0xFFFF | 0 | 80 | 57 | 12 | 0x0000 | Projectile Weapon sprite 4 steps forward |
0xFFFF | 0 | 64 | 57 | 12 | 0x8000 | Projectile Weapon sprite 4 steps forward |
0x0000 | 2 | -11 | 54 | 8 | 0x0000 | Wall tile 3 steps forward, 2 steps left |
0x0000 | 1 | -21 | 54 | 11 | 0x0000 | Wall tile 3 steps forward, 1 step left |
0x0000 | 2 | 165 | 54 | 8 | 0x8000 | Wall tile 3 steps forward, 2 steps right |
0x0000 | 1 | 86 | 54 | 11 | 0x8000 | Wall tile 3 steps forward, 1 step right |
0x0000 | 1 | 33 | 54 | 11 | 0x0000 | Wall tile directly 3 steps forward |
0xFFFF | 0 | -8 | 54 | 12 | 0x0000 | Outdoor object directly 3 steps forward |
0xFFFF | 0 | -73 | 54 | 12 | 0x0000 | Outdoor object 3 steps forward, 1 step left |
0xFFFF | 0 | 57 | 54 | 12 | 0x0000 | Outdoor object 3 steps forward, 1 step right |
0xFFFF | 0 | -65 | 54 | 12 | 0x0000 | Monsters 3 steps forward ??? |
0xFFFF | 0 | -81 | 54 | 12 | 0x0000 | Monsters 3 steps forward ??? |
0xFFFF | 0 | 49 | 54 | 12 | 0x0000 | Monsters 3 steps forward ??? |
0xFFFF | 0 | 65 | 54 | 12 | 0x0000 | Monsters 3 steps forward ??? |
0xFFFF | 0 | -24 | 54 | 12 | 0x0000 | Monsters 3 steps forward ??? |
0xFFFF | 0 | 9 | 50 | 12 | 0x0000 | Monsters 3 steps forward ??? |
0xFFFF | 0 | -8 | 50 | 12 | 0x0000 | Monsters 3 steps forward ??? |
0xFFFF | 0 | 72 | 53 | 8 | 0x0000 | Projectile Weapon sprite 3 steps forward |
0xFFFF | 0 | 72 | 53 | 8 | 0x8000 | Projectile Weapon sprite 3 steps forward |
0xFFFF | 0 | 77 | 58 | 8 | 0x0000 | Projectile Weapon sprite 3 steps forward |
0xFFFF | 0 | 67 | 58 | 8 | 0x8000 | Projectile Weapon sprite 3 steps forward |
0xFFFF | 0 | 81 | 47 | 8 | 0x0000 | Projectile Weapon sprite 3 steps forward |
0xFFFF | 0 | 63 | 47 | 8 | 0x8000 | Projectile Weapon sprite 3 steps forward |
0xFFFF | 0 | 94 | 52 | 8 | 0x0000 | Projectile Weapon sprite 3 steps forward |
0xFFFF | 0 | 50 | 52 | 8 | 0x8000 | Projectile Weapon sprite 3 steps forward |
0x0000 | 2 | 8 | 40 | 0 | 0x0000 | Wall tile 2 steps forward, 1 step left |
0x0000 | 2 | 146 | 40 | 0 | 0x8000 | Wall tile 2 steps forward, 1 step right |
0x0000 | 1 | 32 | 40 | 6 | 0x0000 | Wall tile directly 2 steps forward |
0xFFFF | 0 | -7 | 30 | 7 | 0x0000 | Outdoor object directly 2 steps forward |
0xFFFF | 0 | -112 | 30 | 7 | 0x2000 | Outdoor object 2 steps forward, 1 step left |
0xFFFF | 0 | 98 | 30 | 7 | 0x2000 | Outdoor object 2 steps forward, 1 step right |
0xFFFF | 0 | -112 | 30 | 8 | 0x2000 | Monsters 2 steps forward ??? |
0xFFFF | 0 | 98 | 30 | 8 | 0x2000 | Monsters 2 steps forward ??? |
0xFFFF | 0 | -38 | 30 | 8 | 0x0000 | Monsters 2 steps forward ??? |
0xFFFF | 0 | 25 | 30 | 8 | 0x0000 | Monsters 2 steps forward ??? |
0xFFFF | 0 | -7 | 30 | 8 | 0x0000 | Monsters 2 steps forward ??? |
0xFFFF | 0 | 72 | 48 | 4 | 0x0000 | Projectile Weapon sprite 2 steps forward |
0xFFFF | 0 | 72 | 48 | 4 | 0x8000 | Projectile Weapon sprite 2 steps forward |
0xFFFF | 0 | 85 | 53 | 4 | 0x0000 | Projectile Weapon sprite 2 steps forward |
0xFFFF | 0 | 59 | 53 | 4 | 0x8000 | Projectile Weapon sprite 2 steps forward |
0xFFFF | 0 | 89 | 41 | 4 | 0x0000 | Projectile Weapon sprite 2 steps forward |
0xFFFF | 0 | 55 | 41 | 4 | 0x8000 | Projectile Weapon sprite 2 steps forward |
0xFFFF | 0 | 106 | 47 | 4 | 0x0000 | Projectile Weapon sprite 2 steps forward |
0xFFFF | 0 | 38 | 47 | 4 | 0x8000 | Projectile Weapon sprite 2 steps forward |
0x0000 | 0 | 8 | 24 | 0 | 0x0000 | Wall tile 1 step forward, 1 step left |
0x0000 | 0 | 169 | 24 | 0 | 0x8000 | Wall tile 1 step forward, 1 step right |
0x0000 | 1 | 32 | 24 | 0 | 0x0000 | Wall tile directly 1 step forward |
0x0000 | 0 | -23 | 40 | 0 | 0x2000 | |
0x0000 | 0 | 200 | 40 | 0 | 0xA000 | |
0x0000 | 0 | 8 | 47 | 0 | 0x0000 | Wall tile directly 1 step left |
0x0000 | 0 | 169 | 47 | 0 | 0x8000 | Wall tile directly 1 step right |
0x0000 | 1 | -56 | -4 | 0x8000 | 0x6000 | Wall tile player is currently on |
0xFFFF | 0 | -5 | 2 | 0 | 0x6000 | |
0xFFFF | 0 | -67 | 2 | 0 | 0x6000 | |
0xFFFF | 0 | 44 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 44 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 58 | 14 | 0 | 0x6000 | |
0xFFFF | 0 | 169 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 169 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | -5 | 14 | 0 | 0x6000 | |
0xFFFF | 0 | 110 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 110 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | -5 | 14 | 0 | 0x6000 | |
0xFFFF | 0 | 110 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 110 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 72 | 43 | 0 | 0x0000 | Projectile Weapon sprite 1 steps forward |
0xFFFF | 0 | 72 | 43 | 0 | 0x8000 | Projectile Weapon sprite 1 steps forward |
0xFFFF | 0 | 93 | 48 | 0 | 0x0000 | Projectile Weapon sprite 1 steps forward |
0xFFFF | 0 | 51 | 48 | 0 | 0x8000 | Projectile Weapon sprite 1 steps forward |
0xFFFF | 0 | 97 | 36 | 0 | 0x0000 | Projectile Weapon sprite 1 steps forward |
0xFFFF | 0 | 47 | 36 | 0 | 0x8000 | Projectile Weapon sprite 1 steps forward |
0xFFFF | 0 | 118 | 42 | 0 | 0x0000 | Projectile Weapon sprite 1 steps forward |
0xFFFF | 0 | 26 | 42 | 0 | 0x8000 | Projectile Weapon sprite 1 steps forward |
TODO: Remainder of descriptions. How sprites/frames are updated. I know this, but am feeling too lazy to finish it now, -- Wizard
Indoors[]
Indoor DrawStruct list[]
Default Sprite | SI | X | Y | Frame | Flags | Description |
---|---|---|---|---|---|---|
0xFFFF | 0 | 8 | 8 | 0 | 0x0000 | Top half of sky |
0xFFFF | 1 | 8 | 25 | 0 | 0x0000 | Bottom half of sky |
0xFFFF | 0 | 8 | 67 | 0 | 0x0000 | Ground |
0xFFFF | 0 | 8 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 3 steps left |
0xFFFF | 0 | 38 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 2 steps left |
0xFFFF | 0 | 84 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 1 steps left |
0xFFFF | 0 | 134 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 3 steps right |
0xFFFF | 0 | 117 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 2 steps right |
0xFFFF | 0 | 117 | 67 | 0 | 0x0000 | Surface tile 4 steps forward, 1 steps right |
0xFFFF | 0 | 103 | 67 | 0 | 0x0000 | Surface tile directly 4 steps forward |
0xFFFF | 0 | 8 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 3 steps left |
0xFFFF | 0 | 8 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 2 steps left |
0xFFFF | 0 | 30 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 1 steps left |
0xFFFF | 0 | 181 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 3 steps right |
0xFFFF | 0 | 154 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 2 steps right |
0xFFFF | 0 | 129 | 73 | 0 | 0x0000 | Surface tile 3 steps forward, 1 steps right |
0xFFFF | 0 | 87 | 73 | 0 | 0x0000 | Surface tile directly 3 steps forward |
0xFFFF | 0 | 8 | 81 | 0 | 0x0000 | Surface tile 2 steps forward, 2 left |
0xFFFF | 0 | 8 | 81 | 0 | 0x0000 | Surface tile 2 steps forward, 1 left |
0xFFFF | 0 | 202 | 81 | 0 | 0x0000 | Surface tile 2 steps forward, 2 right |
0xFFFF | 0 | 145 | 81 | 0 | 0x0000 | Surface tile 2 steps forward, 1 right |
0xFFFF | 0 | 63 | 81 | 0 | 0x0000 | Surface tile directly 2 steps forward |
0xFFFF | 0 | 8 | 93 | 0 | 0x0000 | Surface tile 1 step forward, 1 left |
0xFFFF | 0 | 169 | 93 | 0 | 0x0000 | Surface tile 1 step forward, 1 right |
0xFFFF | 0 | 31 | 93 | 0 | 0x0000 | Surface tile directly 1 step forward |
0xFFFF | 0 | 8 | 109 | 0 | 0x0000 | Surface tile directly 1 step left |
0xFFFF | 0 | 201 | 109 | 0 | 0x0000 | Surface tile directly 1 step right |
0xFFFF | 0 | 8 | 109 | 0 | 0x0000 | Surface tile player is currently on |
0xFFFF | 7 | 8 | 64 | 0 | 0x0000 | Far distant wall |
0xFFFF | 22 | 32 | 60 | 0 | 0x0000 | Side wall for tile 4 steps forward, 4 steps left |
0xFFFF | 20 | 56 | 60 | 0 | 0x0000 | Side wall for tile 4 steps forward, 3 steps left |
0xFFFF | 18 | 80 | 60 | 0 | 0x0000 | Side wall for tile 4 steps forward, 2 steps left |
0xFFFF | 16 | 104 | 60 | 0 | 0x0000 | Side wall for tile 4 steps forward, 1 steps left |
0xFFFF | 23 | 152 | 60 | 0 | 0x8000 | Side wall for tile 4 steps forward, 4 steps right |
0xFFFF | 21 | 144 | 60 | 0 | 0x8000 | Side wall for tile 4 steps forward, 3 steps right |
0xFFFF | 19 | 131 | 60 | 0 | 0x8000 | Side wall for tile 4 steps forward, 2 steps right |
0xFFFF | 17 | 120 | 60 | 0 | 0x8000 | Side wall for tile 4 steps forward, 1 steps right |
0xFFFF | 14 | 8 | 60 | 0 | 0x0000 | Facing wall for tile 4 steps forward, 4 steps left |
0xFFFF | 12 | 32 | 60 | 0 | 0x0000 | Facing wall for tile 4 steps forward, 3 steps left |
0xFFFF | 10 | 56 | 60 | 0 | 0x0000 | Facing wall for tile 4 steps forward, 2 steps left |
0xFFFF | 14 | 80 | 60 | 0 | 0x0000 | Facing wall for tile 4 steps forward, 1 steps left |
0xFFFF | 14 | 104 | 60 | 0 | 0x0000 | Facing wall for tile directly 4 steps forward |
0xFFFF | 14 | 128 | 60 | 0 | 0x0000 | Facing wall for tile 4 steps forward, 1 steps right |
0xFFFF | 14 | 152 | 60 | 0 | 0x0000 | Facing wall for tile 4 steps forward, 2 steps right |
0xFFFF | 8 | 176 | 60 | 0 | 0x0000 | Facing wall for tile 4 steps forward, 3 steps right |
0xFFFF | 8 | 200 | 60 | 0 | 0x0000 | Facing wall for tile 4 steps forward, 4 steps right |
0xFFFF | 0 | -64 | 61 | 14 | 0x0000 | |
0xFFFF | 0 | -40 | 61 | 14 | 0x0000 | |
0xFFFF | 0 | -16 | 61 | 14 | 0x0000 | |
0xFFFF | 0 | 8 | 61 | 14 | 0x0000 | |
0xFFFF | 0 | 32 | 61 | 14 | 0x0000 | |
0xFFFF | 0 | 56 | 61 | 14 | 0x0000 | |
0xFFFF | 0 | 80 | 61 | 14 | 0x0000 | |
0xFFFF | 0 | 104 | 61 | 14 | 0x0000 | |
0xFFFF | 0 | 128 | 61 | 14 | 0x0000 | |
0xFFFF | 0 | -9 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | -34 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | 16 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | -58 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | 40 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | -41 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | -26 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | -34 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | -16 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | 23 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | 16 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | -58 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | 40 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | -17 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | -1 | 58 | 14 | 0x0000 | |
0xFFFF | 0 | -9 | 58 | 14 | 0x0000 | |
0xFFFF | 14 | 8 | 58 | 0 | 0x0000 | Side wall for tile 3 steps forward, 4 steps left |
0xFFFF | 12 | 8 | 55 | 0 | 0x0000 | Side wall for tile 3 steps forward, 3 steps left |
0xFFFF | 10 | 32 | 52 | 0 | 0x0000 | Side wall for tile 3 steps forward, 2 steps left |
0xFFFF | 14 | 88 | 52 | 0 | 0x0000 | Side wall for tile 3 steps forward, 1 steps left |
0xFFFF | 14 | 128 | 52 | 0 | 0x8000 | Side wall for tile 3 steps forward, 1 steps right |
0xFFFF | 14 | 152 | 52 | 0 | 0x8000 | Side wall for tile 3 steps forward, 2 steps right |
0xFFFF | 0 | 176 | 55 | 0 | 0x8000 | Side wall for tile 3 steps forward, 3 steps right |
0xFFFF | 0 | 200 | 58 | 0 | 0x8000 | Side wall for tile 3 steps forward, 4 steps right |
0xFFFF | 0 | 72 | 58 | 12 | 0x0000 | POW? sprite 4 steps forward |
0xFFFF | 0 | 72 | 58 | 12 | 0x8000 | POW? sprite 4 steps forward |
0xFFFF | 0 | 69 | 63 | 12 | 0x0000 | POW? sprite 4 steps forward |
0xFFFF | 0 | 75 | 63 | 12 | 0x8000 | POW? sprite 4 steps forward |
0xFFFF | 0 | 73 | 53 | 12 | 0x0000 | POW? sprite 4 steps forward |
0xFFFF | 0 | 71 | 53 | 12 | 0x8000 | POW? sprite 4 steps forward |
0xFFFF | 0 | 80 | 57 | 12 | 0x0000 | POW? sprite 4 steps forward |
0xFFFF | 0 | 64 | 57 | 12 | 0x8000 | POW? sprite 4 steps forward |
0xFFFF | 7 | -24 | 52 | 0 | 0x2000 | Facing wall for tile 3 steps forward, 2 steps left |
0xFFFF | 7 | 32 | 52 | 0 | 0x0000 | Facing wall for tile 3 steps forward, 1 step left |
0xFFFF | 7 | 88 | 52 | 0 | 0x0000 | Facing wall for tile directly 3 steps forward |
0xFFFF | 0 | 144 | 52 | 0 | 0x0000 | Facing wall for tile 3 steps forward, 1 step right |
0xFFFF | 0 | 200 | 52 | 0 | 0x2000 | Facing wall for tile 3 steps forward, 2 steps right |
0xFFFF | 0 | -79 | 52 | 11 | 0x2000 | |
0xFFFF | 0 | -27 | 52 | 11 | 0x0000 | |
0xFFFF | 0 | 32 | 52 | 11 | 0x0000 | |
0xFFFF | 0 | 89 | 52 | 11 | 0x0000 | |
0xFFFF | 0 | 145 | 52 | 11 | 0x2000 | |
0xFFFF | 0 | -8 | 50 | 12 | 0x0000 | |
0xFFFF | 0 | -65 | 50 | 12 | 0x0000 | |
0xFFFF | 0 | 49 | 50 | 12 | 0x0000 | |
0xFFFF | 0 | -65 | 50 | 12 | 0x0000 | |
0xFFFF | 0 | -81 | 50 | 12 | 0x0000 | |
0xFFFF | 0 | 49 | 50 | 12 | 0x0000 | |
0xFFFF | 0 | 65 | 50 | 12 | 0x0000 | |
0xFFFF | 0 | -24 | 50 | 12 | 0x0000 | |
0xFFFF | 0 | 9 | 50 | 12 | 0x0000 | |
0xFFFF | 0 | -8 | 50 | 12 | 0x0000 | |
0xFFFF | 7 | 8 | 48 | 0 | 0x0000 | Side wall for tile 2 steps forward, 2 steps left |
0xFFFF | 7 | 64 | 40 | 0 | 0x0000 | Side wall for tile 2 steps forward, 1 steps left |
0xFFFF | 6 | 144 | 40 | 0 | 0x8000 | Side wall for tile 2 steps forward, 1 steps right |
0xFFFF | 6 | 200 | 48 | 0 | 0x8000 | Side wall for tile 2 steps forward, 2 steps right |
0xFFFF | 0 | 72 | 53 | 8 | 0x0000 | POW? sprite 3 steps forward |
0xFFFF | 0 | 72 | 53 | 8 | 0x8000 | POW? sprite 3 steps forward |
0xFFFF | 0 | 77 | 58 | 8 | 0x0000 | POW? sprite 3 steps forward |
0xFFFF | 0 | 67 | 58 | 8 | 0x8000 | POW? sprite 3 steps forward |
0xFFFF | 0 | 81 | 47 | 8 | 0x0000 | POW? sprite 3 steps forward |
0xFFFF | 0 | 63 | 47 | 8 | 0x8000 | POW? sprite 3 steps forward |
0xFFFF | 0 | 94 | 52 | 8 | 0x0000 | POW? sprite 3 steps forward |
0xFFFF | 0 | 50 | 52 | 8 | 0x8000 | POW? sprite 3 steps forward |
0xFFFF | 6 | -40 | 40 | 0 | 0x2000 | Facing wall for tile 2 steps forward, 1 step left |
0xFFFF | 6 | 64 | 40 | 0 | 0x0000 | Facing wall for tile directly 2 steps forward |
0xFFFF | 0 | 168 | 40 | 0 | 0x2000 | Facing wall for tile 2 steps forward, 1 step right |
0xFFFF | 0 | -72 | 40 | 6 | 0x2000 | |
0xFFFF | 0 | 32 | 40 | 6 | 0x0000 | |
0xFFFF | 0 | 137 | 40 | 6 | 0x2000 | |
0xFFFF | 0 | -7 | 25 | 7 | 0x0000 | |
0xFFFF | 0 | -112 | 25 | 7 | 0x2000 | |
0xFFFF | 0 | 98 | 25 | 7 | 0x2000 | |
0xFFFF | 0 | -112 | 29 | 8 | 0x2000 | |
0xFFFF | 0 | 98 | 29 | 8 | 0x2000 | |
0xFFFF | 0 | -38 | 29 | 8 | 0x0000 | |
0xFFFF | 0 | 25 | 29 | 8 | 0x0000 | |
0xFFFF | 0 | -7 | 29 | 8 | 0x0000 | |
0xFFFF | 6 | 32 | 24 | 0 | 0x0000 | Side wall for tile 1 step forward, 1 steps left |
0xFFFF | 0 | 168 | 24 | 0 | 0x8000 | Side wall for tile 1 step forward, 1 steps right |
0xFFFF | 0 | 72 | 48 | 4 | 0x0000 | POW? sprite 2 steps forward |
0xFFFF | 0 | 72 | 48 | 4 | 0x8000 | POW? sprite 2 steps forward |
0xFFFF | 0 | 85 | 53 | 4 | 0x0000 | POW? sprite 2 steps forward |
0xFFFF | 0 | 59 | 53 | 4 | 0x8000 | POW? sprite 2 steps forward |
0xFFFF | 0 | 89 | 41 | 4 | 0x0000 | POW? sprite 2 steps forward |
0xFFFF | 0 | 55 | 41 | 4 | 0x8000 | POW? sprite 2 steps forward |
0xFFFF | 0 | 106 | 47 | 4 | 0x0000 | POW? sprite 2 steps forward |
0xFFFF | 0 | 38 | 47 | 4 | 0x8000 | POW? sprite 2 steps forward |
0xFFFF | 0 | -136 | 24 | 0 | 0x2000 | Facing wall for tile 1 step forward, 1 step left |
0xFFFF | 0 | 8 | 12 | 0 | 0x0000 | Side wall for tile directly 1 step left |
0xFFFF | 0 | 32 | 24 | 0 | 0x0000 | Facing wall for tile 1 step forward, 1 step right |
0xFFFF | 0 | 200 | 12 | 0 | 0x8000 | Side wall for tile directly 1 step right |
0xFFFF | 0 | 200 | 24 | 0 | 0x2000 | Facing wall for tile directly 1 step forward |
0xFFFF | 0 | 32 | 24 | 0 | 0x0000 | |
0xFFFF | 0 | -5 | 2 | 0 | 0x6000 | |
0xFFFF | 0 | -67 | 10 | 0 | 0x6000 | |
0xFFFF | 0 | 44 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 44 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 58 | 14 | 0 | 0x6000 | |
0xFFFF | 0 | 169 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 169 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | -5 | 14 | 0 | 0x6000 | |
0xFFFF | 0 | 110 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 110 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | -5 | 14 | 0 | 0x6000 | |
0xFFFF | 0 | 110 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 110 | 73 | 0 | 0x0000 | |
0xFFFF | 0 | 72 | 43 | 0 | 0x0000 | POW? sprite 1 steps forward |
0xFFFF | 0 | 72 | 43 | 0 | 0x8000 | POW? sprite 1 steps forward |
0xFFFF | 0 | 93 | 48 | 0 | 0x0000 | POW? sprite 1 steps forward |
0xFFFF | 0 | 51 | 48 | 0 | 0x8000 | POW? sprite 1 steps forward |
0xFFFF | 0 | 97 | 36 | 0 | 0x0000 | POW? sprite 1 steps forward |
0xFFFF | 0 | 47 | 36 | 0 | 0x8000 | POW? sprite 1 steps forward |
0xFFFF | 0 | 118 | 42 | 0 | 0x0000 | POW? sprite 1 steps forward |
0xFFFF | 0 | 26 | 42 | 0 | 0x8000 | POW? sprite 1 steps forward |
TODO: everything else
File Format[]
512 bytes: WallData, 16x16 uint16 values comprising the visual map data (floors, walls, etc...) 256 bytes: CellFlag, 16x16 bytes, each byte holding the flags for one tile 2 bytes: mazenumber, uint16 value indicating this map ID (see above)
"SurrMazes": 2 bytes: uint16 value indicating the map ID to the north 2 bytes: uint16 value indicating the map ID to the east 2 bytes: uint16 value indicating the map ID to the south 2 bytes: uint16 value indicating the map ID to the west
2 bytes: mazeFlags 2 bytes: mazeFlags2 16 bytes: wallTypes, 16 byte array of wall types, used for indirect lookup 16 bytes: surfaceTypes, 16 byte array of surface types (ie, floors) used for indirect lookup 1 byte: floor type, the default floor type (lookup table, used by indoor maps) 1 byte: runX, the X coordinate the party will land at if they run from a fight 1 byte: wallNoPass, wall values greater than or equal to this value cannot be walked through at all. 1 byte: surfNoPass, suface values greater than or equal to this value cannot be stepped on (typically only ever 0x0F, space). 1 byte: unlockDoor, the difficulty of unlocking a door on this map 1 byte: unlockBox, the difficulty of unlocking a chest on this map 1 byte: bashDoor, the difficulty of bashing through a door 1 byte: bashGrate, the difficulty of bashing through a grate 1 byte: bashWall, the difficulty of bashing through a wall (note that there are other requirements to bash through a wall, even if the party is strong enough) 1 byte: chanceToRun, the difficulty of running from a fight 1 byte: runY, the Y coordinate the party will land at if they run from a fight 1 byte: trapDamage, the level of damage the party will receive from traps on this map 1 byte: wallKind, the type of walls, used in a lookup table 1 byte: tavernTips, lookup table for the text file used by the tavern, if any 32 bytes: 16x16 bit array indicating which tiles have been "seen" 32 bytes: 16x16 bit array indicating which tiles have been "stepped on"
The first 512 bytes is a 16x16x2 byte array and contains 4 layers (4 bits per layer) of map data. See above for usage notes.
The next 256 bytes hold flags, one byte per tile. They seem to correspond to positions on the map (as a 16x16 byte array). For example, water tiles have a value of 0x40, tiles with a sign have a value of 0x10. This is because:
- 0x80 = Grate
- 0x40 = You can't rest on this tile (e.g. water)
- 0x20 = Drain
- 0x10 = Event
- 0x08 = Object
- 0x07 = Monsters (3 bits = 3 monsters)
The next two bytes are an unsigned int indicating the ID of this map. It is usually the same as the ID listed in the file name, but it was recently discovered that, on rare occasions, the file is renamed and this value not updated (in SWORDS). In such instances, this value should be ignored, as it is no longer correct. It is only used when stitching multiple maps together to generate larger maps, such as in towns and dungeons, so can be safely ignored.
The next 4 unsigned ints are the IDs of the maps which are to be loaded as the player crosses the north, east, south, and west borders of the current map respectively. Each map is to be loaded by filename as listed above, with IDs 1-99 being file MAZE00xx.DAT, and IDs 100-255 being file MAZEXxxx.DAT. Always use the filename; as mentioned, the current map ID is mostly superfluous and occasionally incorrect. A map ID of zero means no map is located in that direction, and the game will render it as "space" tiles.
"mazeflags" is a uint16 bitfield of restrictions. For the bits below which represent spells, an attempt to cast them will result in a "Spell Failed" message, while an attempt to save (where prohibited) will result in a message stating that the Gods of Game Restoration have deemed this area off-limits.
0x0040 = Etheralize 0x0080 = ? 0x0100 = Town Portal 0x0200 = Super Shelter 0x0400 = Time Distortion 0x0800 = Lloyd's Beacon 0x1000 = Teleport 0x2000 = ? 0x4000 = Rest 0x8000 = Save
Maze Flags 2:
0x4000 = Is Dark 0x8000 = Is an Outdoors map (if not set, this is an Indoors map)
The next 16 bytes is an array of bytes used for indirect lookup indicating the wall type. In 2D map viewing, it is an indirect lookup from the map data to the loaded TIL file.
The next 16 bytes is an array of bytes used for indirect lookup indicating the surface (ie, ground) tiles. It is used in similar fashion to the wallType array.
The next 13 bytes require more investigation.
The next 32 bytes is a 16x16 bit array indicating which tiles have been "seen" for auto mapping purposes.
The final 32 bytes is a 16x16 bit array indicating which tiles have been "stepped on".
TODO: Fill in the unknowns in the file format.
Example for Wall Data (First 512 Bytes)[]
The following matrices shows an example for WallData (first 512 Bytes in a DAT-File). Map is already
flipped vertically.
Clouds of Xeen, Outdoor Map, Area A1:
Ground Layer:[]
06 06 06 15 15 15 15 15 15 15 15 15 15 15 15 15 06 06 15 15 15 15 15 06 06 15 15 15 06 06 06 06 06 15 15 15 15 06 06 06 06 06 06 06 06 06 06 06 15 15 15 15 06 06 06 06 06 06 06 06 06 06 06 06 15 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06 15 15 06 06 06 06 06 06 06 06 06 06 06 06 06 06
Middle Layer:[]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 00 00 00 01 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 01 00 00 00 00 00 00 00 00 01 11 00 00 00 00 01 01 01 01 00 01 00 00 00 00 01 00 00 00 00 01 01 00 00 01 01 01 00 00 00 00 00 00 00 00 01 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 01 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Top Layer:[]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Overlay Layer:[]
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00