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.
# 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.
