Skip to content

feat(pool): Hold works in Droplets — each ripple leaves its colour behind - #129

Merged
pyramation merged 1 commit into
mainfrom
feat/pool-hold-droplets
Sep 15, 2026
Merged

pyramation merged 1 commit into
mainfrom
feat/pool-hold-droplets

Conversation

@pyramation

Copy link
Copy Markdown
Contributor

Summary

Follow-up to #128, addressing the reviewer finding that Hold was inert in Droplets mode: rings always grow, thin and get culled at ring >= 1.6 regardless of hold, so the toggle promised something it didn't do.

Rather than hiding the toggle, Hold now means something in Droplets: a droplet is a ring that ripples out and, when holding, a puddle that stays behind.

private drop(x, y, color) {
  this.deposit(x, y, 0, 0, color, 'ring');
  if (this.settings.hold === true) this.deposit(x, y, 0, 0, color, 'blob');
}

Both droplet deposit sites (pointerDown, drag beats in step) go through drop(). The blob goes through the existing hold path, so re-dropping on the same spot recolours the puddle instead of stacking sources. Fade mode is unchanged (no blob).

UI: the Feel hint reads "Ripples still travel out, but each leaves its colour behind." when Hold + Droplets.

Test: hold + droplets keeps the centre cannon lit in the touch colour 40s later with exactly one source left; fade + droplets goes to black.

Link to Devin session: https://app.devin.ai/sessions/c4872c2982734093bdee80d04a7d5ceb
Open in Devin Desktop: https://app.devin.ai/desktop/session/c4872c2982734093bdee80d04a7d5ceb?variant=devin
Requested by: @pyramation

@devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@tenki-reviewer

tenki-reviewer Bot commented Sep 15, 2026

Copy link
Copy Markdown

Review complete. No issues found — approved ✅.


This PR reworks how the light-field pool deposits a source: a new drop() path creates a ripple ring at the touch and, in hold mode, adds a blob, while deposit() gains position-blended sampling and energy-aware MAX_SOURCES eviction. The UI pool-tab.tsx is refactored for mode/hold interaction, and coverage is added in pool-field.test.ts.

Files Change
packages/pool/src/pool-field.ts Introduces ring/blob drop(), position-blended deposit(), tightened source eviction, and updated sampleAt() energy summation for held strokes.
packages/pool/__tests__/pool-field.test.ts Adds unit tests for the new hold/droplet deposition and eviction behavior.
packages/ui/src/components/pool-tab.tsx Refactors mode/hold control wiring and help text to match the simulator's ring/blob semantics.

Note: the sweep sub-scan did not publish; adjudication relied on the other reviewers. Two candidate concerns (held-droplet double energy stackup at the touch and ring eviction under the 240-source cap) were verified but judged below the flagging confidence threshold, so this review closes as approve.

Reviewed commit: 676cd46

@pyramation
pyramation merged commit af21290 into main Sep 15, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant