# HL
The shared spine of *Helsinki Life*: constants, the board graph (43 tiles with
positions, kinds, districts and successors), landmark anchors, camera framing
numbers, the game state container, the event bus the slices talk over, the
`HL.actions` table the rules fill in, the pacing (`HL.TIMING`) and the sound
names (`HL.SFX`).
```lua
local HL = require("game.core.HL")
HL.tile(6).next -- { 7, 101 }: the fork at Pasila station
HL.pawnSlot(22, 2) -- where pawn 2 stands on the Cathedral tile
HL.on("moveStep", function(ev) ... end)
HL.emit("sfx", { name = "hop" })
HL.state().players[1].money
```
# shape
Where Helsinki is, on this board. Answers the geography the diorama is
generated from and holds no geometry itself.
- `coast(z)` the west and east shore x, tapering to the south tip
- `bayDepth(x, z)` how deep into Töölönlahti a point is
- `onLand(x, z)`, `onIsland(x, z, margin)`, `seaDepth(x, z)`
- `ground(x, z)` / `water(x, z)` the colour of the surface at a point
- `swell(x, z)` the low facets of the water
- `islandOutline(inset)` Suomenlinna's rim
- `GREENS`, `AVENUES`, `CROSS_Z` the parks and the street grid
- `tileDistance`, `landmarkDistance`, `streetDistance`, `parkStrength` — the
clearances every placement is filtered through
Consumed by `game.board.terrain`, `game.board.path` and `game.board.city`.
# geo
The mesh builder the Helsinki diorama is modelled with. Accumulates triangles
with a colour per vertex into one buffer and returns a runtime mesh, so a whole
district draws as a single object.
```luau
local Geo = require("game.board.geo")
local b = Geo.new()
b:box(0, 0.5, 0, 2, 1, 2, "#f4efe4", "#d8cbb8")
local handle = b:build()
```
Primitives: `vertex` / `tri` (raw), `face`, `quad`, `slab`, `plate`, `box`,
`prism`, `disc`, `tube`, `ring`, `ribbon`. Colours are CSS hex strings,
converted to linear light on the way in; `hex`, `mix`, `shade` and `shadeHex`
work with them. `ellipse` makes an outline, `rng` a seeded generator.
Every face helper takes an outward direction and reverses the triangle when the
winding disagrees with it, so a face is stated by where it looks.
Consumed by `game.board.terrain`, `game.board.path`, `game.board.city` and
`game.board.Board`.