Руководства / Строительство и ресурсы
Пиксель карты — это один байт, и два его бита отвечают за яркость
61 базовый цвет × 4 оттенка = 244 цвета из массива в 16 384 байта. Только один из четырёх оттенков — это полное значение цвета; остальные три затемнены до 86%, 71% и 53%.
Каждая заполненная карта в Minecraft занимает на диске один и тот же объём: массив colors ровно из 16 384 байт, то есть 128 × 128. Это верно и для карты размера 0, охватывающей 128 блоков, и для карты размера 4, охватывающей 2 048 блоков, — количество пикселей никогда не меняется. Всё остальное в картографии вытекает из этого одного факта.
Байт делится надвое
Каждый из этих 16 384 байт — не цвет. Это базовый цвет и оттенок, упакованные вместе:
baseColorId = colorId >> 2 // 0–63
shadeIndex = colorId & 3 // 0–3
Итак, два младших бита — это яркость, а остальное — то, на какой блок вы смотрите. При 61 определённом базовом цвете (id 0 — это прозрачный/неисследованный слот) самый большой байт, который может хранить настоящая карта, — 61 × 4 + 3 = 247.
61 × 4 = 244 различных цвета — это вся палитра, доступная для карт-арта. Не 61 и не 256.
Только один оттенок — это полное значение цвета
Четыре множителя расположены неравномерно, и один из них равен 1.0:
| индекс оттенка | множитель | в процентах |
|---|---|---|
| 0 | 180 / 255 | 70,6% |
| 1 | 220 / 255 | 86,3% |
| 2 | 255 / 255 | 100% |
| 3 | 135 / 255 | 52,9% |
Оттенок 2 — это собственный RGB цвета карты, без масштабирования: фиксированное значение для каждого id цвета, а не выборка из текстуры блока. Остальные три — его более тёмные версии, и самый тёмный — оттенок 3 — лишь чуть выше половины яркости.
Именно поэтому ступенчатый карт-арт так сильно отличается от плоского. Плоская постройка даёт только обычный оттенок (86%), поэтому у плоской карты доступен 61 цвет. Варьируя высоту, вы открываете более светлые и более тёмные оттенки каждого блока и доходите до 183. Палитра не становится шире — новых тонов вы не получаете, — она становится втрое глубже по значению, а это именно то, что нужно для дизеринга. Четвёртый оттенок (53%) из блоков вообще никогда не получается: он существует в формате байта, и его использует только отредактированный файл карты.
Заметьте также, что порядок оттенков не монотонен: индекс 3 — самый тёмный, а не самый светлый. Если отсортировать по индексу и ожидать градиент, получите 71%, 86%, 100%, 53%.
Размер умножает площадь, но никогда — разрешение
Поле scale принимает значения 0–4, и охватываемая им местность — это 128 × 2^scale блоков по стороне:
| размер | охватываемых блоков | один пиксель карты — это |
|---|---|---|
| 0 | 128 × 128 | 1 блок |
| 1 | 256 × 256 | 2 × 2 блока |
| 2 | 512 × 512 | 4 × 4 блока |
| 3 | 1 024 × 1 024 | 8 × 8 блоков |
| 4 | 2 048 × 2 048 | 16 × 16 блоков — ровно один чанк |
Карта размера 4 охватывает в 256 раз большую площадь, чем карта размера 0, используя те же 16 384 байта. Именно поэтому карт-арт приходится строить при размере 0: при любом другом масштабе один пиксель — это усреднение нескольких блоков, и изображение, которое вы аккуратно выложили, пересэмплируется и исчезает.
Строку с размером 4 стоит запомнить по другой причине — один пиксель там это ровно один чанк, что делает полностью приближённую карту удобной сеткой чанков.
Что это значит для повреждённого файла
Если в файле карты (data/minecraft/maps/<id>.dat в папке мира) массив colors имеет не 16 384 байта, то это не карта с недостающими пикселями: игра всё равно загружает карту, но выбрасывает пиксели и показывает её пустой. Формы с частичной длиной не существует. Массив всегда полноразмерный, а неисследованные области хранятся как id цвета 0, а не опускаются.