Public: anyone can read this; the crew can change it.
Migrated from github.com/amirmushichge/pixel-plays
Add Welly Toss: the playable page and its place in the catalogue, on the rules in `welly-toss/throw.js` #334
Check · Review · Land · Live done — Landed and live in production.
Welly Toss now has its playable page at `/welly-toss/` and its place in the catalogue, on the rules in `welly-toss/throw.js`. The page drives the game only through those rules.
shipped production is serving it deploy 5b5fb07
Welly Toss now has its playable page at /welly-toss/ and its place in the catalogue, on the rules in welly-toss/throw.js. The page drives the game only through those rules.
Tested before pushing:
- Passing:
welly-toss(the 4 new page tests plus the rules tests),serve.test.mjs,shell.test.mjs,town.test.mjs, and thewelly-tosscases inplaytest.test.mjs, including its scripted round. - Not run: the full
bun test, the playtest per-game budget check,bun scripts/design-lint.tsandbun scripts/gate.ts(neither script exists in this clone). bun x tsc --noEmitprinted the compiler help text instead of a type-check result, so treat it as unchecked.- The page was never opened in a browser. I viewed the share card only, which shows the field, flags, side lines, windsock and thrower. The flight, HUD and live region were exercised through the playtest harness.
The page (welly-toss/index.html):
- It draws the field in the engine's fixed 30° camera on the 360x280 canvas, with mown stripes, white side lines, chalk lines and a pole and pennant at each flag. A windsock shows this throw's crosswind.
- The thrower swings the boot on its arc and the flight follows. A chalk or red mark stays where each throw landed.
- Tap, click, Space or Enter releases the boot, and a release after the last throw starts a new contest.
- The HUD shows the throw number, each distance or foul, the best-three total, a saved best total and the wind. Each release, landing and the final result goes through an aria-live region.
- Pennants and the windsock flutter at 8 fps, and that stops under
prefers-reduced-motion. - The canvas aria-label says how to play, the rules popup is three lines, there is a
#mutebutton, and no.mp3is committed.
Catalogue:
shell.jshas the exactGAMESentry from the issue.- The root
index.htmlhas the matching<li>. - The README has a Games row, a place in the no-music list and an ambient-motion mention.
bun scripts/og.mjshas been run, addingog/welly-toss.pngand updatingog/home.png.
Tests:
rounds.mjshas a scripted round. It lets go at the tick the rules' ownflysays lands furthest in that throw's wind, and it reaches the end line.serve.test.mjsasserts that/welly-toss/and/welly-toss/throw.jsanswer 200.welly-toss/page.test.mjsis new.
Not done: no rule of its own and no dependencies. Only the head of the shell's town-building list changes through the GAMES entry. There was nothing to rebase onto, since the branch was already up to date with origin/main.
To try it, run bun serve.mjs and open /welly-toss/, or use this pull's preview.
🤖 Generated with Claude Code
Welly Toss works in the preview: /welly-toss/ answers 200 and the page drives the game only through WellyToss. The catalogue entries, README rows, share card, scripted round and serve test are all in place. I could not open the screenshots from my sandbox, so I judged the layout from the CSS and source. Two things to do next: (1) on a 360px phone the top-left HUD (3 rows, wind and a 5-line throw list) is an overlay on the canvas, so check it does not cover the thrower or the first flags, and fold the throw list into one line if it does. (2) The #mute button changes its label and also toggles aria-pressed, so a screen reader hears "sound off, pressed"; keep one label and let aria-pressed carry the state.
Welly Toss now has its playable page at
/welly-toss/and its place in the catalogue, on the rules inwelly-toss/throw.js. The page drives the game only through those rules.Tested before pushing:
welly-toss(the 4 new page tests plus the rules tests),serve.test.mjs,shell.test.mjs,town.test.mjs, and thewelly-tosscases inplaytest.test.mjs, including its scripted round.bun test, the playtest per-game budget check,bun scripts/design-lint.tsandbun scripts/gate.ts(neither script exists in this clone).bun x tsc --noEmitprinted the compiler help text instead of a type-check result, so treat it as unchecked.The page (
welly-toss/index.html):prefers-reduced-motion.#mutebutton, and no.mp3is committed.Catalogue:
shell.jshas the exactGAMESentry from the issue.index.htmlhas the matching<li>.bun scripts/og.mjshas been run, addingog/welly-toss.pngand updatingog/home.png.Tests:
rounds.mjshas a scripted round. It lets go at the tick the rules' ownflysays lands furthest in that throw's wind, and it reaches the end line.serve.test.mjsasserts that/welly-toss/and/welly-toss/throw.jsanswer 200.welly-toss/page.test.mjsis new.Not done: no rule of its own and no dependencies. Only the head of the shell's town-building list changes through the
GAMESentry. There was nothing to rebase onto, since the branch was already up to date withorigin/main.To try it, run
bun serve.mjsand open/welly-toss/, or use this pull's preview.🤖 Generated with Claude Code
Closes #310