Skip to content

feat(outbreak): radial E menu, a Lab setting with Today one step away - #421

Merged
kitlangton merged 2 commits into
mainfrom
outbreak-radial-interact
Oct 22, 2026
Merged

kitlangton merged 2 commits into
mainfrom
outbreak-radial-interact

Conversation

@kitlangton

Copy link
Copy Markdown
Contributor

What it does. From the Oct 21 playtest: "It should be that radial thing where you press E… and you can just click it." A tap on E still does E's own action. Holding E for 0.2 s opens a ring at the cursor with every action on the target: its tap, its hold, Shift+E and board up. Each shows its glyph, verb and number key. Pick by letting go of E over one, clicking it, or pressing its number; let go in the middle or press Esc to cancel. Lab › Controls › E actions keeps Today's tap/hold one setting away.

How it works.

  • radial/state.ts is a small state machine: idle, pending, open, spent. It's driven by the input controller and drawn by radial/view.ts.
  • While the radial owns E, the aim stays where it was at the press, nothing fires, and E's hold doesn't reach the sim. That also holds on the tick that closes it. A click that picks a wedge clears the trigger, so holding the button afterwards doesn't fire.
  • Shift+E skips the radial and takes the alternative, as Today. The ring hides on every reset, including the pause menu, which stops frames.
  • A pick is sent as Command.interactAction, which now survives the wire (netSendsAction). The sim only accepts an action the target offers. "Pry off a board" picked from the ring pries, like the hold does.

Risk. It changes how E feels for everyone, since the radial is on by default. Server-side, a chosen action not on the target is now ignored; bots only send actions their target lists. If something's wrong, you'd see a stray shot or aim snap when the ring closes, or a ring left on screen.

Proof. Ring open at a door, hovering Lock:

radial

  • scripts/radial-proof.ts in headless Metal Chromium with real keys and mouse: a tap opens the door, then holding E and releasing over Lock locks it. Errors: none.
  • check-cycles, bunx tsc --noEmit and the server tsconfig: pass.
  • bun test on radial-interact, interactions-boards, interact, input-release, bot-verbs, verbs, coop, coop-secrets, coop-environment-parity and progression: 123 pass. This includes the new radial-pry case and an un-offered action being ignored.
  • bun run build && bun ../../scripts/smoke.mjs: production smoke passed (Metal).

Playtest Oct 21 (1:45:21): "I also think the press and hold for secondary action is very... It should be that
radial thing where you press E and then it gives you the radial thing to pick what action you want to do and you can
just click it. Probably the smoothest."

On a target with more than one action, a tap still takes E's own action; holding E opens a ring at the cursor with
E's tap, its hold, Shift+E's alternative and B's board-up, drawn with the prompt glyphs and kit number caps. Point and
release, click, or press the number; release in the middle or Esc cancels. Aim holds and nothing fires while it is up.
Choices travel as Command.interactAction, so co-op carries them. Lab > Controls > E actions: Today keeps tap/hold.
…m, Shift+E skips it, server checks the chosen action
@kitlangton
kitlangton force-pushed the outbreak-radial-interact branch from 12226c0 to 2011010 Compare October 22, 2026 10:37
@kitlangton
kitlangton merged commit f148ced into main Oct 22, 2026
3 checks passed
@kitlangton
kitlangton deleted the outbreak-radial-interact branch October 22, 2026 10:41
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