← Development journal

/ 4 min read

The water finds its way

2026-11-01. Water increment 1: hydrology in the world generator.

Until today the river was a drawn line: fourteen points with a surface height each, and the bed cut to those heights whatever the land did underneath. Measured on the Lowwater world, more than half of its length ran on a causeway up to 14 m above the ground beside it, the high lake floated 20 m over its own shore, the dry channel climbed over the start mesa, and nothing flowed. The fix was not better numbers in the list. It was to stop drawing water.

Now the author shapes land and geology, and the generator does what water does. world.json lost its water section and gained a grade (the valley rises 6 m per kilometre to the north), basins where the author wants a hollow, a climate (rain and runoff per region, snow above 240 m) and a sink: the Narrows, the band of permeable ground across the valley where the river goes under. From that, tools/worldgen/hydro.py fills every hollow to its spill (a priority flood from the south edge; the other edges are walls, so land that wants to leak sideways pools and shows on the sheet), routes every cell downhill, adds the runoff up, and traces the channels into reaches. Each reach is sized by hydraulic geometry from the water that cut it, its bed cut into the lowest land across its own width and walked downstream so it never climbs, its surface the bed plus the depth of the water in it now, so a floating or buried river cannot be written. Hollows that live water reaches are lakes at their spill height; the rest are dry pans. Where the slope or the speed says so a point is rapids; where the land steps, a fall; below the Narrows the channel runs on, carved to the width of the water that made it, with nothing in it.

before: the drawn river after: the derived one
the sheet before the sheet after

What the land gave on the first round, after a grade, two valley rims and a highland along the north edge: the river rises in the highland and the high lake at 305 m, runs through the long lake (192 m, 1.7 km²) and Cael's lakes down the valley, enters the Narrows band at 54 m³/s and leaves it dry; the dry channel runs through the Ashfold past the drawpoint and the start mesa to the south edge; every hollow in the Ashfold is a pan; nothing leaves the world live. The first drafts were instructive: with no grade the authored terraces filled wall to wall with lakes, and a sink only in the ridges' gap let the March's flank streams run round it into the Ashfold.

The game draws the surface the generator derived, as the same flat placeholder, now in its bed: a ribbon per live reach with a skirt that meets the bank under the ground, lakes as a grid of their cells. The look is the next increment; this one is about the land being right.

the river from 45 m up: the surface lying in its carved bed, the banks lit by the low sun

Cael's river from 45 m straight up (FlyEV=3 to see it at dusk): 28 m wide and 1.6 m deep by the hydraulic geometry, its bed cut below the lowest land across its banks and the surface noise the tiles add, so the channel lies in shadow with the placeholder surface at its bottom and the banks catching the sun. The edges step at the 16 m hydrology cell; the next increment smooths the centreline.

the opening, after (t = 7.0 s) the start, looking north (vantage board round 2026-11-01-3)
the opening after start looking north

The look gate's board (art/world/lowwater/gate/board.html) and the vantage board (boards/2026-11-01-3.html, after the review fixes; 2026-11-01-2 is the round before them) are the record for this round. The behaviour traces all differ, as the ground under the ride changed with the channel; they are re-recorded once the gate board is judged.

Lowwater is in development. These notes capture the game at the time of writing; plans and visuals may change.

More from the making of Lowwater.

Follow along ↗