Pilot Matter Docs Play

How the terrain works

The ground is a 16000 x 16000 unit PlaneGeometry (200 x 200 segments) whose vertices are displaced vertically by a fractal Brownian motion function - seven octaves of smooth value noise layered together. Low-frequency octaves define broad valleys and mountain ranges; high-frequency octaves add fine surface detail. A remapping curve flattens values below a threshold into wide plains and water, then exaggerates values above the threshold into steep peaks.

The noise, the remapping curve, and the mountain falloff live in js/terrain-math.js as plain functions with no Three.js dependency, so the world's shape can be unit tested in Node.

Everything drawn over that base ground is an environment element.

Elements

An element is not a model, a texture, or a placed asset. It is a registry entry in js/environment/elements.js carrying two things: the ranges it can be configured through, and the algorithm that draws it into a height and colour field. Adding a landform to the world means adding an entry, not another bespoke terrain pass, and reconfiguring one means changing a number rather than commissioning new art.

ElementConfigured through
MountainPeak count, a height range, a radius range, a girth that stretches a peak along an axis of its own, a switched girth range each peak draws its own stretch from, a switched length and width that say the footprint outright instead, and a bulk mode that randomizes the two axes said outright at once, leaving the girth with nothing to decide
CanyonA depth range, a width range, a steepness, a branch count, and how far the cut wanders
DesertA dune height range, the spacing between crests, how much of the world the dune sea covers, and a sand gradient
GrassA green gradient, and the height band it covers
SandA brown gradient, and the height band it covers
Water bodyA water line, a blue gradient read by depth, and how far the basin is pulled up to a flat surface
RiverA blue gradient, a windiness, a width range, and a depth range
ForestA tree height range, a density, a grove size range, a grove count, a canopy gradient, and the height band trees will grow in
TownA block size, how many blocks are built on, a building height range, the extent of the site, and building and street gradients
SnowA snow line, a coverage, the steepest ground snow will hold on to, and a white gradient
RunwayA length range, a width range, a heading range, the height band a strip may be built in, how far the graded apron reaches, and pavement and paint gradients

Three rules hold across all of them:

A placement can also be given a footprint: a region it is drawn inside and nowhere else - a disc, a closed outline, a stroke swept along a drag, a rectangle or an ellipse, each fading out across a feather at its edge. The feather is held to half the way in from the region's edge to its deepest point, so the inner half of a region is covered whole however small the region is: a fixed band wider than a small region has room for would leave it with no point fully covered at all. No element has to know about it. The element is drawn across a copy of the field exactly as it always is, and the copy is blended back through the footprint: all of it where the region covers the ground, none of it outside, and in proportion across the feather. A footprint is held in the square's own frame rather than the world's and repeats a square's width apart, so the same placement lands at the same place on every tile of the world, and one drawn over an edge of the square carries on across the opposite edge with no cut at the seam. The element is drawn on each tile's own ground, so anything it works out from the ground - which vertices are under a water level, for one - is worked out where it lands. Water drawn this way does not move the sea's level, which would flood the rest of the tile below it.

Mountain density, when a preset does not name a count, is still the formula it has always been:

count = (terrainArea x 0.10) / (pi x avgRadius^2)  ~  14 to 15 mountains

The runway is the one element that chooses where it goes rather than being scattered. Sixty-odd sites are drawn from the world's own seeded stream, each measured at twenty-seven points across the whole footprint of the strip rather than under the middle of it, and the flattest one wins - because what a runway needs is not a particular place but ground that does not move under it. A site outside the height band a strip may be built in is charged for the part of it that lies outside rather than thrown away, so a world with no ground inside the band gets the best ground it has instead of getting no runway at all. The pavement is then levelled dead flat to the site's own height and the apron either side eases back into whatever was there, so a strip sits in the country rather than on a plinth.

It is also cut clear of what it is cut over. Levelling is enough for everything drawn as a height - a grove, a town, a dune all go under the grader - but the water is read back off the finished field afterwards, as the vertices lying under its own line, so a strip graded at or below that line came back out as water and a flight started from the bottom of a lake. Where the water settled on the ground a strip was sited on, the strip is lifted above the line instead, and it carries a record of what it was moved clear of. The runway is the one surface a flight depends on existing, so it is the one piece of ground an element may not be placed onto.

A world is generated without a strip unless one is asked for. In the game that is the RUNWAY box in the settings panel; through the Matter API it is the runway option.

The environment builder

L opens the interactive environment builder, and so does the last entry on the title screen and on the pause menu - three ways in and one function behind them, so the way out returns to whichever of them was used. The entry comes off both menus while a game mode is running, and the key is ignored then, because a mode brings its own ground with it and leaves the builder nothing to be building. Both, because a mode can be chosen from the title screen's own panel before anything has flown: the run is live from that moment, so the title screen's entry goes dead at the same instant the pause menu's does.

The first time, it opens on its picker: six canvases to start from, in two columns, each a picture of the ground it begins as over its label and the line that says what that ground is. Five of them are the environments the settings panel offers, read off the same registry rather than written out again, so a preset added later is a card without an edit. The sixth is Blank Canvas - flat ground under grass and nothing else, the least shape the base range allows, which is still ground with a normal to catch the light rather than a plane with none. It is a thing to build on rather than a thing to fly over, so it sits beside the five rather than among them and the settings panel goes on offering five worlds.

Choosing one opens it as a canvas. A canvas is one tile rather than the endless grid a flight is flown over: the square an environment describes, 16000 units across, with four edges that are the extent of what is being built rather than a wall anything can reach. The camera is held over the middle of it, and the far plane and the fog that keep the end of the world out of frame during a flight are stood down for as long as the canvas is open, so its far corner reads as ground. Nothing about the flight's own ground changes - leave the builder and the grid is laid out again exactly as it was, with the flight still on it. A canvas opened over a paused flight and left comes back to the pause card with the aircraft where the pause left it: the ground going down again is the same ground it was already flying over, which is a world restored rather than a world chosen, and only a world chosen is a new flight. Before launch there is no flight to keep, so a canvas left from the title screen still opens on the start the settings panel holds.

A canvas carries two things over the ground and nothing else. Down the left is the palette, drawn as the builder's artwork draws it: a navy column of tiles two wide, each tile the tool's own mark, with its name on the tile's title and label for a pointer resting on it and for a screen reader. It holds only the tools that work: SELECT, ringed in green as the live tool, MOUNTAIN beside it, and the accept tool's tick at the foot of the right-hand column, where the art puts it. The white band across its head carries the chevrons that fold the tools away to a small tab in the corner, so the canvas is clear while a handle is dragged near where they sat; the tab brings them back, and a canvas opens the way the last one left them. Each tool joins the palette as it is built, in the place the twelve give it, so the column never offers a tile that does nothing. ACCEPT AND EXIT and Esc are one way out - the picker's BACK is the same call - and it returns to whichever menu opened the builder. The tile is the way out a pointer and a finger can find, which on a touch screen is the only one. Backspace leaves the picker as it leaves every panel, but not a canvas, where it is kept for deleting what has been built. In the corner beneath is the canvas's own control reference, drawn the way the flight's is: open when a canvas opens, listing only what the canvas answers to, and collapsed to its hint line and opened again by H or a click.

