Seeding from a WorldPlan
Materialize a procedurally generated WorldPlan into a map — the seeder resolves each placement's semantic hint onto an asset you own, so a whole town lands as one undoable step.
Instead of placing every asset by hand, you can seed a map from a WorldPlan — a procedurally generated layout of a settlement. The seeder reads each planned placement's position and semantic hint, matches the hint to an asset you own, and drops the whole scene in one step you can undo.
What a WorldPlan is#
A WorldPlan v1 is the output of the procedural world generator: a validated JSON document listing placements, each carrying a world position (x, z in metres), a rotation, and a semantic kind / assetHint such as cottage, shop-house, civic-hall, tree, bench, or street_light. The hint is a description of what belongs there, not a catalog slug — the seeder decides which of your assets fulfills it.
The mapping from a WorldPlan placement to a map placement is:
| WorldPlan | Map placement | Notes |
|---|---|---|
x, z | x, z | Copied verbatim — not grid-snapped (snap is a separate step). |
rotation | ry | Omitted when 0. |
assetHint ?? kind | assetRef | Resolved to an asset you own. |
id | id | Carried through as the placement identity. |
| — | s | WorldPlan has no scale, so scale stays 1. |
Seeding a map#
Two entry points:
- New from WorldPlan… in the project menu picks a plan file, creates a fresh map, and seeds it.
map.seedFromWorldPlan(command palette) seeds the current map. Run with no argument and it opens a file picker; called with a plan object (for example fromwindow.studio) it seeds directly.
Either way the entire plan is added as one undo step — undo removes the whole seed at once.
How hints resolve to your assets#
The seeder maps each hint onto a slug from your owned and free catalog:
- an exact match on the normalized slug, then
- a keyword / substring match against the asset's slug, name, and category (three-character tokens or longer) — deliberately fuzzy, so
suburban-housecan resolve toshop-housevia the sharedhousetoken.
A hint with no match is skipped. Because resolution is scoped to assets you own, seeding a plan you don't have full coverage for simply places what it can and reports the rest.
Seeded placements are named <Base>.<nnn> and routed to a layer by category — trees and rocks to Nature, houses and buildings to Structures, fences to Boundary, everything else to Props. A toast reports the result, for example Seeded 48 placement(s) · 6 skipped.
The seeder rejects a plan whose schemaVersion isn't 1. The full mapping contract is in Studio file formats.
Next#
Ask us directly — we answer support mail ourselves.