116 lines
6.2 KiB
Markdown
116 lines
6.2 KiB
Markdown
# 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
|
||
|
||
13. **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)
|
||
|
||
1. Storm JSON: `hail` block — 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).
|
||
2. `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).
|
||
3. Garden damage feed: `sky.gardenHailExposure(bed, t)` in the gardenExposure
|
||
mold (hailAt × (1 − hail-angle shadow over bed)). A wires the drain.
|
||
4. 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.
|
||
5. 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)
|
||
|
||
1. **Ponding v1** — your reverted prototype + C's landed data (`rainMmPerHour`,
|
||
`RAIN_TIME_COMPRESSION` exported 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.
|
||
2. **`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.
|
||
3. `session.reset()` (A's ask — they're reaching into your state machine to
|
||
fake it). Small.
|
||
4. 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)
|
||
|
||
1. 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's
|
||
`drainPondAt()` → water dumps ON YOU (knock/stagger if the pond is big —
|
||
your knockdown machinery, the comedy is the point), sail springs back.
|
||
2. 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.
|
||
3. 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
|
||
|
||
1. 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.
|
||
2. Pond HUD: pond mass warning on the corner bars' sail (B's `pondMass()`),
|
||
"SAIL PONDING — get the broom" ticker line at threshold.
|
||
3. Take D's greyed-prompt surface into hud.js (they provide label + reason).
|
||
4. Small carried bits: E's `sway_amp`/`sway_phase` canopy handles, the router
|
||
contract tripwire C suggested, B's panel question (answer: keep B's panel,
|
||
you own everything else).
|
||
5. 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)
|
||
|
||
1. Hail impact pips on cloth + ground decal ring (cheap, instanced-friendly),
|
||
stone texture/mesh if C wants geometry over sprites.
|
||
2. Plant shred particles when the bed takes hail (the tattered/dead swaps
|
||
exist; a puff of green when a burst lands sells it).
|
||
3. 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.
|