From 13424cce508d7c74dd4618026e294802d8398e04 Mon Sep 17 00:00:00 2001 From: Cyd Date: Mon, 13 Jul 2026 11:27:45 -0500 Subject: [PATCH] README: the Steamification story; lobby search goes worldwide README.md rewritten around the lineage: Red Planet 4.10 on the Tesla 1 pod platform, 4.11 the Win32 port, 4.12 the Steamification of 4.11 - with the arcade-to-consumer replacement table, current status (v4.12.1 verified on three machines), playing/building/docs sections brought up to date. And ahead of internet-wide beta testing: lobby search now applies the worldwide distance filter - Steam defaults to roughly same-region results, which would have hidden lobbies from cross-region testers even though joining them works fine. Co-Authored-By: Claude Fable 5 --- README.md | 86 ++++++++++++++++++++++++++++++++------------- RP_L4/RPL4LOBBY.cpp | 4 +++ 2 files changed, 66 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index ca6af25..4e530f0 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,75 @@ -# Red Planet 4.12 +# Red Planet 4.12 — the Steamification -**Red Planet** is the VWE pod-racing game built on the in-house **MUNGA** engine -(Win32 / DirectX 9, `MUNGA_L4` platform layer). The **4.12** line is the -consumer port: a version of Red Planet that can be **sold on Steam** and played -over **internet multiplayer**, without cockpit-pod hardware. +**Red Planet** is VWE's pod-racing game: eight-player VTV races on Mars, +originally played from inside full-motion cockpit pods. This repo is the +third life of that code: -Forked from [RP411](https://gitea.mysticmachines.com/VWE/RP411.git) -(the arcade/cockpit 4.11 line) with full history preserved. +| 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 arcade 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 sellable on Steam and playable over the internet with no cockpit hardware | -## Goals +The architecture is deliberately conservative: the arcade's design survives +intact, with each pod-era dependency replaced by a consumer equivalent +behind the engine's existing seams. -1. **Steam distribution** — Steamworks integration, SteamPipe builds, store-ready packaging. -2. **Internet multiplayer** — take the engine's LAN-era WinSock networking online - (NAT traversal, matchmaking, latency tolerance). -3. **No cockpit required** — keyboard / mouse / gamepad input and on-screen - replacements for the pod's RIO panel and plasma display, drawing on - [vRIO](https://gitea.mysticmachines.com/VWE/VRIO.git). -4. **Self-hosted sessions** — in-game race setup/join replacing the operator-driven - [TeslaConsole](https://gitea.mysticmachines.com/VWE/TeslaSuite.git) flow. +| 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 1995) | +| 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 | -See [docs/RP412-ROADMAP.md](docs/RP412-ROADMAP.md) for the plan and the -Steam-multiplayer logistics. +**Status: it works.** Release +[v4.12.1](https://gitea.mysticmachines.com/VWE/RP412/releases/tag/v4.12.1) +carries 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. + +## Playing + +Grab the release zip (or run `pack-dist.ps1` on a build). Single player: +run `start-windowed.bat` — the game boots into the race setup menu. 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 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. ## Building -Unchanged from 4.11 for now — see [BUILD.md](BUILD.md) -(VS 2005/2008 + DirectX SDK June 2010, `Release|Win32`, output `Release\rpl4opt.exe`). -Toolchain modernization is a roadmap item. +**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/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 | +| [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 arcade source (this repo's base) | -| [VRIO](https://gitea.mysticmachines.com/VWE/VRIO.git) | Virtual RIO panel + vPLASMA display — input bindings and display emulation to fold in | -| [TeslaSuite](https://gitea.mysticmachines.com/VWE/TeslaSuite.git) | TeslaConsole / Launcher / vPOD — the arcade session-control stack 4.12 replaces (and a reference for the Munga control protocol, TCP 1501) | +| [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) | diff --git a/RP_L4/RPL4LOBBY.cpp b/RP_L4/RPL4LOBBY.cpp index 1264262..3e9fcba 100644 --- a/RP_L4/RPL4LOBBY.cpp +++ b/RP_L4/RPL4LOBBY.cpp @@ -665,6 +665,10 @@ int gCallDone = False; SteamMatchmaking()->AddRequestLobbyListStringFilter( kLobbyTagKey, "1", k_ELobbyComparisonEqual); + // the default lobby search is distance-filtered (roughly same + // region) - RP412 races are worldwide + SteamMatchmaking()->AddRequestLobbyListDistanceFilter( + k_ELobbyDistanceFilterWorldwide); SteamAPICall_t call = SteamMatchmaking()->RequestLobbyList(); gCalls.listResult.Set(call, &gCalls, &LobbyCalls::OnList); if (!WaitForCall(15000))