Analysis of the binary Tibia 10 map file format

Support TibiaMaps.io by bidding on a character auction!

The character Wablieftru is being auctioned for 59 TC.

File name format

Tibia client versions up to 10 store their map files in the Automap directory:

Each file within that folder contains the map data for a tile of 256×256 pixels. Each *.map file has a name of the form xxxyyyzz.map, where…

Example map file

I’ll be using 12612507.map as an example throughout this guide. This file contains the data for an area near Thais. To follow along, use your own map file, or quickly download a copy:

$ wget https://tibiamaps.github.io/archive/Automap-with-markers/12612507.map

File structure

A *.map file consists of three main parts:

  1. The first 0x10000 (= 65536 = 256×256) bytes contain visual map data.
  2. The following 0x10000 bytes contain pathfinding data.
  3. The remaining bytes contain map marker data.

Visual map data

The first 0x10000 (256×256) bytes of the map file form the graphical portion of the map. Each byte represents a single visible map pixel. The map data first contains the 256 pixels in the first column, then the 256 pixels in the second column, etc. — the pixels go from top to bottom, rather than from left to right.

$ hexdump -v -C -n 65536 12612507.map
00000000 33 33 33 33 33 33 33 33 33 33 33 33 33 ba 33 33 |3333333333333.33|
00000010 33 33 33 33 18 18 18 18 0c 0c 18 18 18 18 18 18 |3333............|
00000020 18 18 18 18 ba ba ba ba ba ba ba ba ba ba ba ba |................|
00000030 0c ba ba ba ba ba ba 81 81 81 ba 18 18 18 18 18 |................|
00000040 ba 18 18 18 18 18 0c 18 18 18 18 18 18 18 18 18 |................|
00000050 0c 18 0c 18 18 18 18 18 18 18 18 18 18 18 18 33 |...............3|
00000060 33 33 33 18 18 18 18 18 18 33 33 33 18 18 18 18 |333......333....|
00000070 18 18 18 18 33 33 33 33 33 33 33 33 33 33 33 33 |....333333333333|
00000080 33 33 33 33 33 33 33 33 33 18 18 18 56 56 18 18 |333333333...VV..|
00000090 18 56 56 18 18 18 18 33 33 33 33 33 33 33 33 33 |.VV....333333333|
000000a0 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 |3333333333333333|
000000b0 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 |3333333333333333|
000000c0 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 |3333333333333333|
000000d0 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 |3333333333333333|
000000e0 33 33 33 33 33 33 33 18 18 ba 81 81 81 81 81 ba |3333333.........|
[…]
0000ff20 18 18 18 18 18 18 18 18 18 18 56 18 18 18 18 56 |..........V....V|
0000ff30 56 56 56 56 56 56 56 56 56 56 56 56 81 81 56 56 |VVVVVVVVVVVV..VV|
0000ff40 56 56 56 c0 c0 56 56 56 56 56 81 81 56 56 56 56 |VVV..VVVVV..VVVV|
0000ff50 56 56 56 56 56 56 18 18 18 18 18 18 81 81 18 18 |VVVVVV..........|
0000ff60 18 18 18 0c 0c 0c 18 18 18 0c 18 18 0c 0c 18 18 |................|
0000ff70 18 18 18 18 18 18 18 56 56 56 18 18 18 18 18 18 |.......VVV......|
0000ff80 18 18 0c 18 18 18 18 18 0c 0c 18 18 0c 0c 18 18 |................|
0000ff90 18 18 18 18 18 33 33 33 33 18 18 0c 18 0c 0c 0c |.....3333.......|
0000ffa0 0c 18 0c 18 18 18 18 18 33 33 33 33 33 33 33 33 |........33333333|
0000ffb0 33 18 0c 18 18 18 18 18 33 33 33 33 33 33 33 33 |3.......33333333|
0000ffc0 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 |3333333333333333|
0000ffd0 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 |3333333333333333|
0000ffe0 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 |3333333333333333|
0000fff0 56 81 81 0c 81 81 81 18 18 18 56 56 18 18 81 81 |V.........VV....|
00010000

