Cyd asked what it would take to run on Linux. The answer is filed rather than acted on: we are mid-playtest, and this is a decision for the end of it. Proton is the recommendation. The build is 32-bit fixed-function D3D9, which is the most-travelled path Proton has, and Valve keeps i386 alive in the Steam runtime containers specifically to carry it; Wine 10 fixed child-window Vulkan rendering, which is the one thing that would have stopped the cockpit dead, since the 3D scene presents into a child STATIC with GDI panes clipped over it. Deck Verified is achievable from a Windows-only build and is what comparable Win32 titles ship. The native port is scoped in the doc rather than dismissed, because the engine is more portable than it looks: RP is clean C++, MUNGA is ~90% clean, single-threaded, with one timing seam and one file seam already named. What stops it is mechanical and total - 1,800 of 1,844 include lines cite a filename in a case no case-sensitive filesystem will find - and then strategic: the wire format and .RES carry size_t under /Zp1, so a 64-bit build silently changes the protocol while a 32-bit one targets a runtime Valve is walking away from. Five things need doing to the Windows build either way, and they are all improvements to it on their own: the Dynamic Lighting mirror imports windowsapp.lib statically, so its careful try/catch degradation never runs under Wine - the image fails to load first; the plasma window and the exploded MFD view are extra top-level windows, which is what gamescope handles worst; the viewscreen relies on the stock STATIC proc returning HTTRANSPARENT for mouse fall-through rather than saying so; the 1080 canvas downscales 1.5x on the Deck, against a 9px legibility floor; and the front end is mouse-driven, which Deck Verified will not pass. Nothing here has been run on Linux. The first step when this resumes is an afternoon with a Linux box confirming the child-window Present, before anything is promised. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
140 lines
8.9 KiB
Markdown
140 lines
8.9 KiB
Markdown
# 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](https://gitea.mysticmachines.com/VWE/RP411.git)) — 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](https://gitea.mysticmachines.com/VWE/RP412/releases/tag/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](https://gitea.mysticmachines.com/VWE/RP412/releases/tag/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.
|
||
|
||
[v4.12.4](https://gitea.mysticmachines.com/VWE/RP412/releases/tag/v4.12.4)
|
||
is about the lobby. Both rooms now show the host's mission setup — the track,
|
||
then time of day, weather and game length — since everyone flies the owner's
|
||
picks and it was the one thing in the room nobody could see for themselves.
|
||
The football team sheet names each player's VTV beside their team colours and
|
||
position. And a lobby holds **eight** players rather than four, a full grid as
|
||
the pod hall ran it, with the room sizing its roster to whatever space the
|
||
window gives it.
|
||
|
||
[v4.12.5](https://gitea.mysticmachines.com/VWE/RP412/releases/tag/v4.12.5)
|
||
restores the **Winners Circle**. The pod hall stood the finishers on a
|
||
numbered award platform when the race ended, and all of it was still in this
|
||
repo — the stand, eight ranked spots in every map, and the code to put racers
|
||
on them — wired only into the mission-review build and so never once run by a
|
||
pod. The race now fades out and fades back in on the platform: finishers in
|
||
finishing order, each pilot's callsign on the plate beside their spot, the
|
||
cockpit glass cleared away, held for a few seconds before the results screen.
|
||
Three pieces of it had been stubbed out in the D3D9 port and are working
|
||
again.
|
||
|
||
[v4.12.6](https://gitea.mysticmachines.com/VWE/RP412/releases/tag/v4.12.6)
|
||
is about the windows. Where you put them now survives the
|
||
menu-race-menu loop: `RP412MFDLAYOUT` remembers the game window, the
|
||
exploded view's display panes and the plasma glass in `mfd_layout.cfg`
|
||
beside `bindings.txt`. Append `,noframe` to a line to take that
|
||
window's title bar and border off — a cockpit filling the monitor edge
|
||
to edge at a rect you chose, rather than `-fit` taking the whole
|
||
screen — and the setup screen carries its own **EXIT GAME** button,
|
||
since a window with no title bar needs a way out. The Steam buttons
|
||
now dim and say *STEAM NOT RUNNING* instead of disappearing. And the
|
||
Winners Circle camera is framed off the award stand itself rather than
|
||
off whoever is standing on it, so the shot is the same one for every
|
||
player at every head count.
|
||
|
||
[v4.12.7](https://gitea.mysticmachines.com/VWE/RP412/releases/tag/v4.12.7)
|
||
is about sticks. Anything that is not an Xbox-class pad — a flight stick,
|
||
a HOTAS throttle, a twist grip, rudder pedals, a wheel — comes in through
|
||
DirectInput rather than XInput, and the game could not see any of it.
|
||
Now it can, and `joyconfig.bat` sets it up: the wizard asks you to move
|
||
each control in turn, works out which device and axis answered and which
|
||
way round it reads, and writes the joystick rows of `bindings.txt`,
|
||
leaving anything you have edited yourself alone. A twist grip or rudder
|
||
bar drives both pedals through one signed `Pedals` axis, and a real
|
||
throttle lever owns its channel outright rather than nudging a position
|
||
the way a spring-centred stick has to. Ported from the sibling BT411.
|
||
|
||
## 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](docs/STEAM-3-MACHINE-TEST.md) (until RP412
|
||
has its own AppID it runs under Spacewar, 480).
|
||
|
||
The config files beside the exe are self-documenting and none of them
|
||
ship: the game writes each one the first time it needs it and then leaves
|
||
it alone, so a new build dropped over an existing folder keeps every
|
||
setting. **environ.ini** is every engine option, commented; **bindings.txt**
|
||
every key, pad button and axis; **pilot.cfg** your callsign and loadout;
|
||
**mfd_layout.cfg** where you dragged the windows. Delete any of them to
|
||
start that part over with the current defaults.
|
||
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](docs/CONTROLS.md).
|
||
|
||
## Building
|
||
|
||
**VS 2022 (v143)** + DirectX SDK June 2010 + the vendored Steamworks SDK
|
||
(`extern/steamworks_sdk_164`) — see [BUILD.md](BUILD.md). Solution
|
||
`WinTesla.sln`, configuration `Release|Win32`, output
|
||
`Release\rpl4opt.exe`.
|
||
|
||
## Documentation
|
||
|
||
| Doc | Contents |
|
||
|-----|----------|
|
||
| [docs/CONTROLS.md](docs/CONTROLS.md) | Controls map — pad and keyboard diagrams, the panel button banks, rebinding |
|
||
| [docs/RP412-ROADMAP.md](docs/RP412-ROADMAP.md) | The original plan and workstreams |
|
||
| [docs/RP412-FRONTEND-DESIGN.md](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](docs/STEAM-3-MACHINE-TEST.md) | Multiplayer test procedure, Steam Input notes, the abort key |
|
||
| [docs/RP412-LINUX.md](docs/RP412-LINUX.md) | Linux compatibility assessment — Proton path vs native port; parked until late playtesting |
|
||
| [BUILD.md](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](https://gitea.mysticmachines.com/VWE/RP411.git) | Upstream: the Win32 arcade port this repo Steamifies (full history preserved; remote `rp411` for cross-pulling fixes) |
|
||
| [VRIO](https://gitea.mysticmachines.com/VWE/VRIO.git) | Virtual RIO panel + vPLASMA — source of the bindings format, the cockpit layout, and the keyboard lamp mirror |
|
||
| [TeslaSuite](https://gitea.mysticmachines.com/VWE/TeslaSuite.git) | TeslaConsole / Launcher / vPOD — the arcade session-control stack 4.12 absorbed (and the reference implementation of the Munga control protocol, TCP 1501) |
|