kb-mouse-map · git:20260912.aa82c59 · 2026-09-12 · sha256 ddeeef188d840126

kb-mouse-map git:20260912.aa82c59A

Immutable. This exact content never changes and is served at /api/v1/blob/ddeeef188d840126.

---
name: kb-mouse-map
description: >
  Engine-neutral keyboard and mouse roles per genre. Use when binds fight
  each other, when a fighter inherits WASD+mouse-look, or when rebind
  only changes labels. Ask the genre column first. Stack on input-design.
---

# Keyboard × mouse

Ask the column. Devices have **jobs**, not favorite keys.

| Column | Keyboard job | Mouse job |
|---|---|---|
| vs-fighter | walk + attack rows + start | unused, or menu only |
| fps-look | move + jump + utility | look + fire + aim |
| orbit-third | move + verb row | orbit camera + lock optional |
| twin-stick | move (or left stick emulate) | aim independent of move |
| rts-select | camera + hotkeys + groups | select / command / box |
| point-click | modifiers + cancel | move-to and use |
| racing-steer | steer + accel + look-back | optional look, not steer |
| platform-run | run + jump + interact | unused or camera-only |
| menu-cursor | confirm / cancel / tab | pointer same as cursor |

Do not give an fps-look actor a vs-fighter numpad and a mouse-look at the same time unless the user named a hybrid.

## Jobs, not keys

Every bind is one of these jobs. Rebind changes the key. It does not change the job graph.

```
Move         translate the body
Look         rotate camera or aim
Primary      the attack / fire / confirm of the genre
Secondary    block / aim-down / interact (column picks)
Context      looked-at object (input-design few-buttons-context)
Menu         pause, inventory, map — never on Primary
```

Default *suggestions* (not iron law, always remappable):

| Job | Keyboard suggestion | Mouse suggestion |
|---|---|---|
| Move | WASD or arrows | — |
| Look | — (fps/orbit) | delta + optional hold-to-orbit |
| Primary | J / Space / LMB | LMB in fps / rts / point-click |
| Secondary | K / Shift / RMB | RMB |
| Context | E / F | extra button |
| Menu | Esc / Tab | — |

vs-fighter attack row is a **grid**, not WASD: one axis walk, the other axis punches/kicks or two rows of buttons. WASD as both walk and camera is illegal on this column.

## Genre rules

**vs-fighter**
- Keyboard emulates a stick + 4 or 6 attack keys. Mouse does not aim punches.
- Hold-back is block. Down is crouch. These are directions, not extra mouse chords.

**fps-look**
- Mouse owns yaw/pitch. Keyboard owns translation.
- Fire on a keyboard key is allowed; look on a keyboard key is a last-resort accessibility column.
- Sensitivity and accel are feel sliders. They are not a second combat clock.

**orbit-third**
- Mouse orbits. Keyboard moves relative to camera yaw.
- Lock-on is a toggle job. While locked, mouse may orbit the lock, not free-look the world.
- Click-to-attack is optional; default is a keyboard/pad verb.

**twin-stick**
- Move and aim never share one stick or one WASD cluster.
- Mouse aim is the desktop filling of the right stick.

**rts-select / point-click**
- Select and command live on the mouse. Keyboard is chords and camera.
- Drag box must not start if the cursor began on a dragging UI slider.

**racing-steer**
- Steer is analog or held keys. Mouse-steer is a novelty column, default off.
- Look-back is a hold, not a toggle that strands the camera.

## Iron rules

- Publish a remap screen. Glyphs follow the last used device.
- Confirm and Cancel are never the same key.
- Jump and Primary may share a key only on platform-run, never on vs-fighter or fps-look.
- Left-handed and one-hand columns remake the *layout*, not the jobs.
- Pad and keyboard must expose the same jobs. Missing jobs on one device is a bug.
- Do not copy a commercial default layout as the only legal map.

## Accept

A player can name which device looks and which device moves. Rebind Primary and the character still attacks on that job. Switching to pad mid-session does not invent a new verb. A vs-fighter on keyboard can walk and block without touching the mouse.