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>
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user