地图像素是一个字节,其中两位代表亮度
61 种基础颜色 × 4 种明暗度 = 16,384 字节数组中的 244 种颜色。四种明暗度中只有一种是方块的真实颜色;其他三种被调暗至 86%、71% 和 53%。
Minecraft 中每张已填充的地图在磁盘上的尺寸都相同:一个 colors 字节的数组,精确地包含 16,384 个条目,即 128 × 128。无论是覆盖 128 个方块的尺寸 0 地图,还是覆盖 2,048 个方块的尺寸 4 地图,像素数量从未改变。所有其他关于地图艺术的特性都源于这一事实。
字节一分为二
这 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 是方块的纹理颜色,未被触动。其他三种是其较暗的版本,而最暗的——明暗度 3——亮度仅略高于一半。
这就是为什么阶梯式地图艺术与平面地图艺术看起来如此不同。一个平面建筑每个方块只能产生这四种颜色中的一种,所以平面地图只有 61 种颜色可用。改变高度可以解锁每个方块的其他三种明暗度,使你达到 244 种颜色。调色板并没有变得更“宽”——你没有获得新的色相——它在明度上深了四倍,这正是抖动(dithering)所需要的。
另请注意,明暗度顺序并非单调:索引 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 的地图覆盖的区域是尺寸 0 地图的 256 倍,但使用相同的 16,384 字节。这就是地图艺术必须在尺寸 0 下建造的全部原因:在任何其他缩放级别下,一个像素是几个方块的平均值,你精心放置的图像会被重新采样。
尺寸 4 的行值得记住,原因不同——一个像素恰好是一个区块,这使得完全缩放的地图成为一个可用的区块网格。
这对损坏文件意味着什么
如果一个 map_<id>.dat 的 colors 数组不是 16,384 字节,它就不是一个缺少像素的地图——它根本不是一个可读的地图。没有部分长度的形式。数组总是完整尺寸的,未探索区域存储为颜色 ID 0,而不是省略。