The view over a canvas is an orbit about a point on the ground, and it opens on the framing the canvas has always opened on. A drag in Select turns it, and so does a right drag with any tool live, the ground following the pointer, tilted no flatter than ten degrees off the horizon and never straight down. A right press turns nothing until it has travelled further than a click, because a right click is the selection's popup. A middle drag pans it, and so does Shift with the right button, which is the pan from inside any tool and the one a trackpad with no middle button has. From inside a tool a turn or a pan is an override rather than a change of tool: while it is held the pointer drives the view and the cursor grabs, the brush and a runway's outline are put away, and nothing is committed, cancelled or asked about - a change of tool would settle the draft, and moving the view must not - so letting go puts back the tool it was, with a shape being drawn a click at a time still being drawn and a stroke still pending. The wheel zooms toward the ground under the pointer, so what is pointed at stays under the pointer, and out no further than the framing that shows the whole canvas. W/A/S/D or the arrows move across the ground the way the view faces, at a speed that scales with how far out it is. Home puts the opening view back. The view never leaves the canvas or sinks into a hill: the point it turns about stays over the canvas, and the camera is kept clear of the ground under it. A drag captures the pointer, so one carried over the palette stays the drag it began as, and Esc during one ends the drag rather than the session. On a touch screen one finger orbits. None of it reaches a flight: the canvas only answers the pointer while a canvas is open, so over a flight the wheel and the right button are the browser's as they always were.

With MOUNTAIN live a click on the ground drops a mountain there: one peak, standing on the point clicked, in hand until it is kept. A click with one already in hand puts it down there instead, so it can be placed again before it is kept, and each one is its own placement, edited alone. Its controls are headed BUILD MOUNTAINS and are the mountain's own ranges - heights, radii and girth first, the ways of stretching a peak below them - less the count, which the click settles at one. The next mountain starts from where the panel was left. A peak dropped near an edge carries on across it, because the canvas is the tile the world repeats, and each one draws from a random stream of its own, so dropping it moves nothing in the world beyond its own slopes and it is the same mountain on every tile.

With SELECT live a click picks up what was built. A built element is not an object in the scene - it is a write into the ground's height and colour, gone by the time the ground is drawn - so there is no mesh to hit. A click is measured instead against each committed placement's reach: a mountain dropped at a point reaches as far as the peak it stands as, worked out again from its own seeded stream, and a placement drawn in a region reaches through that region. Where two reach the click, the one standing out most strongly there wins, so a small peak on the slope of a large one is picked near its own top. The placement picked becomes the edit in hand, drawn on Select's panel beneath the camera under SELECTED and its name, with ACCEPT and CANCEL under it, so a mountain built an hour ago can still have its height changed. A second click on it keeps it picked; a click on bare ground lets go of it. A press counts as a click only if it travels no more than a few pixels before it is let go of - a little more for a finger - because a left drag in SELECT orbits, and every orbit would otherwise end by picking whatever the pointer stopped over; the view does not turn until a press has travelled past that. A pick nothing has been done to is let go without a question, by a click elsewhere, a tool change or the way out, since there is no edit in it to keep or drop. One that was changed asks ACCEPT EDITS first, and the click goes on to what it was on its way to once that is answered.

What can be picked is drawn so it can be seen. The placement under the pointer is outlined in a thin white line, and the one in hand - picked with SELECT, or dropped by a tool and not yet kept - in a firm blue one, with the pointer a hand over anything a click would take. Neither outline touches the ground: each is traced once round the placement's reach, at exactly the strength a click needs, and stood on the terrain on a layer drawn over the canvas every frame, so hovering and picking rebuild nothing and the outline follows the ground however the view is turned. A finger has no hover, only the outline of what it tapped.

What is in hand - picked or just dropped - carries the gumball: the widget the artwork draws, at the placement's centre, its three axes projected from the camera so it lies in the scene, in the art's own colours. The art was drawn with blue up; here red is east, green north and blue up, read off the one compass frame the simulator has. Every handle the art names is bound to one value the placement owns, and a handle bound to nothing is not drawn: the white centre moves it over the ground, the red and green arrows slide it along their axes, and on a mountain the blue arrow makes it taller - a mountain lifted would float, so lifting one raises its height range instead - the dot on each axis spreads it, which is its radius, and the tick stands it taller or lower, which is its height. With Shift held at the press, a dot or a tick stretches both together. Ctrl and a press on the centre does nothing. A drag writes the same values the dock's rows hold, through the same door, so the figures follow the drag and both stop at the same bounds; the ground catches up as the drag goes on, and once more when it ends. A press on a handle is the gumball's whatever tool is live, so a mountain just dropped can be dragged taller without changing tools, and a handle moves nothing until it has been dragged further than a click - a press that wobbles as it lands leaves the placement as it was. A region drawn with a footprint, when the tools that draw them arrive, adds the squares that stretch it along an axis and the arc that turns it.

LASSO is a mode rather than a tool: its panel is headed LASSO SELECT TOOLS and holds the lasso's own tools in the rows the artwork groups them into, each its icon from the art over its name. A tool is a gesture, and what it draws is a region. Free Select gathers the ground the pointer is dragged round into a ring; Rectangle Select and Round Rect. Select span a box between where the drag began and where it is let go, square to the canvas, the second with its corners rounded by the CORNER on its panel; Ellipse Select fills that box with an ellipse; and Polyline Select places a point a click and closes when its first point is clicked again or its last is double clicked. While a shape is being drawn it is outlined on the ground as it would come out, and Esc lets go of it. A drag that never travelled past a click, a ring of fewer than three points or of no area, makes no selection. Triangle Select, Star Select and Polygon Select draw a regular figure standing on the press, reaching to the pointer and turned the way it went: three sides, as many points as NUMBER OF POINTS with every other corner pulled in to the STAR RATIO of the reach, and as many sides as NUMBER OF SIDES. Curved Polygon Select and Curved Polyline Select place a point a click, as Polyline does, and run a smooth curve through every point: the first round the whole loop, the second from the first point to the last and straight back. A field on the panel changes the selection its tool drew where it stands - an octagon from a hexagon, a sharper star, a rounder corner - and the next shape drawn with it.

