Files
spacetris/docs/ai/cooperate_network.md
2025-12-23 17:16:12 +01:00

5.2 KiB
Raw Permalink Blame History

Spacetris — COOPERATE Mode

Network Multiplayer (2 PLAYER NETWORK)

VS Code Copilot AI Agent Prompt

You are integrating online cooperative multiplayer into an existing C++ / SDL3 game called Spacetris.

This feature extends the existing COOPERATE mode to support:

  • Local 2 players
  • Human + AI
  • Human + Human over network (NEW)

The networking solution must be deterministic, lightweight, and stable.


1. High-Level Goal

Add COOPERATE 2 PLAYER (NETWORK) mode where:

  • Two players play together over the internet
  • Each player controls one half of the shared grid
  • A line clears only when both halves are filled
  • Gameplay remains identical to local COOPERATE mode

2. Technology Constraints

  • Language: C++
  • Engine: SDL3
  • Networking: ENet (UDP with reliability)
  • No engine rewrite
  • No authoritative server logic required (co-op only)

SDL3 is used ONLY for:

  • Rendering
  • Input
  • Timing

Networking is a separate layer.


3. Network Model (MANDATORY)

Use Input Lockstep Networking

Core idea:

  • Both clients run the same deterministic simulation
  • Only player inputs are sent over the network
  • No board state is transmitted
  • Both simulations must remain identical

This model is ideal for Tetris-like games.


4. Determinism Requirements (CRITICAL)

To ensure lockstep works:

  • Fixed simulation tick (e.g. 60 Hz)
  • Identical RNG seed for both clients
  • Deterministic piece generation (bag system)
  • No floating-point math in core gameplay
  • Same gravity, rotation, lock-delay logic
  • Identical line clear and scoring rules

Before networking:

  • Input recording + replay must produce identical results

5. Network Topology

Host / Client Model (Initial Implementation)

  • One player hosts the game
  • One player joins
  • Host is authoritative for:
    • RNG seed
    • start tick
    • game settings

This is sufficient and fair for cooperative gameplay.


6. Network Library

Use ENet for:

  • Reliable, ordered UDP packets
  • Low latency
  • Simple integration with C++

Do NOT use:

  • SDL_net
  • TCP-only networking
  • High-level matchmaking SDKs

7. Network Packet Design

Input Packet (Minimal)

struct InputPacket {
    uint32_t tick;
    uint8_t buttons; // bitmask
};

Button bitmask example:

  • bit 0 → move left
  • bit 1 → move right
  • bit 2 → rotate
  • bit 3 → soft drop
  • bit 4 → hard drop
  • bit 5 → hold

Packets must be:

  • Reliable
  • Ordered
  • Small

8. Tick & Latency Handling

  • Add fixed delay: 46 ticks
  • Simulate tick T using inputs for T + delay
  • Prevents stalls due to latency spikes

Strict lockstep without buffering is NOT recommended.


9. Desync Detection (IMPORTANT)

Every N ticks (e.g. once per second):

  • Compute a hash of:

    • Both grid halves
    • Active pieces
    • RNG index
    • Score / lines / level
  • Exchange hashes

  • If mismatch:

    • Log desync
    • Stop game or mark session invalid

This is required for debugging and stability.


10. Network Session Architecture

Create a dedicated networking module:

/network
  NetSession.h
  NetSession.cpp

Responsibilities:

  • ENet host/client setup
  • Input packet send/receive
  • Tick synchronization
  • Latency buffering
  • Disconnect handling

SDL main loop must NOT block on networking.


11. Integration with Existing COOPERATE Logic

  • COOPERATE grid logic stays unchanged
  • SyncLineRenderer remains unchanged
  • Scoring logic remains unchanged
  • Network layer only injects remote inputs

Game logic should not know whether partner is:

  • Local human
  • AI
  • Network player

12. UI Integration (Menu Changes)

In COOPERATE selection screen, add a new button:

[ LOCAL CO-OP ]   [ AI PARTNER ]   [ 2 PLAYER (NETWORK) ]

On selecting 2 PLAYER (NETWORK):

  • Show:

    • Host Game
    • Join Game
  • Display join code or IP

  • Confirm connection before starting


13. Start Game Flow (Network)

  1. Host creates session

  2. Client connects

  3. Host sends:

    • RNG seed
    • start tick
    • game settings
  4. Both wait until agreed start tick

  5. Simulation begins simultaneously


14. Disconnect & Error Handling

  • If connection drops:

    • Pause game

    • Show “Reconnecting…”

    • After timeout:

      • End match or switch to AI (optional)
  • Never crash

  • Never corrupt game state


15. What NOT to Implement

  • Full state synchronization
  • Prediction / rollback
  • Server-authoritative gameplay
  • Complex matchmaking
  • Versus mechanics

This is cooperative, not competitive.


16. Acceptance Criteria

  • Two players can complete COOPERATE mode over network
  • Gameplay matches local COOPERATE exactly
  • No noticeable input lag under normal latency
  • Desync detection works
  • Offline / disconnect handled gracefully
  • SDL3 render loop remains smooth

17. Summary for Copilot

Integrate networked cooperative multiplayer into Spacetris using SDL3 + C++ with ENet. Implement input lockstep networking with deterministic simulation, fixed tick rate, input buffering, and desync detection. Add a new COOPERATE menu option “2 PLAYER (NETWORK)” that allows host/join flow. Networking must be modular, non-blocking, and transparent to existing gameplay logic.