gvc_hud
The Gumdrop Vale heads-up display: the widget tree, and nothing else.
gvc_hud
The Gumdrop Vale heads-up display: the widget tree, and nothing else.
M.build(v) takes a view-model and returns a tree. It is pure — it reads no
global state and touches no entity — so the driver can push it at any cadence
and any state can be rendered without a running game. M.blankView() returns
that view-model with every field at rest; the driver overlays live values on a
copy, so a missing field can never nil-index the builder.
The four panels
- BUBBLE, top left — one pip per mote needed. A filled pip is a lit gumdrop; the pip that just landed swells inside a fixed-size box so its neighbours do not move. At full charge the panel grows a breathing "RELEASE AT A WELL" badge.
- THE HUSH, top centre — time remaining as a draining bar. Mint while there
is room, pink under 45%, hot magenta and breathing under 22%, and a
+45sbadge rises out of the bottom of the meter on each bloom. - BLOSSOM WELLS, top right — the count and the five names from
GV.WELLS. Bloomed wells get a warm dot and full-strength type; the nearest un-bloomed one gets a breathing accent row. - NEAREST WELL, bottom centre — a compass whose needle rotation is baked into the SVG (0° is dead ahead), plus the well's name and distance.
Over the world sit a marker per un-bloomed well; the nearest one carries a name plate, the rest are chips clamped to the screen edge.
Colour
Every colour is derived from GV.PALETTE at load, so retuning the game retunes
the HUD. UI_CREAM panels, UI_INK type, MOTE/WELL_WARM accents.
Motion
There is none in the tree. Every pulse, pop and fade is a number the driver
hands over (pipPop, readyPulse, reprievePulse, flash, t) and the tree
paints that instant. A CSS animation restarts whenever its node is re-pushed,
and this screen is re-pushed many times a second, so declared motion would sit
frozen at its first keyframe.
Scoped to this part · feeds back into the world's score.