Skip to main content

What You Build

A minimal multiplayer integration that:
  • extends CraftyGame,
  • uses server-authoritative gameplay updates,
  • syncs player-visible state with set_synced,
  • passes local testing and submission pipeline.

Step 1: Create manifest.json

Step 2: Choose Your Player Path

3D Action Template (fastest start)

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

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

  • make your own script extending CraftyPlayer
  • sync your own state model (set_synced("hand_count", ...), etc.).

Step 3: Build main.gd

Step 4: Add One Multiplayer Rule

Example scoring rule:

Step 5: Local Test

Use the two-process test runner flow:
  • starts local headless server,
  • starts client and connects to localhost,
  • validates real multiplayer behavior.
Guide:

Step 6: Export and Upload

Export a game-only .pck, then upload with manifest.json. Guides:

What “Done” Looks Like

  • All lifecycle hooks implemented.
  • Server authority enforced (Crafty.is_server()).
  • Player-visible state comes from set_synced.
  • Local test runner path passes.
  • Upload passes scanner + enters review.