What a lasso draws is the selection: not a placement - nothing is built from it and nothing keeps it - but the region every tool that minds it works inside. It lies on the ground as a dashed white line, carried across the seams like everything on the canvas, and it stays through every change of tool until DESELECT, on the lasso's panel while something is selected, drops it. A shape drawn while one is live is drawn against it, by the key held at its press: with Shift it is added, with Alt it is cut out, and with neither only the ground inside both is kept. Drawn with nothing selected, a shape is simply the selection, and one that leaves no ground selected drops it. The key is read once, at the press, so a shape of clicks keeps what its first click said; Shift pressed once a drag is under way squares a box or rounds an ellipse instead. A combined selection is outlined as the edge of the ground it covers, holes and all. A mountain dropped while a selection is live is clipped to it: it carries the selection as it stood, and is drawn at its own height times the selection's weight, so it stands whole inside, is cut away outside, and eases down across the selection's feathered edge rather than ending at a cliff. A click outside the selection drops nothing, since all of it would be cut away, and Select finds a clipped mountain only where it stands. Being no edit, a selection asks nothing as it is drawn or dropped, and leaving with one asks only whether to save.

GRASS, SAND, WATER and SNOW are the cover tool, one tool pointed at any of the four ground covers, and its panel is on the dock from the moment it is chosen - headed BUILD GRASS, BUILD SAND, BUILD WATER or BUILD SNOW, with DENSITY, the stamp's BUILD HEIGHT, BUILD WIDTH and CORNER RADIUS, and COLOR LIGHT and COLOR DARK - because the stamp is set before a stroke rather than after it. The stamp is a rounded rectangle measured in screen pixels, and it follows the pointer over the canvas. A drag lays it swept whole along the way the pointer went, each sample stood on the ground as it is taken: as wide as the stamp all along, joined round at every bend, and reaching half the stamp's depth past each end. It is laid in world units at the size it was on the screen where the drag was pressed, so a stroke drawn zoomed in is finer than one drawn from afar, and none changes size when the view moves afterwards. The strokes drawn before ACCEPT are one batch and one placement: DENSITY and the colours change every stroke of it at once, and the stamp only the strokes still to come. DENSITY is how much of the ground under a stroke the cover lies on - at 1 all of it, and below that clumps with ground showing between them, drawn through noise fixed to the canvas, so they stay where they are each time the ground is drawn. Grass and sand start at a half and water and snow whole, so a line of either is not drawn with gaps; every preset's cover is drawn at 1, as it always was. A cover drawn this way lies on all the ground under the stroke, whatever its height - its band is worked out on each tile from the ground the stroke covers there, lowest to highest, rather than kept to the strip of height a preset's grass or sand keeps to - and its colour runs from the light end on the stroke's low ground to the dark end on its high, so both show on any slope. The batch carries the gumball: its centre moves the whole batch, its squares stretch it and its arc turns it. With a selection live the batch is clipped to it, and a stroke that reaches none of the selected ground lays nothing. The next batch starts from where the panel was left.

Drawn water rests at a line of its own rather than at the sea's level, which nothing drawn moves. Water cannot stand higher than the lowest ground beside it, so at every point of a stroke the line is the lowest bank of the stroke's cross-section there, a little under it, read between the stroke's steps so it runs on without a step of its own, and never above the ground it sits on: the ground under the stroke is only ever cut down to it. So water lies level across a stroke, follows the ground down along one - a stroke drawn down a slope is a stream, not a trench cut to the level of its lowest end - and is flat in a hollow, which is a pond; a region drawn with no stroke through it, a disc or a box, is a pond at its lowest ground. It is coloured pale at its banks and dark in its middle, across its own width, and below full density it is pools: where the clumps say dry there is no water and the ground is not cut. The line is worked out on each tile from that tile's own ground, so the same stroke rests at its own line wherever the pattern repeats it, and it is kept a vertex at a time beside the sea's level: the water the renderer swells and lights is the ground lying at or under its own line, so drawn water moves with the sea and the valley beside a pond on a hill stays dry. A strip laid across drawn water is lifted clear of the water actually under it rather than of a sea far below. Drawn snow settles on any ground its stroke crosses - its line is put just under the stroke's lowest ground on each tile, rather than left at the 300 it would settle above - and how deep it lies runs in from the stroke's edge, thin and shadowed there and white down its middle, on any ground; faces too steep to hold snow stay bare, as every preset's do.

RUNWAY is Insert Runway, and its panel is its templates as cards rather than fields: BASIC RUNWAY, and COMMERCIAL, a longer, wider strip with a dashed centreline. A template is a group of placements the registry already draws, copied into the placement when it is placed, so a template improved later leaves a world built with the old one as it was; the two airports, BASIC AIRPORT and COMMERCIAL AIRPORT, are a strip with an apron painted in its grey beside it and buildings standing beyond the apron - each building an extrusion, levelled to its own ground and raised - every lot kept at its distance from the paving as the strip is widened, and an airport picked as one by any part of it. Choosing a card arms the tool, and the template's outline follows the pointer over the ground, writing nothing until the click. The click places it lined up with the view to the nearest ten degrees, as a runway is named by its heading in tens, and its strip is levelled to the ground it lands on - measured under its own footprint on every tile the pattern repeats it on, and lifted clear of any water under it, the sea's or a drawn body's; the site search's band and separation are not consulted, so a strip put on a ridge is a strip on a ridge. Beneath the cards are its HEADING, LENGTH and WIDTH, and the Flat gumball moves it by its centre, turns it by its arc and sizes its strip by its squares. A click with it in hand puts it down there instead, and another card turns it into that template where it stands. A strip is kept wholly on the canvas, so no copy of it is cut across a seam. A flight that starts on a runway starts on the last strip placed rather than the one the search found.

