Um pixel de mapa é um byte, e dois de seus bits são o brilho
61 cores base × 4 tons = 244 cores de um array de 16.384 bytes. Apenas um dos quatro tons é a cor real do bloco; os outros três são escurecidos para 86%, 71% e 53%.
Todo mapa preenchido no Minecraft tem o mesmo tamanho em disco: um array de bytes colors com exatamente 16.384 entradas, que é 128 × 128. Isso vale para um mapa de escala 0 que cobre 128 blocos e para um mapa de escala 4 que cobre 2.048 blocos — a contagem de pixels nunca muda. Todo o resto sobre a arte de mapas decorre desse único fato.
O byte se divide em dois
Cada um desses 16.384 bytes não é uma cor. É uma cor base e um tom empacotados juntos:
baseColorId = colorId >> 2 // 0–63
shadeIndex = colorId & 3 // 0–3
Assim, os dois bits de menor valor são o brilho e o restante indica qual bloco você está olhando. Com 61 cores base definidas (o ID 0 é o slot transparente/inexplorado), o byte de maior valor que um mapa real contém é 61 × 4 + 3 = 247.
61 × 4 = 244 cores distintas, que é a paleta completa disponível para a arte de mapas. Não 61, e não 256.
Apenas um tom é a cor real do bloco
Os quatro multiplicadores não são igualmente espaçados, e um deles é 1.0:
| índice do tom | multiplicador | em porcentagem |
|---|---|---|
| 0 | 180 / 255 | 70,6% |
| 1 | 220 / 255 | 86,3% |
| 2 | 255 / 255 | 100% |
| 3 | 135 / 255 | 52,9% |
O tom 2 é a cor da textura do bloco, intocada. Os outros três são versões mais escuras dela, e o mais escuro — tom 3 — tem pouco mais da metade do brilho.
É por isso que a arte de mapa em escadaria parece tão diferente de uma arte plana. Uma construção plana só pode produzir um desses quatro por bloco, então um mapa plano tem 61 cores disponíveis. Variar a altura desbloqueia os outros três tons de cada bloco e leva você a 244. A paleta não fica mais ampla — você não obtém novas tonalidades — ela fica quatro vezes mais profunda em valor, que é exatamente o que o dithering precisa.
Observe também que a ordem dos tons não é monotônica: o índice 3 é o mais escuro, não o mais brilhante. Ordenar por índice e esperar um gradiente resulta em 71%, 86%, 100%, 53%.
A Escala multiplica a área, nunca a resolução
O campo scale varia de 0 a 4, e o terreno que ele cobre é de 128 × 2^scale blocos de lado:
| escala | blocos cobertos | um pixel de mapa é |
|---|---|---|
| 0 | 128 × 128 | 1 bloco |
| 1 | 256 × 256 | 2 × 2 blocos |
| 2 | 512 × 512 | 4 × 4 blocos |
| 3 | 1.024 × 1.024 | 8 × 8 blocos |
| 4 | 2.048 × 2.048 | 16 × 16 blocos — exatamente um chunk |
Um mapa de escala 4 cobre 256 vezes a área de um mapa de escala 0 usando os mesmos 16.384 bytes. Essa é a razão pela qual a arte de mapa precisa ser construída na escala 0: em qualquer outro zoom, um pixel é uma média de vários blocos e a imagem que você cuidadosamente colocou é reamostrada.
A linha da escala 4 vale a pena ser lembrada por uma razão diferente — um pixel é precisamente um chunk, o que torna um mapa totalmente ampliado uma grade de chunks utilizável.
O que isso significa para um arquivo corrompido
Se um map_<id>.dat tem um array colors que não é de 16.384 bytes, não é um mapa com pixels faltando — não é um mapa legível de forma alguma. Não existe uma forma de comprimento parcial. O array é sempre de tamanho completo, com áreas inexploradas armazenadas como ID de cor 0 em vez de omitidas.