Files
client/overview/tech.md
T
anekdotin e1410c234a Initial commit before folder reorganization
Checkpoint of the existing flat file layout prior to restructuring
into autoload/, menu/, ships/, world/, and assets/ folders.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 20:26:48 -04:00

2.7 KiB
Raw Blame History

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

# 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)