tibia-maps-script icon indicating copy to clipboard operation
tibia-maps-script copied to clipboard

Marker format is different for certain markers

Open mathiasbynens opened this issue 5 years ago • 1 comments

There’s something about the minimapmarkers.bin format I don’t quite understand yet. For the most part (99.99%), it seems to follow the format described in our guide.

However, some (not all!) very specific markers that are automatically added by quest NPCs seem to follow a different format.

For example, in the attached file, this marker is fine:

$ hexdump -s 0xEC6C -n 78 -C minimap/minimapmarkers.bin
0000ec6c  0a 24 0a 0a 08 a5 86 02  10 f1 f3 01 18 03 10 03  |.$..............|
0000ec7c  1a 12 49 6e 73 65 63 74  6f 69 64 20 6d 6f 6e 6f  |..Insectoid mono|
0000ec8c  6c 69 74 68 20 00 0a 12  0a 0a 08 a6 86 02 10 89  |lith ...........|
0000ec9c  f4 01 18 0e 10 04 1a 00  20 00 0a 12 0a 0a 08 a6  |........ .......|
0000ecac  86 02 10 8d f4 01 18 0e  10 04 1a 00 20 00        |............ .|
0000ecba

But the next one (a marker added by talking to NPC Sholley during the Dark Trails Quest), isn’t:

$ hexdump -s 0xECBA -n 65 -C minimap/minimapmarkers.bin
0000ecba  0a 24 0a 0a 08 a6 86 02  10 d1 f9 01 18 07 10 02  |.$..............|
0000ecca  1a 0d 51 75 61 6e 64 6f  6e 73 20 48 6f 6d 65 20  |..Quandons Home |
0000ecda  ce 95 ea be f6 2d 0a 19  0a 0a 08 a7 86 02 10 a0  |.....-..........|
0000ecea  f4 01 18 07 10 03 1a 07  41 6e 74 65 6e 6e 61 20  |........Antenna |
0000ecfa  00                                                |.|
0000ecfb

(Note: the above example shows the bytes for the marker following it as well.)

Unlike other markers, this particular marker doesn’t end with 20 00 — instead, it ends with 20 ce 95 ea be f6 2d. Why is that? What does it mean?

To allow importing this marker, we can patch tibia-maps-script as follows. Replace these lines: https://github.com/tibiamaps/tibia-maps-script/blob/master/src/from-minimap.js#L92-L94

// The byte sequence 0x20 0x00 marks the end of the marker.
console.assert(buffer[index++] === 0x20);
console.assert(buffer[index++] === 0x00);

…with…

while (buffer[index] !== undefined && buffer[index] !== 0x0A) {
  index++;
}

mathiasbynens avatar Jan 10 '20 04:01 mathiasbynens

The fact that this one marker is different could be some kind of weird Tibia client bug. Still, the client clearly supports decoding this unique representation, and so ideally our converter would have matching behavior.

mathiasbynens avatar Jan 10 '20 04:01 mathiasbynens