The keyboard becomes the button board (RP412 bindings port) + a controls page

Ported RP412's bindings design and made it the DEFAULT: the letter and number
rows are the MFD button banks laid out WHERE THEY SIT ON THE PANEL, flight
moves to the numpad so the board stays free, F1-F12 are the map's two columns,
and G/B stay unbound as the physical gap between the lower clusters.  Expressed
in BT's OWN grammar (slew/deflect/set, the Turn channel) -- bindings.txt is a
documented compatibility surface and was not touched.

Coverage: 61 of 72 addresses on the keyboard, and the 11 absent ones are
exactly those the pod never wired (0x16/0x17/0x1E/0x1F column gaps, 0x38-0x3E
intercom/door).  All 72 stay clickable on the panel.

It lands on BT's addresses unreasonably well: 1-4 + QWER are the ENTIRE coolant
system (Condensers 1-6, flush, balance), F6/F7 the display and control-mode
cycles, F9-F12 Generators A-D, F4 the crouch button reconstructed earlier
today.

THE DELIBERATE COST.  A bound key is removed from the authentic 1995
typed-hotkey channel so it cannot double-dispatch, and this board binds nearly
everything -- so 5 (Quad page), z (Eng1), t/y/u/i/o (pilot select) and +/-
(target zoom) are given up.  Unbind a key to get its 1995 meaning back.
Documented in the file header, the markdown and the page.

NEW RULE: A BINDINGS ROW WINS OVER A BUILT-IN CONVENIENCE KEY
(PadRIO::KeyHasBinding).  V and J/K/L are board buttons now, and those polls
read GetAsyncKeyState directly -- without this they would have fired BOTH the
button and the built-in.  View toggle lives on BACKTICK alone.

CONTROLS.MAP rewritten to mirror the board so glass/pod/dev still feel
identical (the 2026-07-21 settlement): 90 bindings, 0 parse complaints.

HAT LABELS CORRECTED [T1].  INPUT_PATH_AUDIT flagged 0x41-0x44 and was right.
Settled from the streamed mapping (BT_CTRLMAP_LOG): elem 66 -> subsys 17
attrID 14, i.e. 0x42 is the TORSO subsystem, not a look; 0x44/0x43/0x41 are the
mapper's LookLeft/LookRight/LookBehind (attrID 10/11/12).  The .RES has no
"TORSO CENTER" string -- its names are LookBehind/Down/Forward/Left/Right -- so
the audit's wording was loose but its substance correct.  Swept L4GLASSWIN,
L4PADPANEL and L4VB16.

docs/CONTROLS.html: interactive keyboard (hover a key for its address and
meaning, MFD clusters outlined), pad diagram, panel map, the under-glass
press-target figure, radar placement thumbnails and the environ.ini table --
modelled on RP412's page, rewritten for BT's addresses and hazards.  mkdist
wraps the fragment in a doctype/charset shell and ships it beside CONTROLS.txt.