FREE PAINT lays paint, an element that writes a colour and no height, so a stroke of it is the ground it was laid on in another colour rather than a decal standing over it. Its panel is the artwork's three groups. COLOR SELECTION is eight swatches, a strip of every hue in four bands - the colour whole, then at 75, 50 and 25 percent on white - an eye dropper, and HEX INPUT, which reads the colour out and takes one typed as #RRGGBB or #RGB, refusing anything else. BRUSH SELECTION is the brush as two axes rather than a list of named brushes: TIP, round or square, and EDGE, hard or soft, under a DEFAULT card that is lit while the brush is the one the tool starts with - hard, round, 25 pixels - and puts it back. BRUSH PROPERTIES is OPACITY, read and typed as a percentage, SIZE in screen pixels with a slider beside it, and BLEND. The brush is sized in pixels while painting and laid in world units at the size it was on the screen where the stroke was pressed, so a stroke does not change size when the view moves. A round tip sweeps a disc and a square one a square; a hard edge eases in across the sampling's two cells, the hardest edge the ground can draw, and a soft one across a quarter of the brush's width at either side, so a soft stroke is whole across its inner half. Either band is held to half the stroke's own reach, as every footprint's is, and a quarter of the width is exactly that - so on a stroke 640 units across or narrower the two edges come to the same band, and the axis reads only on a wider one. The brush is set in screen pixels and laid in world units, so which brushes those are moves with the zoom: at the opening view of a 16000 unit canvas, where a pixel is a little under 27 units, it is a brush of 24 or under of the slider's 5 to 400, and zoomed in far enough it is every brush the slider offers. Each sample is stood on the ground as it is taken, and the stroke is shown as the region it will cover - worked out on the ground in world units, so it is as wide on the screen as the stroke laid will be - in the paint's own colour. Laid, at TINT, the default, a stroke takes the colour's hue at the ground's own lightness - the luminance it had, exactly, with as much of the colour's saturation as that lightness can carry - so a painted hillside is still lit from the same side and its pale and deep patches still show; a colour with no hue, black or white, is the ground's own grey. At NORMAL it lays the colour as it is, a flat patch, for the times one is wanted. Paint is the last colour laid, over snow and all. The strokes drawn before ACCEPT are one batch, as a cover's are: the colour, opacity and blend change every stroke of it, and the brush only the strokes still to come. The eye dropper, pressed, makes the next click on the ground take the colour of the ground there - as generated, at the vertex nearest the click - as the brush's; Esc puts it down, and a tool change does too. A batch picked again with Select shows its colour, opacity and blend, chosen there the same way.

ERASE is free paint inverted: a stroke that takes elements away rather than laying one. Its panel is TARGET - ALL, or any one element of the registry, read off it so an element added later can be erased without being listed - STRENGTH as a percentage, and the paint brush's TIP, EDGE and SIZE. An erase batch writes nothing to the ground. When the world is built it is cut out of the placements laid before it - the world's own, a preset's mountain as readily as anything built, and then the session's in the order they were committed - and where one is taken the ground is as it stood before that element ran: a mountain erased leaves the ground it was raised from, grass the ground under the grass, paint the colour under the paint. A stroke cuts only what came before it, so grass erased and laid again is grass. At a strength below whole it thins what it takes. Anything a footprint settled - a cover's band, drawn water's line - is worked out from the footprint as it was drawn, so erasing part of a thing leaves the rest exactly as it was. ALL takes every element but a runway: a strip is taken only when RUNWAY is the target, and then whole - its record, its grading and all - wherever the stroke reaches it, since half a strip cannot be landed on; and only a strip that was placed, since one the site search finds is laid when the world is flown, never on the canvas the stroke was drawn over. Water erased is dry ground: the sea writes its line wherever it is left, and a hole taken out of it has none, so it is a basin beside the lake even where its ground lies under the sea's level, and a strip laid over it is not lifted for water that is not there. A stroke is drawn in red; with Alt held at its press, in green, it puts back. As the first stroke of a batch it makes a batch that hands back what the batches before it took, of the target it names; within a batch it is cut out of the batch's own region, so an overshoot is put right before ACCEPT. An erase batch is picked again with Select by the ground its strokes covered, and carries the Flat gumball.

EXTRUDE is the one tool with stages. Its panel, EXTRUDE SHAPE, is seven shapes - Rectangle, Circle, Triangle, Polygon, Star, Polyline and Polycurve - which are shapes the lasso draws as well: the shapes are one vocabulary, written once, which the lasso and Extrude each offer some of, and they differ only in what is done with the region drawn. Under them are the chosen shape's own fields and one button whose label and whether it can be pressed are read off the stage the extrusion is at. Drawing, the button is EXTRUDE, greyed until the region covers some ground: shapes drawn are one region, filled red over the canvas with a red dashed edge and not yet ground - two that overlap read as one, Shift held at a shape's press adds it and Alt cuts it out. With a selection live, the selection is the region, drawn solid red rather than as the dashed white clip it is in every other tool, so EXTRUDE is ready on arrival, and a shape is drawn within it. Extruding, after EXTRUDE, the region is levelled to the mean of the ground under it and raised - flat on top, its wall in the band at its edge where the height eases back - with HEIGHT and FLATTEN on the panel and the gumball's blue arrow pulling it up or down; while it is pulled, the overlay shows its outline on the ground and at the height reached, and the ground is drawn once, when it is let go. The level is worked out on each tile from the ground the region covers there, as drawn, so erasing part of an extrusion leaves the rest where it stood. Surfaces, after EDIT EXTRUSION, puts the gumball away and the panel is TOP COLOR, WALL COLOR and BLEND, under APPLY and BACK. A heightfield has no faces, so the two surfaces are the two kinds of ground an extrusion makes: the top, which its footprint wholly covers, and the wall, the band at its edge where the height eases back. Every extrusion has both, down to the smallest region the tool accepts, because the footprint's feather is held to half the region's own reach rather than set at a fixed width. A click on either points the panel at that surface's colour and the blend - read off the footprint's weight under the pointer, as the element paints them, so it selects no geometry - and outlines it in red, the top round its rim and the wall at its foot and its head; a click off the extrusion points it at all three again. Each colour row carries the eye dropper, which fills that row with the ground's colour where the next click lands. APPLY comes back to extruding keeping what was changed; BACK comes back with the surfaces as they stood on the way in. At TINT, the default, each surface settles into the ground it stands on as paint does - its colour's hue at the lightness the ground had where the extrusion is drawn in the order - so a wall shades down a hillside the way the hillside does rather than reading as one printed rectangle, and the wall, blended by the band's weight, fades to the ground's own colour at its foot. At NORMAL the two colours are laid as they are. ACCEPT keeps the extrusion, and picking another shape with one lifted keeps it too, asking nothing, and draws the next with the shape picked.

Nothing a panel shows is a figure the ground is built without. What a placement's footprint works out on each tile - a cover's band, drawn snow's line, an extrusion's level - and what a body drawn through one does not read - drawn water's level and flatten - is left off its panel, as a dropped mountain's count is; every row left on is held to changing the ground it draws, the bounds a switch opens counted with the switch on.

While something is selected, every tool's panel carries DESELECT among its answers - the selection belongs to the session rather than to the lasso, so it is offered whatever tool is live, and Mountain, which has no panel before a drop, shows its heading over DESELECT alone. A right click on the selection opens a small popup at the pointer carrying the same answer, for dropping it without travelling to the panel; a right click off the selection, or a right drag that turns or pans the view, opens nothing. The click is read when the right button is let go of, so a system that sends its menu at the press never opens the popup under a drag. A press anywhere off the popup shuts it, and on the canvas does nothing else; Esc shuts it before anything else is stepped out of.

Builder settings

