Files
RP412/docs/CONTROLS.md
T
Cyd d35af59136 The joystick wizard works out the shape of your pedals
You are never asked what you own. Two controls cannot simply be watched,
so they are asked for differently.

Yaw is asked for twice, right then left, and which axis answers is the
measurement. The same axis both times is one control covering both
directions - a twist grip, a rudder bar, pedals the driver has already
mixed - and binds to the signed Pedals axis. Two different axes are two
real pedals, one per foot, which is what the pod had, so they bind to the
pod's own LeftPedal/RightPedal pair and the game does the mixing: both at
once then does what both at once did in the pod.

The throttle is zeroed first. A lever sits wherever it was last left,
possibly hard against the stop that reads +1, so watching it move says
nothing about which end means power. Close it, press SPACE, then open it,
and the direction it travels from a known idle is the direction that
means throttle.

CONTROLS.md, the handbook and the packaged README say all of this, and
joyconfig.bat's own header no longer promises "rudder-pedal setup" when
racing pedals work too.
2026-08-07 16:31:40 -05:00

260 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Red Planet 4.12 — controls map
Generated from the default `bindings.txt` (the file the game writes
beside the exe on first run). Everything here is rebindable: edit that
file and restart, or delete it to get these defaults back.
Grammar reminder, from the file's own header:
```
key <name> button <addr> [toggle]
key <name> axis <axis> deflect <n> # held, springs back
key <name> axis <axis> rate <n> # walks per second, sticks
pad <button> button <addr> [toggle]
padaxis <src> axis <axis> [invert] [deadzone <d>] [rate <n>]
```
---
## Xbox controller
```
( LB ) Panic Throttle / reverse ( RB )
( LT ) Left pedal Right pedal ( RT )
______________________________________________________
/ \
/ [Back] [Start] \
| unbound unbound |
| |
| ,--. (Y) |
| ( L ) stick X / Y Upper |
| `--' (X) (B) |
| +---+ Pinky Middle |
| D-pad --> |hat| (A) |
| +---+ Main |
| |
| ,--. |
| ( R ) throttle (Y axis) |
\ `--' /
\____________________________________________________ _/
```
| Control | Does | RIO address |
|---|---|---|
| Left stick | Joystick X / Y (inverted, deadzone 0.24 — pod convention) | axes |
| Right stick Y | Throttle, as a **rate**: hold to wind it up or down, position sticks | axis |
| Left / right trigger | Left / right pedal (deadzone 0.12) | axes |
| **A** | Main trigger | `0x40` |
| **B** | Middle | `0x46` |
| **X** | Pinky | `0x45` |
| **Y** | Upper | `0x47` |
| **LB** | Panic | `0x3D` |
| **RB** | Throttle button — reverse thrust | `0x3F` |
| D-pad | Hat: up / back / left / right (look) | `0x42` `0x41` `0x44` `0x43` |
| **Start**, **Back** | unbound — yours to map | — |
The config buttons (`0x37`/`0x36`) are the first two buttons of the
Upper Right MFD's top row, reachable from the keyboard on `9` and `0`.
Start and Back ship unbound so you can put anything there; the
commented lines in `bindings.txt` show how.
---
## Keyboard
### Flight cluster — the number pad
```
+-----+-----+-----+
| 7 | 8 | 9 | 7 / 9 left / right pedal
| Lped| fwd |Rped | 8 / 2 stick forward / back
+-----+-----+-----+ 4 / 6 stick left / right
| 4 | 5 | 6 | 0 main trigger
| left| |right|
+-----+-----+-----+
| 1 | 2 | 3 |
| | back| |
+-----+-----+-----+
| 0 | . |
| trigger | |
+-----------+-----+
Shift throttle up Ctrl throttle down Alt reverse thrust
(both throttle keys walk the axis and it holds where you leave it)
```
| Key | Does |
|---|---|
| NumPad 8 / 2 | Stick forward / back |
| NumPad 4 / 6 | Stick left / right |
| NumPad 7 / 9 | Left / right pedal |
| NumPad 0, Space | Main trigger (`0x40`) |
| Shift / Ctrl | Throttle up / down (position holds) |
| Alt | Reverse thrust (`0x3F`) |
| Arrow keys | Hat — look up / back / left / right |
| **Alt + Q** | Abort the mission (score banked, back to menu or lobby) |
### Panel buttons — the letter and number rows
The rest of the keyboard is the pod's button board, laid out as it is
printed on the panel. Each MFD has 8 buttons (a 4-wide top row and a
4-wide bottom row); the keyboard rows run left to right across the
three upper MFDs, then the two lower ones.
```
UPPER MFDs Left MFD Middle MFD Right MFD
top row 1 2 3 4 | 5 6 7 8 | 9 0 - =
bottom row Q W E R | T Y U I | O P [ ]
0x2F..0x2C 0x27..0x24 0x37..0x34
0x2B..0x28 0x23..0x20 0x33..0x30
LOWER MFDs Left MFD Right MFD
top row A S D F (G unbound) H J K L
bottom row Z X C V (B unbound) N M , .
0x0F..0x0C 0x07..0x04
0x0B..0x08 0x03..0x00
COLUMNS beside the map
Secondary F1 F2 F3 F4 F5 F6 0x10..0x15
Screen F7 F8 F9 F10 F11 F12 0x18..0x1D
```
G and B are deliberately unbound: they are the physical gap between the
Lower Left and Lower Right MFD clusters on the real board.
Every one of these buttons is also **clickable on screen** — the red
strips around each MFD and the amber strips beside the map are the same
addresses, and they light up when the game commands their lamps.
### Volume and bass
| Key | Does |
|---|---|
| `Page Up` / `Page Down` | master volume, in steps of 0.05 from silent to 2.0 |
| `Home` / `End` | bass, in steps of 0.05 from as-authored down to none |
Both take effect as you press them, including on sounds already playing,
and both are written beside the exe as you change them — `volume.cfg` and
`bass.cfg` — so they stay where you left them. `RP412AUDIOVOLUME` and
`RP412AUDIOBASS` in `environ.ini` set where a machine starts out before
anyone touches the keys; delete the matching `.cfg` to go back to them.
The cabinets had neither control. They ran the game at unity and left
level and tone to an external amplifier and a 3-way crossover, so these
keys are standing in for hardware the arcade had and you do not: Page
Up/Down is the amplifier, Home/End is the crossover's low band. See
[SOUND.md](SOUND.md).
### Not bound by default
The pilot keypad (`0x50``0x5F`) and external operator keypad
(`0x60``0x6F`) have no keys assigned — the game never reads them. They
remain bindable if you want them (they arrive as arcade RIO key events).
---
## RGB keyboard lighting
If the machine has a Dynamic Lighting keyboard, bound panel keys mirror
the pod's lamps: red for the MFD banks, amber/yellow for the Secondary
and Screen columns, blinking in step with the on-screen buttons.
Unbound keys go dark. Set `RP412KEYLIGHT=0` in `environ.ini` to switch
it off.
---
## Flight sticks, HOTAS and pedals
Anything that is not an Xbox-class pad — a flight stick, a HOTAS
throttle, a twist grip, rudder or racing pedals, a wheel — comes in
through DirectInput rather than XInput, and needs to be told which axis
is which. **Run `joyconfig.bat` once.** It asks you to move each control
in turn, works out which device and axis you moved and which way round
it reads, and writes the joystick rows of `bindings.txt`. Then it
carries on into the setup screen so you can try them straight away.
You are never asked what you own. Two of the controls can't simply be
watched, though, so they are asked for differently:
**Yaw is asked for twice** — right, then left — and *which axis answers*
is the measurement. The same axis both times is one control covering
both directions: a twist grip, a rudder bar, rudder pedals their driver
has already mixed, racing pedals in combined mode. Two different axes
are two real pedals, one per foot, which is what the pod itself had, and
they bind to the pod's own pair so the game does the mixing — both at
once then does what both at once did in the pod. Either way you just
move the thing twice; the wizard works out the shape.
**The throttle is set to zero first.** A lever sits wherever it was last
left — halfway, or hard against the stop that happens to read `+1` — so
watching it move says nothing about which end means power. The wizard
asks you to close it, press SPACE to say so, and *then* open it: the
direction it travels from a known idle is the direction that means
throttle. (Press `S` there if you have no throttle lever.)
It only writes its own section, between two marker lines, so anything
you have edited yourself survives re-running it. Xbox-class controllers
need none of this — they are the pad rows above and work out of the box.
By hand, the rows look like this:
```
joydev 0 T.16000M # or a bare slot number
joyaxis X axis JoystickX invert deadzone 0.08
joyaxis Y axis JoystickY invert deadzone 0.08
joyaxis RZ axis Pedals deadzone 0.08 # twist grip works both pedals
joyaxis SL0 axis Throttle deadzone 0 # a real lever owns the channel
joybutton 0 button 0x40 # trigger
joyhat 0 up button 0x42
```
Two separate pedals bind to the pod's real pair instead, usually on a
device of their own:
```
joydev 1 Pedals
joyaxis Y axis LeftPedal lever deadzone 0.05
joyaxis RZ axis RightPedal lever deadzone 0.05
```
Axis names are DirectInput's — `X Y Z RX RY RZ SL0 SL1` — where a twist
grip is usually `RZ` and a HOTAS throttle usually `Z` or `SL0`.
Three things are worth knowing. `Pedals` is a signed axis that drives the
pedal *pair*, positive for the right pedal and negative for the left, so
one rudder bar or twist grip works both the way a foot never could. A
`joyaxis` on `Throttle` with no `rate` is treated as a real lever: its
full travel *is* the throttle range, rather than nudging a position the
way a spring-centred pad stick has to. And `lever` says the same thing
about any other one-way control — a floor pedal rests at one *end* of
its travel, not in the middle, but Windows still reports it as a full
1..+1 axis, so without the word the first half of the press does
nothing. With it, the travel maps onto the channel's 0..1 and the
deadzone measures from the released end, where a tired return spring's
slack actually lives. Add or remove `invert` if a pedal reads backwards.
## Rebinding
`bindings.txt` sits beside the exe, written with the full default layout
and its own documentation on first run. Change a line, restart the game.
Delete the file to restore these defaults — worth doing after an update,
since an existing file is never overwritten.
Examples:
```
key J button 0x40 # main trigger on J as well
pad X button 0x40 # move the trigger to the X button
key NumPadAdd axis Throttle rate 0.75 # throttle on numpad +/-
key NumPadSubtract axis Throttle rate -0.75
padaxis LeftStickX axis JoystickX deadzone 0.15 # drop 'invert' to flip X
```
Addresses: `0x00``0x47` are the lamp buttons above, `0x50``0x6F` the
keypads. Axis names: `Throttle`, `LeftPedal`, `RightPedal`, `JoystickX`,
`JoystickY`, `Pedals`. Key names follow the .NET `Keys` naming (`A``Z`, `D0``D9`
for the digit row, `F1``F12`, `NumPad0``NumPad9`, `Up`, `Down`,
`Left`, `Right`, `Space`, `Return`, `Shift`, `Ctrl`, `Alt`,
`OemMinus`, `Oemplus`, `Oemcomma`, `OemPeriod`, `OemOpenBrackets`,
`OemCloseBrackets`, …).