mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-13 15:42:14 +00:00
feat(multiplayer): Phase 1 transport, connection, and lobby
Lands tasks 1.0-1.8 of multiplayer-todo.md: the pure-function test runner, net_codec (wire format quantizers/pack-unpack), NetworkManager (ENet transport, manual polling, min-RTT clock sync), MatchNet (handshake, protocol/tick-rate gating, roster with team+ready state), lobby.tscn (team columns, switch team, ready toggle), server_boot.tscn (headless dedicated server with structured logging and an overrun watchdog), and main_menu.gd's Host/Join-by-IP UI (connecting overlay, cancel, bounded failure path). Followed by an adversarial review (Opus subagent) that found and fixed two real bugs - an unvalidated player_name broadcast that let one client's oversized name head-of-line-block the reliable channel for everyone, and a server-side roster leak across a host/re-host cycle - plus three gaps in the test suite itself where a claim of "verified" wasn't actually backed by what the test checked. All five two-process smoke tests plus the pure-function suite are green with the strengthened assertions in place.
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
extends RefCounted
|
||||
|
||||
# Plain data holder for one body's snapshot state (§2.4 of multiplayer-todo.md).
|
||||
# Deliberately not Ship/Ball themselves, and deliberately not a scene-tree
|
||||
# node — NetCodec's pack/unpack must stay callable from pure-function tests
|
||||
# with no live scene. Phase 2's snapshot writer fills one of these per body
|
||||
# per tick from the real RigidBody3D state; Phase 2's interpolator does the
|
||||
# reverse.
|
||||
#
|
||||
# avel_range must match what the sender quantised with (SHIP_AVEL_RANGE vs
|
||||
# BALL_AVEL_RANGE in net_codec.gd) — it is not carried on the wire, because
|
||||
# slot order already tells both peers which body is which (§1.3: "entities
|
||||
# are addressed by integer slot, never by path").
|
||||
|
||||
var position := Vector3.ZERO
|
||||
var rotation := Quaternion.IDENTITY
|
||||
var linear_velocity := Vector3.ZERO
|
||||
var angular_velocity := Vector3.ZERO
|
||||
var frozen := false
|
||||
var turbo := false
|
||||
var thrust_z := 0.0 # -1..1; re-quantised to a 3-bit bin on the wire
|
||||
var stalled := false
|
||||
var avel_range := 4.0 # NetCodec.SHIP_AVEL_RANGE; set to BALL_AVEL_RANGE for the ball
|
||||
Reference in New Issue
Block a user