The builder has a settings screen of its own, made the way the game's two are and kept apart from them: how the editor behaves, never what it builds. A builder setting is read by the editor and by nothing that generates ground, no placement carries one, and the same placements build the same ground whoever's preferences were on while they were built. It is stored under its own key, so a change of shape in one screen never costs the others their values. It opens three ways: the gear at the right of the palette's band, beside the chevrons - not a tile, because the tiles are tools and a tool has a draft - O on a canvas, which opens the game's settings everywhere else, and the BUILDER SETTINGS row on the game's settings. BACK, Esc, Backspace or O returns to whichever opened it. Opened over a canvas it is modal - a layer over the palette and the dock that nothing behind takes a press through - and it suspends the live tool the way a held pan does: whatever is being dragged ends, nothing is committed or cancelled, the draft is still the draft when it closes, and the tool is the tool it was. A setting changed there applies from the next press, so turning auto accept on keeps nothing already in hand.

Under AUTO ACCEPT are the moments a draft is kept without the pilot being asked about it, a row each, with ALL over them - while it is on the other three read on, held, and turning it off gives back what they were. WHEN DRAWING AGAIN: the next press that draws - a stroke begun, a mountain dropped, a runway placed, or a shape begun over a lifted extrusion - keeps the draft in hand and starts a new one. A stroke kept that way is joined to the one auto accept kept just before it when nothing about it changed - the same element, its configuration and its clip, with nothing committed between - its region added to that one's, so the strokes a batch accepted by hand would have been are still one placement, and a new one starts only where the pilot changed something. Only a stroke tool's are joined: a mountain, a runway or an extrusion is one thing where it stands, and an extrusion is levelled to the mean of the ground it covers, which a union would change. Nothing is kept when a stroke is let go of: the stroke just drawn stays the draft, its panel still changing it and its CANCEL still dropping it, until something else happens; a pan in between keeps nothing. An extrusion still being drawn is not kept, its shapes being one region until EXTRUDE, nor one at its surfaces, where a press chooses a surface. WHEN LEAVING: the way out keeps the edit in hand and asks only SAVE AND EXIT MODE - never skipped, being the question that keeps a pilot's work - and the accept tool is named Save and exit throughout. WHEN CHANGING TOOL: another tool keeps the edit as if ACCEPT EDITS had been answered YES, and changes. Under VIEW, CAMERA SPEED - SLOW, NORMAL or FAST - scales the orbit, the pan and the wheel's zoom over a canvas together, apart from the flight's orbit sweep. RESET TO DEFAULTS puts every row back and writes that; it touches no world.

A press on a spinner with Shift held is a coarse step: ten points on a row read as a percentage - 100%, 110%, 120%, added rather than compounded - and ten of a row's own steps on any other, in every panel the rows are drawn in; with an arrow key in the element editor it is the same.

Neither way out leaves in one press: each asks the one question that applies. With an edit in hand it is ACCEPT EDITS, and either answer stays on the canvas - YES keeps the edit, NO drops it - because keeping a batch of work should never double as leaving. With nothing in hand it is SAVE AND EXIT MODE: YES keeps what was built and leaves, NO leaves the world as it was. Choosing another tool with an edit in hand asks ACCEPT EDITS too, before the tool or its panel changes, with YES keeping it and NO dropping it on the way. Each question is a small panel over the canvas that opens on YES, with NO and then CANCEL beside it; the arrows cross between the buttons, Enter answers, and CANCEL, Esc or a press off the panel calls it off with nothing settled - the edit still in hand, the tool still the one it was, and the canvas still open. CANCEL is drawn outlined rather than filled, as the dock's is, and on a screen too narrow for three across it wraps to a line of its own. The tile is named for the question it will ask - Accept edits or Save and exit - and Esc asks the same one.

What YES keeps becomes the world flown: the canvas's environment, chosen in the settings as though picked there, with what was built laid over it in the same list of placements the element editor hands to the ground. From then on the builder opens straight onto it - by L or either menu's entry - with no picker, every placement on it one that SELECT can pick up and change. Starting over is choosing another environment in the settings, which drops what was built, being ground it was never built on, and the picker is back; turning the strip on or off, or any other setting, keeps it. A build kept on Blank Canvas, which the settings do not offer, is flown on Blank Canvas's own flat ground, and kept the same way until another world is chosen there. Left from the pause menu, the flight is the one the pause left, whatever was kept. A world kept that changed the ground under it is laid under the paused flight, and the aircraft is put back over the new ground before a frame is flown: on it, if it was on the ground; in the air, where it was if that still clears the new ground with room to spare, and otherwise lifted to the height it had over the old ground - so a mountain built where it was parked is not a crash on resume, and a pilot flying low over a valley that is now a hill resumes as low over the hill. While a canvas is open the aircraft is neither flown nor measured against it.

Down the right of a canvas is the dock: the one panel every tool's controls are drawn on, generated from the ranges each declares rather than drawn per tool. With SELECT live it is headed SELECTION MODE and is the camera written out - CAMERA, TARGET and ROTATE on each axis, ZOOM as a percentage of the view that frames the whole canvas, FIELD OF VIEW as a percentage of the flight's, and PAN and MOVE rows that slide the view a tenth at a press. It reads back whatever a gesture just did, and a figure typed into it moves the camera there; one outside what the view allows is refused, and the field says what the bounds are. Beneath the camera it carries what Select is looking at: the placement picked, under SELECTED and its element's name, or with nothing picked each of the environment's own elements under WORLD: - the element editor's rows, moved onto the builder - folded until its heading is pressed. A value changed on one of those changes that element across the whole world, the ground drawn again as it moves; YES on leaving keeps it with what was built, and NO leaves it as it was. While another tool's edit is in hand the dock is that edit instead, headed as its tool's panel - BUILD WATER, BUILD MOUNTAINS - with ACCEPT and CANCEL under it. A value moved on it moves the ground under it then and there; ACCEPT keeps the edit and CANCEL drops it, and Esc asks rather than leaving from under one. Only the fields scroll - the heading and the two answers stay put - and the wheel scrolls the dock while it is over it and zooms the canvas everywhere else. A row holding a figure is its label and a field, with an up and a down of the panel's own inside the field's right edge - shown under the pointer or while the field has the focus, and always on a touch screen - that move it a press: a fiftieth of its range, or a tenth for a fraction between 0 and 1. Shift with either, or with ↑ or ↓ in the field, is ten presses, and Page Up and Page Down are always ten. A fraction is still written and typed to the hundredth, so 0.25 stepped up is 0.35. A switch or a choice is its label and its reading between the two marks that step it, and the reading is a box a click steps on, round from its last value to its first. The wheel over a field with the focus lets go of the field rather than changing the figure. A key typed into one of its fields is the field's: it moves no camera and works none of the builder's keys, and Esc gives the focus back. On a narrow screen the dock runs across the foot of the canvas.

