Skip to main content

Multiplayer by default

The Summer SDK contract is multiplayer-native. The default example is host-authoritative: the server runs the rules, clients render synced state, and a min_players of 1 means the same build is also a solo game. You write SummerGame hooks and synced state in GDScript; the Summer SDK defines the creator-facing contract. The SDK/runtime surfaces on this page are scaffolded, not a deployed hosted gameplay path. Check platform capability status before making production promises. What you build here:
  • extends SummerGame,
  • server-authoritative gameplay updates (Summer.is_server()),
  • player-visible state via set_synced,
  • 1–8 players from the same code path,
  • passes local testing and the submission pipeline.
Want an AI agent to run this whole page for you? Point it at /agent-setup — the prompt there contains a complete verified template (project files, local SDK stubs, export preset) and the publish calls.

Step 1: Create manifest.json

min_players: 1, max_players: 8 is the multiplayer-native default — ship it unless your design demands otherwise. Paths are relative to the manifest at the pack root.

Step 2: Choose Your Player Path

3D Action Template (fastest start)

  • set player.tscn root script to res://sdk/summer_character_3d.gd
  • use apply_default_movement(...) from SummerGame.

Custom Genre Path (2D/card/RTS/puzzle)

  • make your own script extending SummerPlayer
  • sync your own state model (set_synced("hand_count", ...), etc.).
Either way the authority rule is identical: the server writes synced state, clients read it.

Step 3: Build main.gd

Give main.tscn a SpawnPoints node with at least 4 child Node3D spawn markers and a Players node — the multiplayer defaults assume them.

Step 4: Add One Multiplayer Rule

Example scoring rule — note it runs only on the server path, and clients see it through set_synced:

Step 5: Local Test

Start with the canonical one-process Summer Engine smoke checks. If your starter project includes the optional loopback runner, also use it to exercise a local server/client path:
  • the canonical agent prompt validates import, parsing, smoke execution, banned patterns, and pack contents with local SDK stubs;
  • the optional loopback runner starts a local headless server and connects a client to localhost;
  • neither path validates production platform services, ticket redemption, or hosted matchmaking.
Guide: Testing Your Game Locally. Building outside Summer Engine (agent/CLI workflow)? The same page covers stub-based validation, and the /agent-setup prompt automates it.

Step 6: Export and Publish

Export a game-only .pck, then publish it through the live release API (create game → presigned upload → server-verified finalize → manual review): A human reviews every release. Approval assigns published catalog status and makes the release available under the documented authenticated download rules. Browser and desktop-shell play of uploaded Summer games are not live yet.

What “Done” Looks Like

  • All lifecycle hooks implemented.
  • Server authority enforced (Summer.is_server()).
  • Player-visible state comes from set_synced.
  • Works with 1 player and with several (min_players: 1).
  • Canonical Summer Engine smoke checks pass.
  • Optional local loopback runner passes when present.
  • Export contains only game files; release enters pending_review.

Previous: Create a Summer game

Return to project creation and the GDScript starting point.

Next: Choose Summer SDK capabilities

Use the lifecycle hub to select the SDK systems your game needs.