6.2 KiB
SPRINT 5 — HAIL & THE BROOM (instructions for Opus 4.8 lanes)
Sprint 4 verdict: the game has a face and the longest argument in the repo is closed — B conceded decision 11 with numbers and a post-mortem, storm_02 runs downdraftOfTotal 0.45, the ladder loop landed whole, and you can play a round start to finish with a mouse. The face immediately earned its keep by exposing the real problem: a PERFECT rig scores 54% garden vs 48% for not turning up. The sail cannot be scored on rain, because C's weather is honest: driving rain walks under a sail. Sprint 5 makes the garden score mean something (hail), and ships the water arc DESIGN.md promised (ponding + the broom).
Read THREADS from the last [I] entry. Standing items you can rely on: the wind router now passes rainMmPerHour/rainDepthMm; C's ponding data is calibrated to B's arithmetic (storm_02 = 3.12 kN/corner of water on a flat 25 m² rig, exactly the kill number); E's pond/broom assets are on disk with recipes.
Decision
- Hail carries storm garden damage; rain demotes to a small drain. Hailstones are dense and fall fast and steep — overhead cloth blocks them even in wind, so the garden score becomes rig-responsive WITHOUT faking the rain physics. This is also canon: DESIGN.md always said hail shreds gardens and drainage (future content) answers rain. Aftermath keeps garden % as a headline but it must now respond: target ≥2× garden damage for no-sail vs a good rig in a hail-bearing storm, stated as an assert.
Lane C — hail (the sprint's new system)
- Storm JSON:
hailblock — bursts (timed like gust events, the big ones arriving WITH gusts for maximum drama), stone intensity/size scalar, validator. storm_02 gets a proper hail burst at the change; storm_03 a mild one; storm_01 none. Determinism rules as ever (own stream or zero draws). hailAt(t)intensity + a fall vector that's STEEP (slight wind lean only — stones are dense; ~15-20° max off vertical at gale speeds, cite the number in a comment so nobody re-litigates rain-angle here).- Garden damage feed:
sky.gardenHailExposure(bed, t)in the gardenExposure mold (hailAt × (1 − hail-angle shadow over bed)). A wires the drain. - Audio + visuals: hail layer (on cloth = drum, on ground = clatter — the cloth drum IS the "my sail is earning its money" sound), instanced stones or impact pips, your call on cost. Lightning already lands on big gusts.
- Assert per decision 13: no-sail garden damage ≥2× good-rig damage in storm_02, using B's SailRig over your hail feed.
Lane B — the water arc, finish it (carried twice, now everything waits on you)
- Ponding v1 — your reverted prototype + C's landed data (
rainMmPerHour,RAIN_TIME_COMPRESSIONexported so nobody hardcodes 40 twice): accumulation × per-node flatness → node water mass → weight in step();pondMass()and per-pond centroid for HUD/visuals; dump on corner break and on tension change that tips the belly. Asserts: hypar pools ~nothing; a flat rig DIES of water alone in storm_02; storm_01 cannot hurt anyone; mass conserves until dumped. drainPondAt(node)API for Lane D's broom — poke transfers/dumps water locally over ~1.5 s. Coordinate the shape with D in THREADS early — the broom is this sprint's gate and you two meet in the middle.session.reset()(A's ask — they're reaching into your state machine to fake it). Small.- Stability clamp for the tn-1.04 cliff (carried; if it moves §7 numbers, post before landing).
Lane D — the broom (DESIGN.md's funniest correct mechanic)
- Broom loop: take broom from shed wall (E's
broom_01,grip_anchor, carry_type broom — hands-full rules vs spare/ladder apply), walk under the belly, hold-E poke (reuse Crank/Dig per E's anim_hint) → B'sdrainPondAt()→ water dumps ON YOU (knock/stagger if the pond is big — your knockdown machinery, the comedy is the point), sail springs back. - Surface unusable prompts greyed with reasons (your offer + A's HUD hook — "hands full", "out of reach — needs the ladder"). Kills the vanishing-prompt confusion you logged.
- Feel pass on the full loop with hail + ponding live; log notes. You're still the only lane that plays like a player.
Lane A — score truth & polish
- Wire decision 13: garden drain = hail exposure (C's helper) + small rain drain; aftermath keeps garden % headline + adds "hail blocked" line; verdicts re-tuned so the words track the new numbers.
- Pond HUD: pond mass warning on the corner bars' sail (B's
pondMass()), "SAIL PONDING — get the broom" ticker line at threshold. - Take D's greyed-prompt surface into hud.js (they provide label + reason).
- Small carried bits: E's
sway_amp/sway_phasecanopy handles, the router contract tripwire C suggested, B's panel question (answer: keep B's panel, you own everything else). - Shepherd as always; keep the assembled game at 60 fps with hail + rain + ponding all live (you have ~16 ms of headroom; spend some, keep most).
Lane E — hail & water juice (small)
- Hail impact pips on cloth + ground decal ring (cheap, instanced-friendly), stone texture/mesh if C wants geometry over sprites.
- Plant shred particles when the bed takes hail (the tattered/dead swaps exist; a puff of green when a burst lands sells it).
- Contact-sheet refresh with the dressed night yard + a daylight one for DESIGN.md (carried).
Gates
gate 1: ponding kills a flat rig in storm_02 (assert + by hand),
and the broom SAVES it (by hand, water dumped on the player's head)
gate 2: decision-13 assert green — rigging visibly matters to the garden
gate 3: full round where EVERY aftermath line responds to a player choice
(garden ← hail shadow, corners ← rigging, hardware ← breaks/repairs,
collateral ← gnome/fence, budget ← shop) — played, screenshotted
Definition of done = gate 3. After this, systems are DONE — Sprint 6 is content: sites, jobs, money across rounds, the landscaper campaign.
For John
- A left you a cue in THREADS and it stands: play a round
(
python3 server.py, pick WILD NIGHT), then write three sentences in THREADS about what felt wrong. Sprint 6's shape depends on them.