# Tech Stack ## Engine & Language - **Engine:** Godot 4.7 (Forward Plus renderer) - **Language:** GDScript - **Project path:** `/mnt/code/spacewar/spacewar/` (inner folder is the Godot project root) - **Platform target:** Linux (Steam Deck native, 1280×800), Windows PC - **Art style:** Pixel art (placeholder sprites in use currently) See `structure.md` for the full file tree and scene graph. --- ## Multiplayer Architecture (Planned) ``` [Client] ──── [Matchmaking Server] ──── [Dedicated Game Server] │ [Backend API] (queue, ranks, accounts) ``` ### Authoritative Server Model - Dedicated game servers run the authoritative simulation (not player-hosted) - Clients send **inputs** (movement, fire, ability) — server validates and broadcasts results - No client-side cheating possible on critical state (position, HP, kills) - Player position simulated server-side; clients predict locally and reconcile ### Godot Networking Layer ```gdscript # Server: move a player @rpc("authority", "call_local", "reliable") func set_position(new_pos: Vector2) -> void: position = new_pos # Client: send input to server @rpc("any_peer", "call_remote", "unreliable") func send_input(dir: Vector2, firing: bool) -> void: pass ``` - **Transport:** ENet (UDP, built into Godot) for low-latency game data - **Reliable channel:** critical state (HP, death, respawn) - **Unreliable channel:** high-frequency position/velocity updates ### Client-Side Prediction & Lag Compensation 1. Client predicts own movement locally (feels instant) 2. Server confirms or corrects (reconciliation) 3. Other players interpolated between last two known positions 4. Lag compensation: server rewinds state slightly to validate hitscan shots ### Matchmaking Backend | Component | Tech | |-----------|------| | API Server | Go or Node.js | | Queue / State | Redis | | Database (accounts, ranks) | PostgreSQL | | Hosting | VPS (Hetzner / DigitalOcean) or self-hosted | **Flow:** 1. Client sends "find match" with MMR + mode 2. Backend queues player, finds lobby within MMR range 3. Lobby full → backend assigns a game server 4. Backend sends client the server IP + session token 5. Client connects directly to game server ### Steam Integration - **GodotSteam** plugin (open source, wraps Steamworks SDK) - Handles: Steam auth, VAC anti-cheat, Steam lobbies, achievements - No separate account system needed at launch --- ## Networking Checklist - [ ] Godot ENet server/client setup - [ ] Player input RPC structure - [ ] Position sync with interpolation - [ ] Ship class registration per peer - [ ] Server-authoritative health/death - [ ] Matchmaking API (queue + lobby assignment) - [ ] GodotSteam auth + VAC - [ ] Lag compensation (basic rewind)