# Pip's Arcade — Keyboard Controls Reference

**Audience:** District accessibility coordinators, special education teachers, and assistive technology trainers.
**Last updated:** April 27, 2026
**Companion to:** [`vpat-2.4-arcade.md`](./vpat-2.4-arcade.md)

This one-pager lists every keyboard input the Pip's Arcade student game suite responds to. It is generated by reviewing the actual `keydown` handlers in source — every entry below cites the file and line range that implements it. Use this when supporting students who navigate without a mouse, when training paraprofessionals, or when answering procurement questionnaires.

---

## Universal browser controls (every arcade screen)

These are standard browser interactions provided by the platform — no per-game code is required and they work on every page.

| Key | Action |
|---|---|
| `Tab` | Move focus to the next interactive element (button, link, input). |
| `Shift` + `Tab` | Move focus to the previous interactive element. |
| `Enter` *or* `Space` | Activate the focused button or link. |
| `Esc` | Close the topmost modal dialog or popover *(provided by the dialog primitive)*. |

> **Screen reader note:** All Arcade buttons expose accessible names and live-region updates for game state changes. Tested with VoiceOver (macOS Sonoma 14.4) and NVDA (2024.1) per `screen-reader-test-script-2026-04.md`.

---

## Game-specific keyboard handlers

The games below register custom `keydown` listeners in addition to the universal browser controls.

### Pip's Quest — `/arcade/quest`
Tile-based dungeon crawler with grid movement.

| Key | Action |
|---|---|
| `Arrow ↑` *or* `W` | Move party north. |
| `Arrow ↓` *or* `S` | Move party south. |
| `Arrow ←` *or* `A` | Move party west. |
| `Arrow →` *or* `D` | Move party east. |

Movement is automatically suspended while a combat encounter dialog is open — answer the academic question first, then movement re-enables.

*Implementation:* `artifacts/classroom/src/pages/arcade/quest.tsx` lines 488–509.

### Pip's Railroad — `/arcade/railroad`
Fullscreen US-map state-capital review game.

| Key | Action |
|---|---|
| `Esc` | Exit fullscreen mode. |
| `Esc` | Close the active modal (Licenses, Hall of Fame, Propose Contract). |

State selection on the map uses the universal `Tab` + `Enter` flow — there is no dedicated map-navigation key binding in code.

*Implementation:* `artifacts/classroom/src/pages/arcade/railroad.tsx` lines 258–262 (fullscreen) and 1701–1704 (modal close).

### Escape Room — student join page (`/join/escape-room/:code`)
Student-device puzzle answering during a teacher-led Escape Room session.

| Key | Action |
|---|---|
| `A` | Submit option 1 of the current multiple-choice puzzle. |
| `B` | Submit option 2 of the current multiple-choice puzzle. |
| `C` | Submit option 3 of the current multiple-choice puzzle. |
| `D` | Submit option 4 of the current multiple-choice puzzle. |

Active only during the puzzle-answering phase, and only when an answer hasn't already been selected and no unlock animation is playing.

*Implementation:* `artifacts/classroom/src/pages/join/escape-room.tsx` lines 327–341.

---

## Games without bespoke keyboard handlers

These games rely entirely on the universal `Tab` / `Enter` / `Space` / `Esc` flow described above. There are no game-specific key bindings in source — every interaction is reachable through standard button focus.

| Game | File audited |
|---|---|
| Pocket Owl | `artifacts/classroom/src/pages/arcade/pocket-owl.tsx` |
| Jeopardy (teacher view) | `artifacts/classroom/src/pages/jeopardy/{game,board-3d,cinematic-3d}.tsx` |
| Boss Battle | `artifacts/classroom/src/pages/boss-battle/{play,display}.tsx` |
| Two-Minute Drill | `artifacts/classroom/src/pages/two-minute-drill/game.tsx` |
| Horse Racing | `artifacts/classroom/src/pages/horse-racing/game.tsx` |
| Capture the Flag | `artifacts/classroom/src/pages/capture-flag/index.tsx` |
| Survivor | `artifacts/classroom/src/pages/survivor/game.tsx` |
| Escape Room (teacher view) | `artifacts/classroom/src/pages/escape-room/game.tsx` |

> **Vestibular safety:** Set `prefers-reduced-motion: reduce` in OS settings; animated games (Horse Racing track, Survivor cinematics, etc.) respect this and switch to reduced-motion rendering.

> **Known gap (tracked):** Jeopardy's 3D board does not yet expose column-by-column spatial focus traversal in all browsers. A keyboard-only path through every clue exists via `Tab`, but a more game-like cell navigation is still being implemented. Target: Q3 2026. See `vpat-2.4-arcade.md` row "2.1.1 Keyboard."

---

## When a student cannot use a mouse at all

For students who navigate exclusively with a keyboard or switch-access device:

1. **Start at any `/arcade/*` URL** — every game can be entered, played to completion, and exited using only the keys documented above.
2. **Use `Tab` as the primary input** — every interactive element is in the focus order. There are no mouse-only controls.
3. **Watch for the focus ring** — focused elements get a 2px violet outline. If the focus ring is hard to see, increase OS contrast settings (high-contrast mode is supported).
4. **Modal dialogs trap focus** — when a question or puzzle opens, `Tab` cycles within the dialog and `Esc` closes it.

If a student needs a workflow we haven't covered, contact `info@mywiseboardclassroom.com`.

---

## How this list is kept honest

Every "Game-specific" entry in this document cites the source file and line range that implements it. Whenever a new `keydown` handler is added to an in-game surface, this document and the matching VPAT row in `vpat-2.4-arcade.md` are updated together as part of the same PR.

To re-verify the inventory, run the command below. It scopes only to **in-game** files (`game.tsx`, `play.tsx`, `display.tsx`, plus the Quest, Railroad, Pocket Owl, and Capture-the-Flag surfaces that are single-file games, plus the student-device join page for Escape Room). It deliberately excludes setup/lobby pages (`index.tsx` for Horse Racing, etc.) where keyboard input is just normal form behavior on text inputs (e.g. `Enter` to submit a "New Race Setup" title) and not a gameplay control.

```bash
rg -n 'addEventListener\("keydown"|onKeyDown=' \
  artifacts/classroom/src/pages/arcade/quest.tsx \
  artifacts/classroom/src/pages/arcade/railroad.tsx \
  artifacts/classroom/src/pages/arcade/pocket-owl.tsx \
  artifacts/classroom/src/pages/jeopardy/game.tsx \
  artifacts/classroom/src/pages/jeopardy/board-3d.tsx \
  artifacts/classroom/src/pages/jeopardy/cinematic-3d.tsx \
  artifacts/classroom/src/pages/boss-battle/play.tsx \
  artifacts/classroom/src/pages/boss-battle/display.tsx \
  artifacts/classroom/src/pages/escape-room/game.tsx \
  artifacts/classroom/src/pages/two-minute-drill/game.tsx \
  artifacts/classroom/src/pages/horse-racing/game.tsx \
  artifacts/classroom/src/pages/capture-flag/index.tsx \
  artifacts/classroom/src/pages/survivor/game.tsx \
  artifacts/classroom/src/pages/survivor/tribal-3d.tsx \
  artifacts/classroom/src/pages/survivor/cinematic-3d.tsx \
  artifacts/classroom/src/pages/join/escape-room.tsx
```

If that command returns any lines this document does not describe, the document is stale and needs updating before the next release.

**As of April 26, 2026** the command returns exactly the three handlers documented above (Quest movement, Railroad two Esc handlers, Escape-Room Join A/B/C/D answer shortcuts) — no more, no fewer.