The official Tibia servers only use a handful of color IDs:

Byte value / color ID Meaning Color
0x00 empty or unexplored area black
0x0C tree dark green
0x18 grass light green
0x33 water blue
0x56 rock/mountain dark gray
0x72 earth/stalagmite dark brown
0x79 earth brown
0x81 stone tile/cobbled pavement gray
0x8C light spot in grassy area light green
0xB3 ice light blue
0xBA wall red
0xC0 lava orange
0xCF sand beige
0xD2 ladder/stairs/hole/… yellow
0xD7 snow white

However, the Tibia client recognizes any byte value — even those that aren’t used on the official servers — and assigns a different color to each value. This means it’s possible to create fake map files that contain colors that aren’t used anywhere in the real game map.

Pathfinding data

The next 0x10000 bytes form the map that is used for pathfinding. Each of these 256×256 bytes represents the walking speed friction on a specific tile. In general, the lower the friction value, the higher your movement speed on that tile. There are two known constants:

$ hexdump -v -s 0x10000 -n 65536 -C 12612507.map
00010000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
00010010 ff ff ff ff 96 96 96 96 ff ff 96 96 96 96 96 96 |................|
00010020 96 96 96 96 ff ff ff ff ff ff ff ff ff ff ff ff |................|
00010030 ff ff ff ff ff ff ff 6e 6e 6e ff 96 96 96 96 ff |.......nnn......|
00010040 ff 96 96 96 96 96 ff 96 96 96 96 96 96 96 96 96 |................|
00010050 ff 96 ff 96 96 96 96 96 96 96 96 78 78 78 96 ff |...........xxx..|
00010060 ff ff ff 96 96 96 96 96 96 ff ff ff 96 96 78 78 |..............xx|
00010070 78 96 96 96 ff ff ff ff ff ff ff ff ff ff ff ff |x...............|
00010080 ff ff ff ff ff ff ff ff ff 96 96 96 ff ff 78 ff |..............x.|
00010090 78 ff ff 78 96 96 96 ff ff ff ff ff ff ff ff ff |x..x............|
000100a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
000100b0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
000100c0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
000100d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
000100e0 ff ff ff ff ff ff ff 96 96 ff ff 64 64 64 ff ff |...........ddd..|
[…]
0001ff20 96 96 78 78 78 78 78 78 78 78 ff 96 96 96 96 ff |..xxxxxxxx......|
0001ff30 ff ff ff ff ff ff ff ff ff ff ff ff 96 96 ff ff |................|
0001ff40 ff ff ff ff ff ff ff ff ff ff 96 96 ff ff ff ff |................|
0001ff50 ff ff ff ff ff ff 96 96 96 96 96 96 6e 6e 96 96 |............nn..|
0001ff60 96 96 96 ff ff ff 96 96 96 ff 96 96 ff ff 96 96 |................|
0001ff70 96 96 96 96 96 96 96 ff ff ff 96 96 96 96 96 96 |................|
0001ff80 96 96 ff 96 96 96 96 96 ff ff 96 96 ff ff 96 96 |................|
0001ff90 96 96 96 96 96 ff ff ff ff 96 96 ff 96 ff ff ff |................|
0001ffa0 ff ff ff 96 96 96 96 96 ff ff ff ff ff ff ff ff |................|
0001ffb0 ff 96 ff 96 96 96 96 96 ff ff ff ff ff ff ff ff |................|
0001ffc0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
0001ffd0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
0001ffe0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
0001fff0 ff a0 a0 ff a0 a0 a0 96 96 96 ff ff 96 96 6e 6e |..............nn|
00020000

Map marker data

The remaining bytes contain the map marker data.