Verified: bindings.txt regenerates and loads (74 keys, 0 errors); CONTROLS.MAP
90 bindings, 0 errors; 72/72 panel addresses still dispatch; surround /
exploded / dock / pod / dev boot and simulate with zero faults.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-26 03:23:27 -05:00
co-authored by Claude Opus 5
parent 56d9971b0e
commit 5f88a4eeb2
12 changed files with 1489 additions and 189 deletions
+1061
View File
File diff suppressed because it is too large Load Diff
+49 -64
View File
@@ -9,84 +9,69 @@ Cockpit layout and display sizes live in `content\environ.ini` (likewise self-do
---
## Keyboard
## Keyboard — the keyboard IS the button board
The letter and number rows are the MFD button banks, laid out where they sit on the panel.
Flight lives on the number pad so the board stays free.
### Flight — the number pad
| Key | Action | | Key | Action |
|---|---|---|---|---|
| W/S or ↑/↓ | throttle lever | | X or NumPad5 | all stop |
| A/D or ←/→ | turn pedals | | Alt | reverse thrust |
| Q/E | torso twist | | Shift | throttle up |
| R/F | torso aim | | NumPad 8/2/4/6 | torso aim/twist |
| 1 or Space | main trigger | | 2 | middle thumb |
| 3 or Ctrl | upper thumb (missiles) | | 4 | pinky |
| V | external camera | | B | look behind |
| M | control mode (BAS/MID/ADV) | | N | schematic |
| J/K/L | MFD preset pages | | H (hold) | coolant flush |
| C | cycle a coolant valve | | G (hold) + fire | regroup a weapon |
| / = | volume down/up | | F5F9 | generator select / mode |
| NumPad 8 / 2 | torso aim up / down | | NumPad 7 / 9 | left / right pedal |
| NumPad 4 / 6 | torso twist left / right | | NumPad 5 | all stop |
| NumPad 0, Space | main trigger | | NumPad 1 / 3 / . | pinky / middle / upper |
| Shift / Ctrl | throttle up / down (the lever sticks) | | Alt | reverse thrust |
| ← ↓ → | look left / behind / right | | | torso centre |
| ` | cockpit / chase camera | | / = *(see below)* | — |
**You spawn in BASIC control mode.** In BASIC the stick steers and the pedal keys do nothing.
Press **M** once for MID, where the pedals steer and the stick twists the torso — the full
experience. If "turning doesn't work", this is why.
**You spawn in BASIC control mode.** In BASIC the stick steers and the pedals do nothing.
Press **F7** once for MID, where the pedals steer and the stick twists the torso — the full
pod experience. If "turning doesn't work", this is why.
Numpad aim keys need **NumLock ON**.
### The panel — letter and number rows
> Control mode (BAS/MID/ADV, the M key) is *not* the menu's experience setting
> (novice/standard/veteran/expert). That one changes the simulation — heat, damage — not your
> controls.
```
UPPER DISPLAYS Heat / coolant Engineering Comm / hotbox
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 DISPLAYS Left Weapons Right Weapons
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
## The cockpit panel — all 72 pod buttons
COLUMNS beside the map
left F1 zoom+ F2 zoom- F3 thermal F4 CROUCH F5 lamp F6 display
right F7 control mode F8 - F9..F12 Generators A-D
```
Each display carries the bank of buttons mounted around it in the real cabinet. Click anywhere on
a display: the buttons reach *under* the glass, so the whole screen is a press target and only the
lit strip at the edge shows.
G and B are deliberately unbound: they are the physical gap between the lower clusters.
### Heat / coolant display — the loop controls
| Button | Action |
|---|---|
| `0x28` | **Balance coolant** — equalise every condenser valve |
| `0x29``0x2F` | the six **condenser valves** (Cond 6…1) and the **coolant flush** (`0x2C`, hold) |
**1 2 3 Q W E are the coolant valves** and the detents run 1 - 5 - 50 (max) - **0 (CLOSED)** -
back to 1. One press past max shuts that loop off and everything on it overheats; boosting one
loop starves the others, since the supply is shared. **4** is the flush (hold it) and **R**
re-balances every valve.
The valve detents run 1 - 5 - 50 (max) - **0 (CLOSED)** - back to 1. One press past max shuts
that loop off and everything on it overheats. Boosting one loop starves the others — the supply
is shared.
The weapon and engineering displays are **page-gated**: on the Quad page the outer buttons jump
to a populated Eng page; on an Eng page they drive generator select A-D, bus mode, coolant
toggle, trigger configure, and **eject** (tap to clear a jam, hold ~3 s to jettison a burning
ammo bay before it detonates).
### Weapon and engineering displays
| Bank | Display |
|---|---|
| `0x00``0x07` | Right Weapons (lower right) |
| `0x08``0x0F` | Left Weapons (lower left) |
| `0x20``0x27` | Engineering (upper centre) |
| `0x30``0x37` | Comm / target hotbox (upper right) — pilot select |
### What a bound key gives up
Each display's buttons are **page-gated**: on the Quad page the outer buttons jump straight to a
populated Eng page; on an Eng page they drive the subsystem shown — generator select AD, bus
mode, coolant toggle, trigger configure, and **eject** (tap to clear a jam, hold ~3 s to jettison
a burning ammo bay).
Binding a key removes it from the authentic 1995 typed-hotkey channel so it cannot
double-dispatch. This board binds nearly everything, so those hotkeys are given up by design:
`5` = MFD1 Quad page, `z` = MFD3 Eng1, `t/y/u/i/o` = pilot select, `+`/`-` = target zoom.
Unbind a key in `bindings.txt` to get its 1995 meaning back. Same rule for the built-ins:
**`** is the view toggle (V is a board button now), and J/K/L cycle the MFD preset pages only
while unbound.
### Map / radar — the side columns
| Button | Action | | Button | Action |
|---|---|---|---|---|
| `0x10` | map zoom in | | `0x18` | cycle control mode (BAS/MID/ADV) |
| `0x11` | map zoom out | | `0x1A``0x1D` | generator AD on/off |
| `0x12` | thermal / IR sight | | `0x16`,`0x17`,`0x19`,`0x1E`,`0x1F` | no function (as shipped in 1995) |
| `0x13` | **crouch** | | | |
| `0x14` | searchlight | | | |
| `0x15` | cycle display mode | | | |
### Flight controls
| Button | Action |
|---|---|
| `0x3D` | panic / config lamp |
| `0x3F` | throttle head — reverse thrust |
| `0x40` | main trigger |
| `0x41``0x44` | hat: behind / torso centre / right / left |
| `0x45``0x47` | pinky, middle thumb, upper thumb — the mappable fire buttons |
| `0x38``0x3C`, `0x3E` | intercom and door lines — no function on a desktop |
---
Addresses with no function at all — the pod never wired them — are `0x16` `0x17` `0x19`
`0x1E` `0x1F` and `0x38`-`0x3E`.
## Controllers
+50
View File
@@ -682,3 +682,53 @@ each bank surrounds, with the coolant-valve detent warning and the eject/jam pro
flattens it to ASCII as `CONTROLS.txt` at the zip root (the README's own flattening idiom).
`players/README.txt` gained pointers to it, to environ.ini, to -fit, and to the RGB mirror.
Verified: `mkdist.py` writes a 5149-byte pure-ASCII CONTROLS.txt into the zip.
## 2026-07-26 (last) — the keyboard becomes the button board (RP412 bindings port)
User decision: port RP412's bindings design and make it the DEFAULT (not an opt-in alternate),
plus a BT-flavoured interactive controls page.
**The layout.** Letter and number rows = the MFD banks laid out where they sit on the panel;
flight to the numpad so the board stays free; F1-F12 = the map's two columns; G and B unbound as
the physical gap between the lower clusters. Expressed in BT's OWN grammar (slew/deflect/set,
the Turn channel) -- the bindings.txt format is a compatibility surface and was not touched.
Coverage audit: **61 of 72 addresses on the keyboard**, and the 11 absent ones are exactly the
addresses with no authored function (0x16/0x17/0x1E/0x1F, 0x38-0x3E). 0x19 is bound (F8) purely
for column completeness. All 72 stay clickable on the panel.
The scheme lands on BT's addresses unreasonably well: 1-4 + QWER are the whole coolant system
(Condensers 1-6, flush, balance), F6/F7 the display and control-mode cycles, F9-F12 Generators
A-D, F4 the crouch button reconstructed earlier today.
**The deliberate cost.** A bound key is removed from the 1995 typed-hotkey channel, and this board
binds nearly everything -- so 5 (Quad), z (Eng1), t/y/u/i/o (pilot select) and +/- (zoom) go.
Documented in the file header, the markdown and the page.
**New rule: a bindings row WINS over a built-in convenience key.** `PadRIO::KeyHasBinding` --
V and J/K/L are board buttons now, so the view-toggle and preset-cycle polls stand down for them
(they poll GetAsyncKeyState directly and would otherwise have fired BOTH). View toggle lives on
BACKTICK alone.
**CONTROLS.MAP mirrored** so glass/pod/dev still feel identical (the 2026-07-21 settlement):
90 bindings, 0 parse complaints under BT_INPUT_LOG.
### Hat labels: 0x42 is TORSO CENTER [T1]
INPUT_PATH_AUDIT flagged 0x41-0x44 as mislabelled. Settled from the streamed mapping
(BT_CTRLMAP_LOG): `elem 66 -> subsys 17 attrID 14` = the TORSO subsystem, while 0x44/0x43/0x41 go
to the mapper's look trio (attrID 10/11/12 = LookLeft/LookRight/LookBehind). The .RES itself has
no "TORSO CENTER" string -- its names are LookBehind/Down/Forward/Left/Right -- so the audit's
wording was loose but its substance right. Swept L4GLASSWIN / L4PADPANEL / L4VB16.
### The controls page
`docs/CONTROLS.html` -- interactive keyboard (hover any key for its address and meaning, with the
MFD clusters outlined), pad diagram, panel map, the under-glass press-target figure, the radar
placement thumbnails, and the environ.ini table. Modelled on RP412's page, rewritten for BT's
addresses and hazards (the coolant-valve detent warning, jams and ammo-bay fires, BASIC control
mode). mkdist wraps the fragment in a doctype/charset shell and ships it beside CONTROLS.txt.
### Verified
- bindings.txt regenerates and loads: 74 keys, 0 parse errors; CONTROLS.MAP 90 bindings, 0 errors.
- 72/72 panel addresses still dispatch on click.
- surround / exploded / dock / pod / dev: boot + simulate, zero faults.
- Dist carries CONTROLS.txt + a 46 KB CONTROLS.html with doctype and charset.