What each of a tool's sections does is declared on it as a mode type: a verb, a kind and a subject, written Insert asset<runway>. The kind is what the builder acts on. An asset is placed by a click, previewed under the pointer, and kept as a placement; a config is one value the world holds, so a second click moves it; data is a file, and nothing on the canvas. Insert Runway places a template because it is Insert asset<runway>. The palette's art carries three more after the tour's twelve - Insert City beside Extrude, Insert Plane beside the way out, and a SAVE / LOAD bar across the foot, set in the page's type - each declared with what it does and drawn once it works, which Insert Plane and SAVE / LOAD now are. On a narrow screen the palette is three tiles across, so all of it stands above the dock, and the dock never reaches up past the palette's foot.

The environment file

A built world is saved as one JSON file: the environment it was built on, that environment's own elements as they were kept, and the placements committed over them. It is a description, as a preset is, so the ground it describes is generated again when it is read. The format is schemas/environment.schema.json, JSON Schema 2020-12, for anyone writing one by hand or by another program.

{
  "format": "pilot-matter.environment",
  "version": 1,
  "name": "Sample Valley",
  "savedAt": "2026-11-05T12:00:00.000Z",
  "base": "highlands",
  "elements": [
    { "id": "mountain-0", "type": "mountain", "config": { "height": [250, 600] } }
  ],
  "placements": [
    { "type": "mountain", "config": { "count": 1, "at": [1200, -800] }, "seed": 7 }
  ],
  "start": { "at": [1200, -800], "heading": 90, "heightFeet": 1000 },
  "plane": "bush"
}

start and plane are the world's own flight - see Insert Plane - and either may be left out: a world with no start point opens where every world does, and one with no plane is flown in the trainer. A start point read from a file is held to the world as the panel holds one, and one with no point, or a field a start point does not have, refuses the file, as a plane the simulator does not have does.

A file is read whole or not at all. One that is not JSON, names another format, was saved by a newer version, carries a field the format does not have, names an environment the builder does not offer, or holds a placement the builder does not make is refused, with every problem listed and the first named, and nothing in it is used. What is read is held to what the builder allows: every range a file sets is clamped to the bounds its element declares, as a panel would clamp it, and a range it leaves out stays out. Nothing in a file is run - it is parsed and checked, and what is kept is data. A world's file is named for it, in lower case with hyphens: sample-valley.pilot-matter.json.

In the builder, SAVE / LOAD across the foot of the palette is the tool a world is saved and loaded with. Choosing it is a change of tool, so an edit in hand is asked about first, and a save never quietly leaves one out or takes one in. Its panel, headed SAVE / LOAD, carries ENVIRONMENT: a NAME the world is written under - the environment's own until one is typed - over LOAD ENVIRONMENT… and SAVE ENVIRONMENT…. Saving writes what is committed on the canvas; where the browser can ask where to put the file it asks, and elsewhere the file is downloaded. Loading opens the file's world as the canvas, its placements committed as a kept build's are. With something built on the canvas - a placement, or the world's own rows changed - REPLACE THE BUILT WORLD is asked first, with YES and CANCEL and no NO, there being nothing to keep beside the file, and the file dialog opens from YES. What the last answer came to - the file saved, the world loaded, or why a file was refused - is written under the name until the next, and a refused file leaves the canvas as it was. A world loaded here is also the one the browser keeps, listed in the settings under its name; YES on the way out keeps the canvas as the world flown, as it keeps any build. The settings carry the same two answers under their worlds - see the settings.

Insert Plane

Insert Plane, beside the way out, says which plane a world is flown in and where a flight on it starts. Its panel, headed INSERT PLANE, has two sections, each its own mode type.

SELECT PLANE is Insert asset<flight:plane>: a card for each of five planes, the chosen one pressed and the trainer until another is. Each is drawn by code from boxes, cylinders and cones, as the trainer always has been, and each flies a little differently - the speed its wing stalls below, the speed it cruises at, the speed a full throttle settles at, the arrivals it takes, and how quickly it answers the controls, as a share of the pilot's own sensitivity. The chase view stands back from each by its size.

CardLooks likeFlies
TRAINERThe plane the simulator has always flownThe figures the flight model was tuned at
BUSH PLANEA high wing on struts, and big tyresSlow to stall, and slow at the top
TWINTwo engines under a low wingQuicker in the cruise, heavier on the controls
JETSwept wings, and no propellerThe fastest, and the quickest to stall when slow
BIPLANETwo wings on strutsThe slowest, and the quickest to roll

SELECT STARTING POINT is Insert config<flight:start-point>. With Insert Plane live, a click on the ground puts the start point there, and a second click moves it - there is only ever one. It is drawn on the canvas as a green disc with an arrow along its heading, and the white knob at the arrow's end is dragged round to turn it. The section writes it out as AT X, AT Z, HEADING and a height above the ground under it - HEIGHT FEET or HEIGHT METERS, in the altitude unit the settings read in - and CLEAR takes it away. Until one is placed, the section says how.

The start point says where, and the settings say how. A flying start opens over the point, on its heading, at its height above the ground there, at the settings' airspeed, climb and throttle; the height is measured from the ground rather than from the sea, because a start altitude above the sea is inside a mountain on half of a highland world. A takeoff opens on the strip nearest the point. While a world with a start point is flown, START HEADING and START ALTITUDE are held on the settings, with the note set by this environment.

The plane and the start point are kept with the build on the way out and saved in the environment file. A preset world is flown in the trainer from where every world starts, and so is every game mode, which brings its own world.

Objects on the ground

Everything else the builder makes is ground: an airport's hangar is an extrusion of the heightfield, and the ground is sampled every 80 metres. A house falls between two of those samples, so a building is drawn as a mesh standing on the ground instead - an object. An object is a placement like any other: committed, picked up and changed, saved in the file, and repeated at the same point of every tile of the endless world. It changes no ground; the ground is drawn as it would be without it, and the object stands on what was drawn.

A building is a prefab: a recipe of boxes, cylinders, cones and wedges - a roof's triangular prism - each part standing its base on a point in the building's own frame, in metres, with a colour. The recipe is copied into the placement when it is placed, so a prefab changed later leaves a world already built as it was built. In the file, an object is its prefab's name, its recipe and its point, heading and scale:

{
  "type": "object",
  "prefab": "cottage",
  "recipe": {
    "parts": [
      { "shape": "box", "size": [8, 3, 10], "at": [0, 0, 0], "color": 15260864 },
      { "shape": "wedge", "size": [8.6, 2.6, 10.6], "at": [0, 3, 0], "color": 9190190 }
    ]
  },
  "config": { "at": [1200, -800], "heading": 30, "scale": 1 }
}

