Every tile is made of 16 cells, which have 4 possible walls (top, bottom, right & left) and may hold items and/or escalators.
That data is encoded using 4 bits (in base 16) for every cell, resulting in a 64-character long string for the whole tile.
When decoding that string, it gets split into 16 blocks of 4 characters each. The first two characters of a block represent the walls schema of the cell, the 3rd one tells us the item, and the 4th one is used for escalators.
The first two bits get converted to a 4-digit number in base 3. Every digit of that 4-digit number corresponds to a specific wall. We start from the top and go clockwise: top, right, bottom, left.
| nth digit | wall |
|---|---|
| 1 | top |
| 2 | right |
| 3 | bottom |
| 4 | left |
The value of that digit (0, 1 or 2) corresponds to the state of a wall.
| Value | wall state |
|---|---|
| 0 | no wall |
| 1 | wall |
| 2 | orange wall |
Here is a base 10 to base 3 cheatsheet. It shows the index of every possible walls schema.
| First two bits | Walls schema |
|---|---|
| 00 | 0000 |
| 01 | 0001 |
| 02 | 0002 |
| 03 | 0010 |
| 04 | 0011 |
| 05 | 0012 |
| 06 | 0020 |
| 07 | 0021 |
| 08 | 0022 |
| 09 | 0100 |
| 10 | 0101 |
| 11 | 0102 |
| 12 | 0110 |
| 13 | 0111 |
| 14 | 0112 |
| 15 | 0120 |
| 16 | 0121 |
| 17 | 0122 |
| 18 | 0200 |
| 19 | 0201 |
| 20 | 0202 |
| 21 | 0210 |
| 22 | 0211 |
| 23 | 0212 |
| 24 | 0220 |
| 25 | 0221 |
| 26 | 0222 |
| 27 | 1000 |
| 28 | 1001 |
| 29 | 1002 |
| 30 | 1010 |
| 31 | 1011 |
| 32 | 1012 |
| 33 | 1020 |
| 34 | 1021 |
| 35 | 1022 |
| 36 | 1100 |
| 37 | 1101 |
| 38 | 1102 |
| 39 | 1110 |
| 40 | 1111 |
| 41 | 1112 |
| 42 | 1120 |
| 43 | 1121 |
| 44 | 1122 |
| 45 | 1200 |
| 46 | 1201 |
| 47 | 1202 |
| 48 | 1210 |
| 49 | 1211 |
| 50 | 1212 |
| 51 | 1220 |
| 52 | 1221 |
| 53 | 1222 |
| 54 | 2000 |
| 55 | 2001 |
| 56 | 2002 |
| 57 | 2010 |
| 58 | 2011 |
| 59 | 2012 |
| 60 | 2020 |
| 61 | 2021 |
| 62 | 2022 |
| 63 | 2100 |
| 64 | 2101 |
| 65 | 2102 |
| 66 | 2110 |
| 67 | 2111 |
| 68 | 2112 |
| 69 | 2120 |
| 70 | 2121 |
| 71 | 2122 |
| 72 | 2200 |
| 73 | 2201 |
| 74 | 2202 |
| 75 | 2210 |
| 76 | 2211 |
| 77 | 2212 |
| 78 | 2220 |
| 79 | 2221 |
| 80 | 2222 |
Example (from tile 1A)
Tile string: '31i02700[…]'
First block: '31i0'
First two bits: 31
=> Schema: 1011
Top wall: 1 (wall)
Right wall: 0 (no wall)
Left wall: 1 (wall)
Bottom wall: 1 (wall)
The third bit corresponds to the item that a cell may hold. Some of them are color-specific, others aren't. All of them are listed in the table below.
| 3rd bit | item | color |
|---|---|---|
| 0 | no item | - |
| 1 | gate | green |
| 2 | gate | orange |
| 3 | gate | purple |
| 4 | gate | yellow |
| 5 | vortex | green |
| 6 | vortex | orange |
| 7 | vortex | purple |
| 8 | vortex | yellow |
| 9 | article | green |
| a | article | orange |
| b | article | purple |
| c | article | yellow |
| d | exit | green |
| e | exit | orange |
| f | exit | purple |
| g | exit | yellow |
| h | enter | - |
| i | time | - |
| j | crystal | - |
| k | camera | - |
Example (from tile 1A)
Tile string: '31i02700[…]'
First block: '31i0'
3rd bit: i
=> Item: time
The fourth bit is used for escalators. Since a cell can have both an item and an escalator end, we need a new bit for that. It tells us which cell the escalator has to go to (starting from the current cell).
| 4th bit | coordinates |
|---|---|
| 0 | no escalator |
| 1 | {x: 0, y: 0} |
| 2 | {x: 0, y: 1} |
| 3 | {x: 0, y: 2} |
| 4 | {x: 0, y: 3} |
| 5 | {x: 1, y: 0} |
| 6 | {x: 1, y: 1} |
| 7 | {x: 1, y: 2} |
| 8 | {x: 1, y: 3} |
| 9 | {x: 2, y: 0} |
| a | {x: 2, y: 1} |
| b | {x: 2, y: 2} |
| c | {x: 2, y: 3} |
| d | {x: 3, y: 0} |
| e | {x: 3, y: 1} |
| f | {x: 3, y: 2} |
| g | {x: 3, y: 3} |
Example (from tile 15)
Tile string: '370a4000[…]'
First block: '370a'
4th bit: a
=> Escalator: {x: 2, y: 1}