v0.124.0 — Procedural maps: Forest paths
The first milestone of the procedural map generation program (M1). A GM opens the Generate tab on a map, gets a forest with its roads from a seed and a handful of sliders, shapes it live in a preview only they see, and commits it. The committed map is plain map data the platform draws for everyone, with or without the generator. The program's documents are in docs/programs/mapgen/; this milestone's detailed tasks, decisions and test script are in docs/programs/mapgen/m1-forest-paths.md. Released after v0.122.1, which ships first.
Forest paths
- [x] The Generate tab. On a map you can edit, the left sidebar has a Generate tab; Generate Map in the map's menu and the create chooser opens it. Forest is the first template: seed (with 🎲), size up to 200 × 200 squares, forest type (mixed, deciduous, conifer, birch), tree density, rock coverage, elevation, difficult terrain, and a road (none, single, fork, crossroads, T-junction) with quality, maintenance and windiness. Display toggles for contours, terrain data and hidden slots are view settings, not part of the map.
- [x] Sliders that never move anything. Density and coverage only reveal or hide slots that are already planned, biggest trees first; forest type re-picks the species at each slot; elevation grows hillshade and scree, and on a straight road turns into cuttings, then tunnels and bridges. Seed, road shape, windiness and size re-plan the map, nearest the camera first, in background workers.
- [x] A preview only you see, saved as a draft on the map as you go. Players see nothing of it.
- [x] Edit what the algorithm decided: right-click a generated tree, rock or bush to hide it, swap its art, nudge it with the arrow keys, or Make it a token. Edits stay put through every slider move.
- [x] Commit. The map is saved as plain data: ground, relief and every object. Everyone sees it, it is undoable like any map edit, and no later change to the generator, or removing it, can move a tree. Edit in preview reopens the draft it came from; Remove generated map takes it away.
- [x] Art packs. The generator asks for roles (a deciduous tree, a dirt road), and a pack decides how each looks: art never moves anything. A campaign can order its packs in Settings (Map art). The included pack is AI-generated placeholder art that will be replaced by human-made art before the map generator is generally available; see the AI Policy.
- [x] AI Policy 1.3: the map generator's placeholder art is AI-generated and temporary; the map generator itself uses no AI model; the earlier LLM-based map generator is retired.
For module authors: Module API 1.44.0
- [x]
registerSidebarTab: a module's own sidebar tab, beside the built-ins. - [x]
registerMapLayerRenderer: a react-three-fiber layer at the map'sgroundoroverlayslot, handed the platform's generated-map renderer. - [x]
PlatformClientAPI.maps, reached throughmoduleRegistry.getPlatform(): bulk create and remove rows as one generation (one history commit each), per-map module state, and committed generated maps. - [x] Built-in modules ship with the platform without a
modules.*.jsonentry (modules/builtin.json); modules of typemap-artcarry art packs.
Under the hood
- [x]
packages/mapgen-core: deterministic generation (integer hashing, polynomial noise, no engine-dependent maths), chunks and regions that agree on their edges, a worker pool, and golden digests that pin the output in Node and in Chromium. - [x] Migration 0077:
map_module_stateandgenerated_maps. Generated-map blobs live in the configured storage, content-addressed. - [x] The v0.25.0 map generator is retired: its modal, its LLM layout description, its per-slot GenAI images and their routes. Maps it made keep their rows and can still be removed as a batch.
- [x] The program environment loads over a remote link: dev-only gzip, allowed hosts and inline sourcemaps from the environment, warm-up, and a same-origin API for HTTPS pages.