Devlog · Blocks · 17 October 2026

Room for 1,024 blocks

The material table was full at 256. Now there is room for 1,024 blocks, and every old world keeps its exact bytes.

A wall of dyed blocks in colour families from grey and brown through red, yellow, green and blue
Colour families from the Builder's palette: each one is a material id. Real gameplay.

What landed

Every block in a Commonwild world is one 16-bit cell, and until this change the cell packed the shape, the turn and the material together, which left room for only 256 materials. That table was full: wave 13's new country pushed the built-in materials to 255, and wave 14's packs take their ids from the top of the table down, so the two collided. Wave 13 held some of its new ground cover back, borrowing the colours of older blocks, until there was room.

How it works now

The fix keeps the cells at 16 bits and gives a chunk its own palette only when it holds a material numbered 256 or more. Every other chunk keeps exactly the bytes it had, and an old save reads as if it had a plain palette. Material ids are now 16-bit: built-in blocks count up from 0 and pack blocks count down from 1,023, so the space holds 1,024 materials. A material past 255 has one fixed id, the same on every thread and page, so meshing, light, water, collisions, the edit log, patterns, imports, the pack, the workings and shared worlds all work unchanged. A chunk that would need a 257th different material is refused with a plain message rather than saved wrong. We measured before and after: meshing stayed at a median of 2.27 to 2.35 ms, 392 chunks saved the same 12,922,520 bytes in the same time, 1,206 old chunk saves re-saved byte for byte identical, and the pinned world versions 1 to 6 did not change. The story test ran with 402 materials and a chunk holding 200 of them, and blocks with high ids replayed correctly over the shared-world relay, 35 of 35.

1,024
Material ids, built-ins up from 0, packs down from 1,023
1,206 of 1,206
Old chunk saves re-saved byte for byte
2.27 to 2.35 ms
Median time to mesh a chunk, before and after
146.1 fps
Average in the 15-minute soak, 0 errors, 22.34 MB
A wall of coloured glass panes in a row with trees behind
Coloured glass, one material per colour. Real gameplay.
A cider press block from a pack standing on a sandy riverbank
A pack block: the cider press from the test pack, now on a high id. Real gameplay.

What is still weak

A chunk that needs a 257th different material is refused rather than split, so a very busy build can still hit the wall in one chunk. Lanterns, ramps, roots and slopes are not yet made for materials past 255, and water and flowers from packs do not draw yet. The host does not yet check a saved chunk's palette against the packs a world has loaded, and pack blocks placed in worlds before this change keep their old ids until they are remapped. The heath, pine needle, marram and bracken ground covers still borrow older colours; they come back now that there is room.

Where it runs

Live on our demo host since live rebuild 26 on 17 October 2026. The demo host is our own test server; since that rebuild a shared world on it can be joined from a link over the internet.

How we measure

Every wave closes with a play test on the build machine in the browser: a scripted story test that plays the new loop end to end and reloads the world to check it came back exactly, the older waves' story tests run again on the merged build, the engine's unit tests, and a 15-minute soak that records frame rate, faults and world memory. The numbers above come from those runs, as written in our build tracker.

Next: shared worlds over the internet

Read it