Adding a Terrain
Terrain is the most load-bearing type in the project, because terrain is how you shape a region. There are no doors in Tesserae; where a traveller can go is decided entirely by what the ground is.
The fields that matter
passable is the important one. false makes the tile a wall — all six of its edges, without any per-tile authoring. This is your primary tool for routing, and it is why @Missing file and @Missing file exist.
moveCost (1–5) makes ground slow without making it impossible. Reach for this before you reach for impassability; a region where every obstacle is a wall is a maze, and a maze is not a landscape.
variants holds up to four interchangeable pictures of the same terrain. A tile picks one by index. Because nothing has to line up across an edge, any variant is valid on any tile — which is the whole reason the hex conversion was cheap. See Drawing the Map.
ambience is GM-facing sensory detail for standing on this ground. The register instruction pulls from it, so write materials rather than moods: what the footing is, what it smells like, what sound it makes.
allowsCreature and allowsDiscovery gate what a builder may place here. yields names raw resources for the settlement layer.
Writing a good one
Give it a reason to be crossed and a reason to be avoided. @Missing file costs 3 and is unpleasant, and it is also the only place certain things grow — that tension is the terrain doing its job. Ground that is purely bad is ground players route around and never think about again.
Keep the impassable set small. Two out of six is about right; the Kettle has thirteen walkable tiles out of nineteen and already feels shaped.
The rule you must not break
Never add impassable terrain without checking reachability. It is entirely possible to wall off a walkable tile so that nothing can ever stand on it, and the player will find it as a hex they can see and never reach.
The region checker catches exactly this, and it is the reason it exists:
node check-region.js "Regions/The Kettle.region.json"
It renders the board as ASCII and flags any passable tile with no route from the entry. An impassable tile being unreachable is correct and expected. A walkable one is a bug.