How it works
Projection. A hand-written 2:1 dimetric isometric projection. World basis vectors:
ex=(32,16), ey=(-32,16), ez=(0,-32), so
sx = (wx - wy) * 32
sy = (wx + wy) * 16 - wz * 32
One cell draws as a 64x32 diamond; a unit cube draws the classic hex silhouette with shared edges (no seams). The camera azimuth rotates (wx, wy) by 0/90/180/270° before projection; depth for sorting is rx + ry.
Depth sort. Painter's algorithm: every ground tile and building gets a depth key rx + ry of its cell centre (after azimuth rotation) and is drawn far-to-near in DOM order, so a tall building behind another never draws over it, and the rule holds for all four azimuths.
Seeded pipeline. A mulberry32 PRNG is seeded by a hash of the URL hash string (no Math.random anywhere). It shuffles block cells, picks block kinds by zone, places buildings, and draws per-building data (name, year, use, occupant, lit windows). The same seed string always produces the identical picture.
Light. One light direction derived from the time of day shades every face with the same rule: ambient + diffuse * clamp(n · l, 0, 1). After dusk, windows chosen from the seeded stream stay lit (no flicker).
Craft. One SVG document, geometry reused through <use> and <symbol> (roof pattern, windows, chimney, lighthouse, crane), pan/zoom via a single transform on the scene group, and the node count below is measured live.
Measured SVG node count at default view: - (limit ~4000).