feat(assets): bake the pre-seed biome input for 257 bodies (T-1295)

reach atlas planet bake-biome over the full scope: every inhabited, populated,
non-Sol body with an atmosphere. It wrote 257 biomemap.png + 257
terrainmap.png, 5.2 MB in total, 0 errors, in 23 minutes. `--check` then
re-simulated every body and matched all 514 maps pixel for pixel. No other
wiki file changed: reliefmaps and heightmaps are untouched.

These are the first maps with mountain rock in them. The rule could never
fire before 3cfec9025, and on Ferrath it now covers 0.6% of the surface,
with the biome still recorded beneath it. The committed reliefmaps and
globes predate that fix.

D-258: corrects two statements in the ids-not-fields amendment. "None" is
255, not 0, because class 0 is ocean_deep. Thin-atmosphere biome maps are
sparse, not empty: the anomaly scatter still places oasis life there. It also
states that layer is decided per rule, and moves the class tables to T-1297,
their first consumer.

Nothing reads these maps yet; the loader is T-1215.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-25 15:56:06 +02:00
co-authored by Claude Opus 5.5
parent 1857c6405e
commit ecae65053e
515 changed files with 5 additions and 3 deletions
+5 -3
View File
@@ -2473,8 +2473,10 @@ Technical foundation decisions that constrain implementation: engine, client-ser
**Ruling 6 — terrain type and biome are separate maps** (Jeroen: *"so we separate terrain type and biome maybe?"*). The simulator already computes them apart. `compute_biome` gives every land pixel its temperature × moisture (Whittaker) class first, then overwrites it with terrain rules: ocean depth, ice, high snow, mountain rock, lava and ash, and the dry, lunar and ferric ground. So the bake writes two maps:
- **`biomemap.png`**: the climate and life class, taken **before** the terrain overrides. It covers every land pixel, including under rock and ice, and is empty on thin-atmosphere bodies, which skip the Whittaker table.
- **`terrainmap.png`**: the landform or substrate class where a terrain rule applies, 0 where the ground is simply its biome.
- **`biomemap.png`**: the climate and life class, taken **before** the terrain overrides. On breathable worlds it covers every land pixel, including under rock and ice. Thin-atmosphere bodies skip the Whittaker table, so their biome map holds only the life the anomaly scatter places (oasis savanna, shrubs, pioneers) and is otherwise empty.
- **`terrainmap.png`**: the landform or substrate class where a terrain rule applies.
Both use **255 for "nothing on this layer"**, not 0: class 0 is `ocean_deep`, itself a terrain class, and every id stays literal. Layer is decided **per rule, not per class**: ice from the cold climate box is biome, while altitude snow is terrain with the lowland biome kept beneath. A rule that places life (thermophilic fields, chemosynthetic mats, cryptobiotic crust, the oasis rings) writes the biome map and clears the terrain under it, so stacking the two maps reproduces the single grid the renderers draw, byte for byte.
This removes the gap that made id-only look lossy. Terrain classes carry no climate and biome classes always do, so climate comes from the biome everywhere on land: rock inside a tropical zone is tropical mountain climate, cooled by altitude. The class tables split the same way, a **biome table** (climate envelope, flora, cover) and a **terrain table** (substrate, and landform hints for the server's morphology derive).
@@ -2482,7 +2484,7 @@ Technical foundation decisions that constrain implementation: engine, client-ser
**Defects found while reading the source.** `compute_biome` receives absolute kelvin, but two rules compared it to `0.35`, a 0–1 threshold, from the generator's first commit (f84275edf). **Mountain rock could never fire.** Fixed in T-1295: both rules now compare against the world's own normalised temperature, which is what `0.35` can only have meant and what `compute_moisture` already uses. A test pins the rule firing and holding back, mutation-proven. **Sulfuric scrub is unreachable independently of the units:** it converts rock only at `elev_norm` 0.25–0.65, while rock exists only above 0.65. It is left as found, since making it reachable is a design call. The committed reliefmaps and globes were rendered with the bug; the bake reflects the fix.
**Tickets re-scoped:** [T-1295](../../.pql) bakes the two id maps; [T-1215](../../.pql) loads class fractions from both; [T-1297](../../.pql) takes climate from the biome table rather than per-pixel fields; the class tables and their import are part of T-1295.
**Tickets re-scoped:** [T-1295](../../.pql) bakes the two id maps; [T-1215](../../.pql) loads class fractions from both; [T-1297](../../.pql) takes climate from the biome table rather than per-pixel fields, and owns the class tables and their import, since it is their first consumer and its needs set their columns.
---
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Some files were not shown because too many files have changed in this diff Show More