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.tscnroot script tores://sdk/crafty_character_3d.gd - use
apply_default_movement(...)fromCraftyGame.
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.
Step 6: Export and Upload
Export a game-only.pck, then upload with manifest.json.
Guides:
- /api-reference/crafty-sdk/exporting-and-uploading-your-game
- /api-reference/crafty-sdk/submission-guide
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.

