The lobby capped at four, which is half a grid. The pod hall raced eight and the egg builder already carries the owner plus maxExtraPilots, so eight members fit with room to spare. CreateLobby now asks Steam for eight and the roster arrays follow. Checked what eight has to travel through before raising it: the go roster is 43 bytes a member against an 800 byte buffer, the score sheet 41 against 600, and the pods list 21 against 512, so all three hold eight with margin. The member side parses the go string with a cursor rather than a fixed array, and RegisterRoster walks the count it is given, so neither needed touching. The layout is the part that could not just be renumbered. Rows were a fixed sixteenth of the window, and eight of those ran off the bottom of every window we support - the buttons are laid out upward from the bottom edge while the roster runs down from the top, so the two meet in the middle. The room now measures the band between the title and the topmost button and sizes its rows to it, counted in half rows as setup lines + gap + eight rows + gap + hint so the row height falls out of the space actually available. It never grows past the old sixteenth, so a two player lobby does not get circus sized rows, and when the band cannot give eight rows the room the font needs, the block is drawn in a font that does fit rather than letting rows overlap. The minimum row is the font cell plus two, not the cell plus an eighth. That sounds like a detail and is not: at 1920x1080 the generous version missed by one pixel and paid for it by dropping the conditions line out of every football lobby, which is the one thing in the room nobody can see for themselves. Verified live on hosted lobbies at 1904x1041, and modelled across every window size from 3440x1440 down to 800x480 in race and football, host and member. Race keeps both setup lines everywhere; football, which carries four stacked buttons, keeps both down to 1080 and drops to one below that. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Red Planet 4.12 — the Steamification
Red Planet is VWE's pod-racing game: eight-player VTV contests on Mars — Martian Death Race and Martian Football — originally played from inside VWE Tesla cockpit pods. This repo is the third life of that code:
| Generation | What it was |
|---|---|
| Red Planet 4.10 | The original game, running on the Tesla 1 pod platform (DOS-era MUNGA engine, serial RIO cockpit hardware, operator console, batch-file relaunch between missions) |
| Red Planet 4.11 | The Win32 port of 4.10 (RP411) — DirectX 9, WinSock TCP, TeslaConsole/TeslaLauncher session control; still runs in pods, still a LAN |
| Red Planet 4.12 | This repo: the Steamification of 4.11 — the same engine, the same wire protocol, the same missions, made distributable on Steam and playable over the internet with no cockpit hardware |
The architecture is deliberately conservative: the VWE's design survives intact, with each pod-era dependency replaced by a consumer equivalent behind the engine's existing seams.
| Arcade (4.10/4.11) | 4.12 replacement |
|---|---|
| RIO cockpit board (serial) | PadRIO — virtual RIO from XInput pad + keyboard, fully rebindable (bindings.txt, vRIO profile format) |
| Seven physical displays | Single-window cockpit — all displays composed on a locked 1920×1080 canvas around the viewscreen, with the real button banks lamp-lit and clickable |
| Pod button lamps | On-screen lamps, plus an RGB keyboard mirror (Windows Dynamic Lighting) |
| TeslaConsole operator | In-game front end — race setup menu builds the mission egg locally; an in-process console marshals every race (missions still only end on a console stop, exactly as designed in 1994) |
| TeslaLauncher relaunch-per-mission | Single binary — menu → race → results → menu in one process |
| WinSock TCP LAN mesh | NetTransport seam — the deterministic pod mesh unchanged, running over plain TCP (LAN/dev) or Steam Networking Sockets (FakeIP + Steam Datagram Relay) |
| Site network / fixed IPs | Steam lobbies — lobby owner is the console; members exchange FakeIPs and loadouts as lobby data |
Status: it works. v4.12.2 carried the first verified end-to-end internet build: three machines, three Steam accounts, lobby → mesh → marshaled five-minute race → deaths and respawns → timed stop → results on every machine → rematch from the same lobby.
v4.12.3
is about the screen. The cockpit now scales up as well as down and re-fits
whenever the window changes, keeping 16:9 so a wide panel letterboxes
instead of stretching; -fit runs it borderless over the whole monitor and
picks the render size to land on the viewscreen 1:1. The displays are the
player's to arrange — each of the six can be scaled on its own and the
radar moved out of the middle of the road (environ.ini). Each display's
button bank now reaches under its glass, so the picture itself is the press
target rather than a sliver at the edge.
Playing
Grab the release zip (or run pack-dist.ps1 on a build). Single player:
run start-windowed.bat — the game boots into the setup menu, where the
SCENARIO group picks Death Race or Football (Football swaps in the
team/position columns and its own track list). Steam multiplayer: see
docs/STEAM-3-MACHINE-TEST.md (until RP412
has its own AppID it runs under Spacewar, 480).
The two config files beside the exe are self-documenting: environ.ini (every engine option, commented) and bindings.txt (every key, pad button, and axis; written with the full default layout on first run). Default controls: numpad flies (8/2/4/6 stick, 7/9 pedals, 0 trigger), Shift/Ctrl throttle, Alt reverse, arrows look, Space fires, letter rows are the MFD button banks as printed on the panel. Alt+Q aborts a mission. Full map with pad and keyboard diagrams: docs/CONTROLS.md.
Building
VS 2022 (v143) + DirectX SDK June 2010 + the vendored Steamworks SDK
(extern/steamworks_sdk_164) — see BUILD.md. Solution
WinTesla.sln, configuration Release|Win32, output
Release\rpl4opt.exe.
Documentation
| Doc | Contents |
|---|---|
| docs/CONTROLS.md | Controls map — pad and keyboard diagrams, the panel button banks, rebinding |
| docs/RP412-ROADMAP.md | The original plan and workstreams |
| docs/RP412-FRONTEND-DESIGN.md | TeslaConsole analysis, the egg format, the console protocol, and the Steam mapping — with status notes as each layer landed |
| docs/STEAM-3-MACHINE-TEST.md | Multiplayer test procedure, Steam Input notes, the abort key |
| BUILD.md | Toolchain and build steps |
Dev tooling: tools/two-pod-test.ps1 races two pods on loopback,
marshaled by a console feeder speaking the arcade Munga protocol.
Related repositories
| Repo | Role |
|---|---|
| RP411 | Upstream: the Win32 arcade port this repo Steamifies (full history preserved; remote rp411 for cross-pulling fixes) |
| VRIO | Virtual RIO panel + vPLASMA — source of the bindings format, the cockpit layout, and the keyboard lamp mirror |
| TeslaSuite | TeslaConsole / Launcher / vPOD — the arcade session-control stack 4.12 absorbed (and the reference implementation of the Munga control protocol, TCP 1501) |