A tester ran 4.12.233 under Proton and it died on first mission load. The cause turned out to name itself, and to be a Windows bug we have been shipping the whole time. Wine implements d3dx9_43 itself, and 63 of its 329 exports are stubs. The game imports twenty of them and exactly one is stubbed: D3DXConcatenateMeshes, called once per session from ConsolidateStaticObjects on the first-mission-load latch - so every player hits it on their first race. Wine raised EXCEPTION_WINE_STUB naming the function in plain text, and our own crash filter caught it and wrote a minidump, which is how a self-describing failure arrived as a mystery. The fix is one file, and it was overdue on Windows. d3dx9_43.dll is a HARD import of the exe - only steam_api.dll is delay-loaded - and it is not part of Windows. It ships with the June 2010 DirectX End-User Runtime and nothing else. Any customer on a clean Windows 10 or 11 who never installed that redistributable cannot start the game at all: the loader fails at 0xC0000135 before WinMain, no window, no log line. Every machine this has been built or tested on had the SDK or some older game installed, which is precisely why nobody has ever seen it. pack-dist now extracts the DLL from the SDK's redist cab into dist. Wine prefers an application-directory DLL over its builtin, so the same file closes the Windows failure and the Linux blocker together, and it is verified working on a stock prefix with nothing installed. The SDK terms nominate DXSETUP as the delivery method for this redistributable; the loose DLL is what is verified and is near-universal practice, but that wants confirming before a public release. /LARGEADDRESSAWARE, because the same session reported VmSize 3193MB and an older Wine that died before video init with the address space exhausted. The game is not using that memory: measured here, a standalone mission peaks at 166MB committed against 795MB of address space. The gap is reservations, mapped files, and mostly the graphics driver mapping VRAM apertures into our process - under wined3d's OpenGL path that grows several times over. For a 32-bit process the 2GB address ceiling is a hard limit with nothing to do with RAM, so it is entirely possible to run out of addresses while using 170MB. The flag raises it to 4GB, frees nothing, and changes no behaviour. Worth having on Windows too: 795MB of 2GB is already 40% before 1080p, eight pods, and the 100MB buffer RP412RECORDSIZE takes when recording is armed. And two diagnostics so the next one costs a log line instead of an investigation. The crash filter now decodes 0x80000100 and writes the offending module.function before the minidump; startup probes wine_get_version in ntdll and logs the platform beside the version banner. Neither can appear on Windows - verified: the smoke run's log has the version line and no platform line. Not fixed here, deliberately: the durable version of this is to write the mesh merge by hand, since D3DXSimplifyMesh and D3DXSplitMesh are stubs too and any future mesh work hits the same wall. And the field test ran wined3d, not DXVK, so the child-window Present with GDI panes clipped over it - the risk the assessment led with - is still untested. The doc records both, along with the prediction it got wrong: the windowsapp.lib import was called a load-time failure risk under Wine, and it simply is not one. 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.
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 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
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
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. It runs
under Spacewar (480) for now; Red Planet's own AppID, 5108000, is parked
until its Steam permissions are sorted.
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.
Building
VS 2022 (v143) + DirectX SDK June 2010 + the vendored Steamworks SDK
(extern/steamworks_sdk_165) — 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 |
| docs/RP412-LINUX.md | Linux compatibility assessment — Proton path vs native port; parked until late playtesting |
| docs/NET-TEST.md | Network test protocol — WAN emulation profiles, the NetLog/NetStats telemetry, the stall-recovery test, -spoolstats |
| 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) |