A recipe is read whole or refused: a part of a shape there is not, a size that is not three lengths, or a part out past 500 metres refuses the file, with where it was named. A heading and a scale are held to what they may be, 0 to 359 and 0.5 to 3.

The catalogue

The city is built from 34 prefabs, original and generic designs in six categories - the ones Insert City offers them under. A skyline is a block of two to five towers. A park is laid on a lawn of its own and has no roof, so it is flown over rather than into; where the ground falls away under one, its plinth is grass rather than concrete, so it reads as a terrace.

CategoryPrefabs
SKYLINESGLASS CLUSTER, STEPPED TOWERS, SPIRE BLOCK, SLAB ROW, MIXED SKYLINE
FACTORYSAWTOOTH MILL, STACK WORKS, TANK YARD
RESIDENTIALCOTTAGE, BUNGALOW, TWO-STOREY HOUSE, TERRACE ROW, DUPLEX, TOWNHOUSES, LOW-RISE FLATS, APARTMENT BLOCK, HIGH-RISE FLATS
COMMERCIALCORNER SHOP, HIGH STREET ROW, OFFICE BLOCK, SHOPPING CENTRE, HOTEL
INFRASTRUCTUREPOWER STATION, WATER TOWER, SUBSTATION, FIRE STATION, HOSPITAL
PARKSLAWN, WOODLAND, POND PARK, PLAYGROUND, SPORTS FIELD, PLAZA, FORMAL GARDEN

Each card says its footprint, across by along, and the recipe is held to it: the smallest is a cottage at about 9 by 11 metres, the largest a sports field at 110 by 74.

Roads

Infrastructure also offers six road pieces, after its buildings: STRAIGHT, CURVE, T-JUNCTION, CROSSROADS, ROUNDABOUT and DEAD END. A road is 12 metres wide with a dashed centre line, and it is laid over the ground rather than stood on it: every ten metres along it is set on the ground there, so it runs with the land instead of on a level, and it stands on no plinth. It is flown over and landed across as the ground it lies on.

Each piece joins at its open ends - a straight and a curve at two, a T-junction at three, a crossroads and a roundabout at four, a dead end at one. While a piece is previewed under the pointer, if one of its ends comes within 30 metres of an open end of a road already placed, the piece is moved and turned so the two meet end to end, and the preview is outlined green; a click places it there. With Shift held it is placed where it is instead. An end another road already meets is not open, so a road is joined on at the end that is free.

Insert City

Insert City, Insert asset<city>, is the tile beside Extrude. Its panel, headed INSERT CITY, is a folding section for each category - SKYLINES, FACTORY, RESIDENTIAL, COMMERCIAL, INFRASTRUCTURE and PARKS - each a grid of named cards, with Infrastructure's roads a row of their own under its buildings. Only one section is open at a time, so a phone is not scrolled past six grids to reach the one it wants; opening one shuts the other.

A card chosen is armed, and pressed. The pointer carries its footprint, outlined where a click would put it, lined up with the view to the nearest ten degrees. A click places it as the edit in hand, with its HEADING and SCALE leading the panel over ACCEPT and CANCEL; a second click moves it, facing the way it was turned, and another card chosen becomes the piece in hand where it stood. Once placed it is an object like any other: Select picks it up again, the gumball moves, turns and scales it, and Erase takes it whole. With auto accept on for drawing, the next click keeps the piece in hand and places another.

Loading assets

A pilot can load a model of their own, Load data<asset>, and it joins the insert menus. LOAD ASSET… on SAVE / LOAD reads one of these, in the page - nothing is sent anywhere:

FormatCan beNotes
.glb, .gltfplane, building, runwayColours carried, and drawn in metres, as glTF is. Either must carry its buffers and images inside it - part of the file, or written in it as data: addresses; one pointing at another file is refused, since only one file was given and nothing is fetched. The refusal is read off the file's own JSON before the model is parsed, and names the address it points at - a .gltf is that JSON, and a .glb carries the same JSON in its first chunk, so the two are held to it alike. Every address is held at while the model is read as well, which covers anything a later glTF extension points somewhere.
.objplane, building, runwayGeometry only; its colour is chosen in the step.
.stlplane, building, runwayGeometry only, and taken as drawn Z-up.
.svgbuildingA plan: its shapes are extruded up to the height the step asks for, flat-roofed. It is read as text and never put into the page, so a script inside it never runs.

A file over 25 MB is refused before it is read, and a model over 300,000 triangles once it is; each refusal says which. A model read goes to LOADED ASSET, and is shown on the canvas where the camera looks:

UseFits whenJoins
Plane3 to 90 m long, and under half as highInsert Plane's cards, flying like the plane chosen under FLIES LIKE
Buildingup to 600 m a side, and 900 m highInsert City's cards, in the section chosen
Runway600 to 5000 m long, no wider than a quarter of that, no taller than 2% of itInsert Runway's cards

ADD keeps it, and CANCEL drops it. A runway is at least 600 metres long because a runway asset is placed over a real strip of its size, and no strip is shorter.

Where they go. A loaded plane is a card on SELECT PLANE: flown, it is drawn as itself and flies with the figures of the plane it flies like. A loaded building is a card in its section, placed as an object that refers to the model rather than copying it, drawn as a box of its size until the model is read. A loaded runway is a card on Insert Runway, placed as a real strip of its length and width with the model drawn over it: the model is how it looks and the strip is how it behaves, so landing, scoring and takeoff work on it unchanged.

Where they are kept. The browser keeps loaded assets in IndexedDB, so they are there after a reload; ASSETS on SAVE / LOAD lists them, says what each is used as, and REMOVE ASSET takes the one chosen away - asking REMOVE THE ASSET first when the canvas uses it, since what uses it goes with it. A saved environment carries every asset it uses inside its assets, as base64, so the file opens on another computer; an asset is known by the SHA-256 of its bytes, so one already kept is not kept twice, and one whose bytes are not the ones its hash names is refused.

The element editor

Because an environment is a description rather than a mesh, there is nothing to re-author when a range moves: the ground is generated again from the algorithm. The panel opens the world being flown as the elements it was assembled from, one row each, and choosing an element opens the ranges it declared underneath it. A/D or ←/→ step the range under the cursor, and the ground is drawn again the moment it moves. L opens the builder, which carries these rows now: in Select with nothing picked, each element is a WORLD: section on the dock, and what is changed there is kept with what was built.

Kind of rangeRows it is drawn as
A span, such as a peak heightTwo: MIN and MAX. Neither end may be stepped past the other, because a range whose ends have swapped is a range the generator has to guess about
A single value, such as a density or a snow lineOne
A gradientTwo, LIGHT and DARK, each stepped as a percentage of the colour the preset laid it down in

