Back to Pickle Rustlers
SOURCE / PINNED RELEASE

Made of little things.

Pickle Rustlers

Release
039e51f55e34…
Author-recorded commit
40608586a8a1…
License
LICENSE
Author’s source reference
nostr://npub12lm3rxsva8kfempyjkxupt09e02n3fezurkyadyqfejdc5e0r2kscqty6r/wss%3A%2F%2Fgit.napplet.soy%2F/n-bad44e7ab35

Archive hash verified: f38e99afa0992052…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

docs/gamepad-plan.md
# NAP-GAMEPAD implementation status

The first implementation is on `pr/nap-gamepad`. Verification below was recorded
on 2026-10-22; live controller support remains unverified.

## Implemented

SDK 0.30.0 (core/NAP 0.34.0) supplies the optional `gamepad` wrapper. The adapter
in `src/game/gamepad-source.ts` caches shell snapshots for the existing action
mapper. Rendering reads that cache without sending per-frame requests.

Focus, availability and connection changes reset button edges, including changes
between render frames. Held buttons are baselined on regain, reconnect and reset.
Inactive input produces no actionable releases. Page exit closes the subscription
and stops the animation loop.

`gamepad` is optional in `napplet.json`; hard requirements are unchanged. Missing,
blocked or failed controller access leaves keyboard/touch playable. There is no
native controller fallback. Slots are routed by controller index, unknown layouts
stay neutral, and controller descriptions are not treated as identities.

The existing gameplay, strongest-magnitude movement merging and standard-layout
bindings are preserved. Multiple controllers still control the same rider.

| Action | Standard controller input |
| --- | --- |
| Steer | Left stick X or D-pad left/right |
| Gallop / reverse | RT minus LT; otherwise left stick Y or D-pad up/down |
| Shoot / confirm main poster action | South face button (A / Cross) or RB |
| Lasso | West or east face button (X / Square, B / Circle), or LB |
| Pause / resume | Start / Menu |

## Verification recorded

- `pnpm verify`: 6 guidance checks and 8 controller regressions passed, plus
  TypeScript and the single-file build.
- `pnpm test:conformance`: 5 passed, 0 failed, 5 skipped. Manifest, wire and
  lifecycle evidence were not measured by the harness.
- `soyli check`: passed.
- Real soyLI preview: keyboard start/pause/resume and missing-domain fallback
  passed without page errors. The preview was stopped.

## Remaining work

- Test live SDK controller delivery, two-napplet focus isolation and physical
  hardware in a compatible host. The tested soyLI 0.29.0 did not inject `gamepad`;
  it now relies on keyboard/touch rather than the previous native reader.
- Recheck protocol status before marking the proposal ready. The reviewed draft
  is [NAP-GAMEPAD at 19de5ce1](https://github.com/napplet/naps/blob/19de5ce1cea40cd4c76089cdd8126e9f87648049/naps/NAP-GAMEPAD.md).
  [Revert PR #129](https://github.com/napplet/naps/pull/129) was open at verification.
- Controller hints and secondary victory-choice navigation need follow-up before
  claiming controller-only UI. No HUD/CSS changes were made in this pass; retain
  the existing app-owned palette and repeat responsive checks if hints are added.

Player assignment, rebinding UI and rumble are outside this migration.