Um pixel de mapa é um byte, e dois de seus bits são brilho
61 cores base × 4 tons = 244 cores a partir de um array de 16.384 bytes. Apenas um dos quatro tons é o valor pleno da cor; 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 colors bytes com exatamente 16.384 entradas, ou seja, 128 × 128. Isso vale tanto para um mapa de escala 0 que cobre 128 blocos quanto para um de escala 4 que cobre 2.048 blocos — a contagem de pixels nunca muda. Todo o resto sobre map art 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 compactados juntos:
baseColorId = colorId >> 2 // 0–63
shadeIndex = colorId & 3 // 0–3
Assim, os dois bits inferiores são o brilho e o restante indica qual bloco você está vendo. Com 61 cores base definidas (o id 0 é o espaço transparente/não explorado), o maior byte que um mapa real comporta é 61 × 4 + 3 = 247.
61 × 4 = 244 cores distintas, que é a paleta inteira disponível para map art. Não 61, e não 256.
Apenas um tom é o valor pleno da cor
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 é o próprio RGB da cor do mapa, sem escala — um valor fixo por id de cor, não amostrado da textura do bloco. Os outros três são versões mais escuras dele, e o mais escuro — o tom 3 — tem pouco mais da metade do brilho.
É por isso que uma map art em degraus parece tão diferente de uma plana. Uma construção plana produz apenas o tom normal (86%), então um mapa plano tem 61 cores disponíveis. Variar a altura libera os tons mais claros e mais escuros de cada bloco e leva você a 183. A paleta não fica mais ampla — você não ganha matizes novas — ela fica três vezes mais profunda em valor, que é exatamente o que o dithering precisa. O quarto tom (53%) nunca é produzido a partir de blocos: ele existe no formato do byte, e só um arquivo de mapa editado o utiliza.
Vale notar também que a ordem dos tons não é monotônica: o índice 3 é o mais escuro, não o mais claro. Ordenar por índice esperando um gradiente resulta em 71%, 86%, 100%, 53%.
A escala multiplica a área, nunca a resolução
O campo scale vai de 0 a 4, e o terreno que ele cobre tem 128 × 2^scale blocos de lado:
| escala | blocos cobertos | um pixel de mapa equivale a |
|---|---|---|
| 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. É justamente por isso que a map art precisa ser construída na escala 0: em qualquer outro zoom, um pixel é a média de vários blocos e a imagem que você posicionou com tanto cuidado é reamostrada e se perde.
A linha da escala 4 vale ser lembrada por outro motivo — 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 arquivo de mapa (data/minecraft/maps/<id>.dat na pasta do mundo) tiver um array colors que não tenha 16.384 bytes, ele não é um mapa com pixels faltando: o jogo ainda carrega o mapa, mas descarta os pixels e o exibe em branco. Não existe forma de comprimento parcial. O array é sempre do tamanho completo, com áreas não exploradas armazenadas como id de cor 0 em vez de omitidas.