A range can be typed into as well as stepped. A digit pressed at one starts the figure, the row reads it back with a _ after it, Enter takes it and the ground is drawn again, Backspace erases a character, and Esc, the mouse, walking the cursor to another row, or stepping the range with A/D gives up. Giving up on the way down the panel is what keeps RESTORE THE PRESET reachable with a figure half typed: the Enter that asks for it belongs to the panel rather than to a figure left behind two rows up. The figure is read in the units the row reads in, so 150 at a gradient end reading 150% is the shade it looks like and not a hundred and fifty times the preset's colour. A figure outside the bounds the registry declared is refused rather than clamped, and the row says what the bounds are where the reading sits. A character the figure has no room for is turned down and leaves what is already typed where it is.

A colour is stepped along its own hue rather than around the wheel: the keys lighten and darken an end of a gradient and nothing else. The gradient rule above exists precisely so no element shifts colour dramatically across the ground it covers, and an editor that let two presses undo it would be undoing the thing it is editing.

Five things bound what the panel can do:

The preset itself is never written to. What the panel holds is a copy, and what it hands out is the same list of placements the Matter API takes, generated by the same builder a preset goes through.

Environments

An assembled environment is a name, a seed, the base ground it is drawn on, and the elements placed over it. It carries no geometry: the world is generated from that description every time it is flown, which is why switching one from the settings panel takes a few tens of milliseconds and no download.

EnvironmentIs
HIGHLANDSfBm ground under scattered peaks, with snow above 300. The world the simulator has always generated, and the one a fresh install opens on
RIVER BASINA meandering river the width of the world, through low forested country
CANYON COUNTRYA branching canyon system cut into a high plateau. The only one of the five with no standing water in it
DUNE SEAWind-blown dunes and rock outcrops, cut by one desert river with palm groves along it
LAKESIDEA town on the shore of a wide lake, under forested hills and snow-capped peaks

The seed is what makes a world reproducible: the same preset lays out the same peaks, the same river, and the same streets every time, so a place worth flying back to is still there.

Five more environments are built for the game modes rather than to be chosen between, and are kept out of the settings panel because a mode brings its own ground with it: OPEN COUNTRY, low rolling ground under a wide sky with one strip cut into it; LOOP VALLEY, a shallow valley with the air over it left clear; BACK COUNTRY, rough wooded ground with no strip anywhere in it, which is what a search is flown over; CANYON REACH, a deep plateau cut end to end by canyons, for a run flown low; and SURVEY COUNTRY, town, forest, water and rock together, so a survey has things on the ground to photograph rather than places on a map. Most of them are deliberately thin - four elements each at most - because what a mode asks the pilot to read is the objective, not the scenery around it. The two newer ones are not, and for the same reason read the other way: a canyon run wants real walls beside the corridor it is judged on, and a survey wants something worth a photograph. A stage builds its preset with a seed of its own, so four stages of one mode are four worlds rather than the same one four times.

The edge of the world

There is not one. The square an environment describes is one tile of an endless grid of them, and the tiles around the aircraft are drawn out past everything the camera can see, so the ground the fog was promising is actually there. Fly at an edge and another tile is already laid beyond it. There is nothing left to reach.

Each tile is the same description of a world, seeded from its own place in the grid: the same peaks, the same rivers, and the same streets that preset lays down, arranged differently because the place is different. The tile at a given place is that ground every time it is laid, so a country worth flying back to is still there on the way back. The middle tile is the description untouched - a world laid as the middle of a grid and the same world laid on its own are the same ground - which is what keeps every stored seed, every course, and every runway exactly where it was.

The ground is drawn out 12000 units past the aircraft, which is as far as the camera is drawn at, rather than out to where the fog happens to end - the fog is a setting the pilot can turn down and the far plane is not. Tiles are laid a few at a time, one per frame, so crossing into new country costs a frame or two rather than a stall, and the tile the aircraft is actually over is always drawn before it is flown over. Ground far enough behind is released, but not the moment it goes out of reach: a tile is held a little past that, so an aircraft weaving over the line does not generate the same country again every time it crosses back.

The grid hides its joins. The base ground always ran on across one, because it is noise read off the world rather than off the tile, but what the elements drew stopped at the tile they were drawn for - a river reached the edge and the next tile's river began somewhere else. Each tile is now settled against the tiles already laid beside it as it is added, the same way an assembly settles them, against all eight of them rather than the four it shares a side with: a corner vertex is a place four tiles reach, and a tile matched along its sides alone leaves its corners open. The settling touches only the few vertices either side of each join, and only the tile being laid is new, so the ground still fills in a few tiles a frame rather than stalling to close a seam.

The Pilot API still carries a host's own terrain round at the bounds that terrain declares, because a host's world is the size the host says it is. A host whose world continues past what it declared turns the crossing off with wrap: false.

Worlds laid beside each other

A world can also be one square of a larger one. Told which square of a grid it is, an environment is generated in the world's coordinates rather than in its own: its vertices stand where its place in the grid puts them, its sampler answers for that square and nothing outside it, and because the ground is shaped from noise read off the world rather than off the square, the base ground runs on across the join instead of starting again at it.

What does not run on is what the elements drew, since a peak that ended at one square's edge knows nothing about the ground its neighbour laid against it. So the joins are settled: every place two or more squares put a vertex is brought to one height and one colour - the average of what they all had there - and each square is walked back to what it was over the next few vertices in, which closes the seam without flattening the country behind it. A vertex four squares meet at is settled against all four at once, so a corner closes as exactly as an edge does.

Each square is a whole environment - its own elements, its own strips, its own water - laid out from its own place in the grid, so neighbouring squares are the same world without being the same ground. The bundled simulator still flies one square and carries the world round at its edges; the assembly is for a host, through the Matter API.

A day, and water that moves in it

The world is not lit one way any more. A cycle in js/day-night.js carries a phase from midnight through dawn, noon, and dusk and back round, and the sky the world fades to, the fog tinted with it, the colour and strength of the sun, and the fill light under it are all read off that phase as the blend between the two moments either side of it - so a sunrise is a gradual thing rather than a switch thrown at a threshold. The sun walks an arc across the sky and is held a little over the horizon after it sets, so the ground keeps its shape after dark. Midday is exactly the light the world was drawn in before it had a day, and time the flight does not spend flying is time the day does not spend passing.

Water is the one part of the ground that moves and the one part that shines. Every vertex at or under the water line rides a swell of two wave trains crossing at an angle, and catches a sheen on the face of each crest - a colour the land is never painted, so water reads as water rather than as blue ground. The swell is held down to nothing at the bank, so the surface meets the shore it was poured against rather than lapping over it, and the sheen is scaled by how much daylight there is to throw back, so a lake goes flat and dark at night. Both are functions of where a point is in the world and what time it is, which is what lets two squares of an assembly work out the same surface at the place they meet without agreeing on anything.