Virtual World Entertainment · Tesla pod · RP 4.12.7
Every input the pod answers to, on the gamepad and the keyboard, and every file it keeps beside the exe. The keyboard is the pod's button board: the letter and number rows are the MFD banks laid out as they are printed on the panel, and flight moved to the number pad so the board stays free.
Generated from the default bindings.txt · all of it rebindable
An Xbox-compatible pad drives all five axes and the grip buttons. Hover or tap a control for its RIO address.
Colour is the bank each key drives: green flies the pod, red is an MFD button bank, amber is a column beside the map. Dark keys are unbound and free to take.
ALT + Q aborts the mission on the spot — score banked, back to the menu or lobby. It is the only chord the engine listens for; the arrow keys are safe.
Each MFD carries eight buttons: a four-wide top row and a four-wide row beneath it. The keyboard rows run left to right across the upper MFDs, then the lower pair — the same order your hand finds them in the pod.
G and B stay unbound on purpose: they are the physical gap between the lower clusters. Every button here is also a mouse target on screen — see The mouse below — and lights when the game commands its lamp.
What the gamepad stands in for. This is the cockpit's own TRIGGER STATUS readout — four buttons on the grip, drawn the way the upper-right MFD draws them. Hover one for its address and its stand-ins.
| Upper | 0x47 | Y |
|---|---|---|
| Main | 0x40 | A · Space · Num 0 |
| Middle | 0x46 | B |
| Pinky | 0x45 | X |
| Throttle | 0x3F | RB · Alt |
| Panic | 0x3D | LB |
| Hat | 0x41–44 | D-pad · arrows |
| Config 1 · 2 | 0x37 · 0x36 | unbound — yours to map |
The throttle button is reverse thrust; the hat looks around. Both live off the grip on the real stick.
Both plates are the pod's own instruction art, lifted from the shipped gauge assets.
The third input. Every button on every display is clickable and lights when the game commands its lamp — and each one reaches in under the glass beside it, so the picture is the press target. The lit strip at the edge is only the lamp.
The pod bolted its displays down at one size. On a desktop panel there
is room to trade viewscreen for instrument, so all six are yours to
size — and the radar to place. Set these in environ.ini
beside the exe; they are read once at startup.
| L4MFDSCALE | All five MFDs, as a percentage of pod size. 25–200, default 100 |
|---|---|
| L4MFDSCALE_xx | Any one on its own — UL UC UR LL LR. Unset inherits the line above. |
| L4RADARSCALE | The radar alone. It already sits at 1.35× the MFDs. |
| L4RADARPOS | CENTER · LEFT · RIGHT · MIDLEFT · MIDRIGHT |
Ask for too much and the layout wins. Panes are clamped against their actual neighbours and shrink evenly, so nothing overlaps and nothing comes out stretched. Scale the MFDs beside the radar and it is the radar that gives way — halfway up a side it has one above and one below, and it grows from the middle both ways.
The cockpit fits itself to whatever window it gets and keeps 16:9, so a
wide panel letterboxes rather than stretching. Launch with
-fit — start-fullscreen.bat — and it goes
borderless over the whole monitor and picks the render size to land on
the viewscreen 1:1, instead of you guessing at -res.
A gamepad speaks XInput, and the game reads it without being asked.
Everything else — a flight stick, a HOTAS throttle, a twist grip,
rudder pedals, a wheel — speaks DirectInput, which names its axes
X Y Z RX RY RZ SL0 SL1 and says nothing about
what they are for. Somebody has to decide that your twist grip is
the rudder and that pushing it right means right. That is what
joyconfig.bat is.
The direction is the whole point. A stick that reads
positive pushed right and one that reads negative are equally common,
and nothing printed on the box tells you which you own. So the wizard
does not ask you to know — it asks you to move, and reads the
answer off the movement. Skip a prompt with SPACE if you
have no such control, ESC to abort without writing.
It writes only its own section of bindings.txt, between two
marker lines, so anything you have written yourself is kept — including a
deadzone you tuned by hand after trying it. Before it starts it prints
every axis at rest: a stick whose driver reports an odd range
shows up there as X +1.00 on an untouched
stick, rather than as a mystery later. Xbox-class pads are excluded from
all of this, so nothing ever counts twice.
# what it writes joydev 0 Logitech Extreme 3D joyaxis X axis JoystickX invert deadzone 0.08 joyaxis Y axis JoystickY deadzone 0.08 joyaxis RZ axis Pedals deadzone 0.08 joyaxis SL0 axis Throttle invert deadzone 0 joybutton 0 button 0x40 joyhat 0 up button 0x42
# grammar
joydev <slot> [product-name substring]
joyaxis <src> axis <axis> [invert]
[deadzone <d>] [rate <n>]
joybutton <n> button <addr> [toggle]
joyhat <n> <up|down|left|right>
button <addr>
# a named slot binds that product; a bare
# one binds the Nth stick Windows lists
| Pedals | A signed axis that works the pedal pair — positive for the right pedal, negative for the left. The pod has one under each foot; a twist grip or rudder bar is a single control that presses one or the other and never both, which is exactly what this says. It is a channel name like any other, so a gamepad stick can drive the turn with it too. |
|---|---|
| Throttle | A joyaxis on the throttle with no rate is treated as a real lever and owns the channel: its full travel is the throttle range. Spring-centred sticks have to nudge a position instead, which is what rate does — a lever that stays where you put it needs none of that. |
A twist grip is usually RZ; a HOTAS throttle is
usually Z or SL0. Set
RP412JOYLOG=1 to log devices as they attach and drop away.
bindings.txt sits beside the exe, written with the full
default layout on first run. Change a line, restart. Delete the file to
restore these defaults — worth doing after an update, since an existing
file is never overwritten.
# grammar
key <name> button <addr> [toggle]
key <name> axis <axis> deflect <n>
key <name> axis <axis> rate <n>
pad <button> button <addr> [toggle]
padaxis <src> axis <axis> [invert]
[deadzone <d>] [rate <n>]
joydev joyaxis joybutton joyhat
see above
# deflect springs back, rate sticks where
# you leave it (that is the throttle)
# examples key J button 0x40 # trigger on J too pad X button 0x40 # trigger on X key NumPadAdd axis Throttle rate 0.75 key NumPadSubtract axis Throttle rate -0.75 # drop 'invert' to flip the stick padaxis LeftStickX axis JoystickX deadzone 0.2
| Axes | Throttle · LeftPedal · RightPedal · JoystickX · JoystickY · Pedals |
|---|---|
| Buttons | 0x00 – 0x47 |
| Keypads | 0x50 – 0x6F — unbound by default; the game never reads them |
| Key names | A–Z · D0–D9 · F1–F12 · NumPad0–9 · Up Down Left Right · Space · Return · Shift · Ctrl · Alt · OemMinus · Oemplus · Oemcomma · OemPeriod |
| Pad | A B X Y · DPadUp/Down/Left/Right · Start · Back · LeftShoulder · RightShoulder · LeftThumb · RightThumb |
| Pad axes | LeftStickX/Y · RightStickX/Y · LeftTrigger · RightTrigger |
| Joystick axes | X · Y · Z · RX · RY · RZ · SL0 · SL1 — DirectInput's own names |
Red Planet's sound effects were never files. They lived as samples inside two Creative AWE32 cards, uploaded from a pair of soundbanks and played back like an instrument — each sound a chord of up to four layers, every layer with its own pitch, its own level and its own filter. The port that brought the game to the desktop had those banks but not the cards, so the layers were flattened into plain wav files, and a good deal was lost in the flattening.
The original banks have been read again, and the sounds rebuilt from them.
| Pitch | Every sound had been shipped at one flat rate with the banks' tuning discarded, so most of them played at the wrong speed — the worst by nine semitones. The deep layers suffered most, which is why the game now has weight it did not have: a collision thud that lasted a twentieth of a second is two thirds of a second at the pitch it was written at. |
|---|---|
| Layers | Ninety-three sounds were missing pieces — a hundred and seventy-six layers in all, most of them the low rumble that sits under collisions and explosions. |
| Distance | Sounds carry across the arena on the curve the designers wrote rather than fading to nothing in a straight line, and they get duller as they get further away, as they did in the pod. |
| Space | Anything outside the craft has the arena's reverb on it; the cockpit stays dry. That contrast is how the pod told you which side of the hull a sound was on. |
| Movement | Passing craft change pitch as they pass. The port had this backwards — approaching sounds dropped in pitch instead of rising. |
If it is too much, that is what the knobs are for. The cabinets ran the game at full level and did their shaping in hardware — an amplifier and a three-way crossover behind the seat, out of the player's reach. Your desk has neither, so PgUp and PgDn stand in for the amplifier and Home and End for the crossover's low band. Both move while you play, and both stay where you leave them. The bass control works on the deep layers only, so turning it down takes the weight out of the collisions without dulling anything else.
Six files in the game folder are yours. None of them ship. The game writes each one the first time it needs it and then never touches it again, so a new build dropped over this folder keeps everything you have set — and deleting any of them simply starts that part over with the current defaults.
| environ.ini | Every engine option, commented in place — displays, renderer, Steam, the podium, the lot. The one to read first. Written on first run; without it the MFDs do not come up at all, so the game will always put one back. |
|---|---|
| bindings.txt | Every key, pad button, axis and joystick row. Written with the full documented default layout the first time the game runs. |
| pilot.cfg | Your callsign and loadout, saved on the way out of the setup screen so they are there next time. |
| mfd_layout.cfg |
Where you dragged the windows, and the ,noframe
flag. Only written when RP412MFDLAYOUT=save.
|
| volume.cfg |
Where you left the master volume, written every time you press
PgUp or PgDn. Overrides
RP412AUDIOVOLUME once it exists; delete it to go
back to that.
|
| bass.cfg |
The same for the bass trim, on Home and End,
overriding RP412AUDIOBASS.
|
Two that catch people out.
environ.ini is applied over the environment, so a
variable you set in a shell loses to an uncommented line in the file —
comment the line out rather than fighting it. And nothing here is ever
overwritten once it exists, which is exactly what lets you keep a
folder across builds — but it means a file carried through several
updates stops being offered new options. The game names any it has not
heard of in rpl4.log; delete the file to get the
fully documented current one back.
Shipped data the engine reads. Nothing here is meant to be edited, but it is worth knowing what is what.
| RPDPL.INI | Renderer and scene configuration. Named by L4DPLCFG=, so it can be swapped. |
|---|---|
| GAUGE\L4GAUGE.INI | Gauge canvas pages. L4GAUGE= picks one by name — a name that is not in here switches the MFDs off entirely. |
| GAUGE\L4GAUGE.CFG | The gauge layout data that page points at. |
| AUDIO\AUDIO.INI | Sound banks. AUDIOMR.INI is the mission-review twin. |
| JOYSTICK.INI | The 1995 single-stick calibration, for the legacy L4CONTROLS=DIJOYSTICK path only. Modern sticks are configured in bindings.txt — see above. |
| *.CFG in AUDIO\ | Pod audio-hardware mixer tables. Dead weight on a desktop; kept because the arcade path still reads them. |
| RPL4.RES | Resource blob, not text. |
| steam_appid.txt | Steam runs under Spacewar (480) until Red Planet has its own AppID. |