Files
CosmicClash/multiplayer-next.md
T
Josh Creek 3aa0f5b9c2 docs: scope casual and ranked matchmaking as a 1.0 launch blocker
Queued matchmaking had never been considered anywhere in the planning
docs - not as planned work, and not even on the explicitly-deferred
list. It is a launch requirement, so record the design before code.

Add docs/MATCHMAKING.md covering the model change (community-server ->
per-match allocation), the decision to use Steam for identity and a
project-owned backend for queue/rating/allocation, what the existing
server already provides (--max-matches=1 is the allocation primitive,
ServerConfig, the roster, MatchState), the casual/ranked ruleset split,
and the open questions - rating algorithm, team-to-individual rating,
and the server cost that allocated matches reintroduce.

Ranked is hard-blocked on Phase 7 Steam auth tickets: slot reclaim is
keyed by display name today, and a rating on a spoofable identity is
worse than no rating.

Add Phase 8 to multiplayer-next.md, and correct README/CLAUDE.md/
TECH_STACK.md, which asserted no backend exists or is planned - true
before this was scoped, wrong now.
2026-08-31 18:33:36 +01:00

3.4 KiB

Multiplayer — next work

Short, current checklist for online multiplayer. Historical design decisions, implementation evidence, and completed work stay in multiplayer-todo.md.

Release blockers

  • Phase 4 playtest: a human playtest at roughly 100 ms RTT. Confirm that ship and ball interaction feel local and contact corrections feel like bumps rather than glitches.
  • Phase 5 session: complete a real 3v3 match with a mid-match disconnect and late joiner.
  • Phase 6 external check: run the exported Docker server and clients from separate machines over the internet, then play a full match. Keep this controlled-only until Steam identity is complete.

Phase 7 — Steam, identity, discovery

  • Obtain the pinned GodotSteam client/server builds and Steamworks SDK access described in STEAM.md.
  • Run make verify-steam-templates with the custom executables and fix any custom-template failures.
  • Validate a two-account Steam SDR host/join using the existing explicit NetworkManager Steam transport. ENet direct-IP must keep passing its smoke test.
  • Build the Steam server browser: internet, LAN, favourites, and history.
  • Add Steam auth tickets, verified Steam identity in the roster, and a persistent ban list. This fixes the slot-reclaim security issue below.

Phase 8 — casual and ranked matchmaking (1.0 launch blocker)

Design and reasoning: docs/MATCHMAKING.md. This is a different server model from the community-server one that exists today — players queue, a matchmaker groups them, and a server is allocated per match. Phase 7's Steam auth tickets are a hard prerequisite: a rating attached to a spoofable identity is worse than no rating.

  • Decide the rating algorithm (Glicko-2 recommended over Elo for a small launch population) and how a team result distributes across individuals.
  • Choose the backend language and hosting, and cost out allocated servers per match at expected population.
  • Stand up the backend: Steam auth ticket validation via the Steamworks Web API, queue, rating store, server allocator.
  • Add an assigned-roster server mode so only matched SteamIDs may claim a slot, replacing the first-come model.
  • Add server-authoritative match result reporting to the backend over a channel a client cannot forge.
  • Client queue UI: playlist select, estimated wait, accept/decline, connect-on-assignment, post-match rating delta.
  • Casual and ranked playlist rulesets (backfill, bots, abandon penalties, arena restriction — see the comparison table in the design doc).

Known issues to resolve before public hosting

  • Slot reclaim is currently keyed by display name, so someone can take a disconnected player's reserved slot. Do not expose public servers before verified Steam identity lands.
  • Investigate occasional input loss during a long server stall; the existing sequence resync recovers it, but transport delivery is variable.
  • Fix the remaining _broadcast_snapshot packet-send stderr race.

Decide after the latency playtest

  • Decide whether client-only, contact-cohort shadow physics is worthwhile for the remaining prediction weakness.

Explicitly deferred

120 Hz simulation, latency-gap measurement, audio hooks, and split-screen are not part of the current multiplayer release path.