$ hexdump -s 0x20000 -n 65536 -C 12612507.map
00020000 07 00 00 00 0e 7e 00 00 ab 7d 00 00 02 00 00 00 |.....~...}......|
00020010 18 00 46 75 72 79 20 47 61 74 65 20 28 77 6f 72 |..Fury Gate (wor|
00020020 6c 64 20 63 68 61 6e 67 65 29 41 7e 00 00 d3 7d |ld change)A~...}|
00020030 00 00 09 00 00 00 07 00 48 61 72 62 6f 75 72 5b |........Harbour[|
00020040 7e 00 00 e2 7d 00 00 0a 00 00 00 0c 00 44 65 70 |~...}........Dep|
00020050 6f 74 20 26 20 62 61 6e 6b 5e 7e 00 00 ee 7d 00 |ot & bank^~...}.|
00020060 00 08 00 00 00 1b 00 4f 66 66 6c 69 6e 65 20 74 |.......Offline t|
00020070 72 61 69 6e 69 6e 67 20 28 64 69 73 74 61 6e 63 |raining (distanc|
00020080 65 29 61 7e 00 00 de 7d 00 00 0c 00 00 00 09 00 |e)a~...}........|
00020090 50 76 50 20 61 72 65 6e 61 71 7e 00 00 ef 7d 00 |PvP arenaq~...}.|
000200a0 00 05 00 00 00 06 00 54 65 6d 70 6c 65 8f 7e 00 |.......Temple.~.|
000200b0 00 dc 7d 00 00 03 00 00 00 0b 00 4d 61 67 69 63 |..}........Magic|
000200c0 20 73 74 6f 72 65 | store|
000200c6

The first 4 bytes indicate the number of markers on the map as a uint in little-endian byte order. If the file contains no markers, this byte sequence is 00 00 00 00 after which the file ends.

The structure of a single marker is as follows:

  1. The first byte is xOffset, i.e. the x position offset of the marker within this 256×256px tile, as a uint8.
  2. The second byte is xTile, i.e. the map tile the marker is in on the x axis, as a uint8. (This is the same value as the xxx component of the *.map file name.)
  3. The next two bytes are blank, i.e. 00 00.
  4. The next byte is yOffset, i.e. the y position offset of the marker within this 256×256px tile, as a uint8.
  5. The next byte is yTile, i.e. the map tile the marker is in on the y axis, as a uint8. (This is the same value as the yyy component of the *.map file name.)
  6. The next two bytes are blank, i.e. 00 00.
  7. The next 4 bytes represent the image ID of the marker icon, as a uint in little-endian byte order.
  8. The next 2 bytes indicate the size of the string that follows, as a uint in little-endian byte order.
  9. The next bytes represent the marker description as a windows-1252-encoded string. As a result, only the 128 symbols that can be represented in the windows-1252 encoding can be used in marker descriptions. Each marker description is limited to 99 such symbols — when viewed in the client, markers with descriptions exceeding 99 bytes are truncated, and the map file is updated with the truncated marker description.

This structure is repeated for every marker in the file, after which the file ends.

The following marker icon IDs are available:

Byte value / marker ID Short name Meaning
0x00 checkmark green checkmark ✔
0x01 ? blue question mark ❓
0x02 ! red exclamation mark ❗
0x03 star orange star 🟊
0x04 crossmark bright red crossmark ❌
0x05 cross dark red cross 🕇
0x06 mouth mouth with red lips 👄
0x07 spear spear 🏹
0x08 sword sword ⚔
0x09 flag blue flag ⚑
0x0A lock golden lock 🔒
0x0B bag brown bag 👛
0x0C skull skull 💀
0x0D $ green dollar sign 💰💲
0x0E red up red arrow up ⬆️🔺
0x0F red down red arrow down ⬇🔻
0x10 red right red arrow right ➡️
0x11 red left red arrow left ⬅️
0x12 up green arrow up ⬆
0x13 down green arrow down ⬇

Here’s what the marker icons look like in the Tibia client:

The Tibia client supports 20 different marker icons.