summer-engine 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +27 -5
- package/.codex-plugin/plugin.json +28 -6
- package/.cursor-plugin/plugin.json +27 -5
- package/.factory-plugin/plugin.json +27 -5
- package/.opencode/plugins/summer.js +1 -1
- package/CHANGELOG.md +120 -0
- package/README.md +22 -7
- package/assets/audit/scene_audit.gd +4136 -0
- package/assets/seeing/seeing_probe.gd +1873 -0
- package/dist/cli/commands/setup.js +6 -19
- package/dist/cli/commands/skills.js +57 -32
- package/dist/core/api-client.d.ts +9 -1
- package/dist/core/api-client.js +21 -4
- package/dist/core/capabilities/agent-playbook.js +46 -0
- package/dist/core/capabilities/audit/accept.d.ts +55 -0
- package/dist/core/capabilities/audit/accept.js +147 -0
- package/dist/core/capabilities/audit/args.d.ts +95 -0
- package/dist/core/capabilities/audit/args.js +89 -0
- package/dist/core/capabilities/audit/audit.d.ts +56 -0
- package/dist/core/capabilities/audit/audit.js +287 -0
- package/dist/core/capabilities/audit/frame.d.ts +14 -0
- package/dist/core/capabilities/audit/frame.js +35 -0
- package/dist/core/capabilities/audit/gaps.d.ts +96 -0
- package/dist/core/capabilities/audit/gaps.js +257 -0
- package/dist/core/capabilities/audit/judge.d.ts +162 -0
- package/dist/core/capabilities/audit/judge.js +1134 -0
- package/dist/core/capabilities/audit/math.d.ts +110 -0
- package/dist/core/capabilities/audit/math.js +263 -0
- package/dist/core/capabilities/audit/summary.d.ts +74 -0
- package/dist/core/capabilities/audit/summary.js +212 -0
- package/dist/core/capabilities/board.d.ts +31 -0
- package/dist/core/capabilities/board.js +43 -0
- package/dist/core/capabilities/camera-view.d.ts +4 -2
- package/dist/core/capabilities/camera-view.js +6 -3
- package/dist/core/capabilities/connect-signal.d.ts +85 -0
- package/dist/core/capabilities/connect-signal.js +285 -0
- package/dist/core/capabilities/engine-fallbacks.d.ts +5 -0
- package/dist/core/capabilities/engine-fallbacks.js +5 -0
- package/dist/core/capabilities/engine-ops.d.ts +5 -1
- package/dist/core/capabilities/engine-ops.js +0 -3
- package/dist/core/capabilities/engine-receipt.d.ts +12 -0
- package/dist/core/capabilities/engine-receipt.js +26 -0
- package/dist/core/capabilities/file-read.d.ts +64 -0
- package/dist/core/capabilities/file-read.js +325 -0
- package/dist/core/capabilities/game-task-plan.js +4 -2
- package/dist/core/capabilities/grep.d.ts +60 -0
- package/dist/core/capabilities/grep.js +190 -0
- package/dist/core/capabilities/inspect-node.d.ts +56 -0
- package/dist/core/capabilities/inspect-node.js +225 -0
- package/dist/core/capabilities/inspect-resource.d.ts +61 -0
- package/dist/core/capabilities/inspect-resource.js +376 -0
- package/dist/core/capabilities/math3d.d.ts +28 -0
- package/dist/core/capabilities/math3d.js +88 -0
- package/dist/core/capabilities/motion-generation.d.ts +62 -0
- package/dist/core/capabilities/motion-generation.js +138 -0
- package/dist/core/capabilities/placement-batch.d.ts +102 -0
- package/dist/core/capabilities/placement-batch.js +483 -0
- package/dist/core/capabilities/placement-math.d.ts +70 -0
- package/dist/core/capabilities/placement-math.js +209 -0
- package/dist/core/capabilities/placement-script.d.ts +42 -0
- package/dist/core/capabilities/placement-script.js +1096 -0
- package/dist/core/capabilities/placement.d.ts +485 -0
- package/dist/core/capabilities/placement.js +1731 -0
- package/dist/core/capabilities/project-context.d.ts +33 -2
- package/dist/core/capabilities/project-context.js +87 -4
- package/dist/core/capabilities/replace-node.d.ts +91 -0
- package/dist/core/capabilities/replace-node.js +423 -0
- package/dist/core/capabilities/runtime-control.d.ts +20 -4
- package/dist/core/capabilities/runtime-control.js +67 -2
- package/dist/core/capabilities/scene-batch.d.ts +63 -0
- package/dist/core/capabilities/scene-batch.js +394 -0
- package/dist/core/capabilities/scene-readback.d.ts +36 -0
- package/dist/core/capabilities/scene-readback.js +54 -0
- package/dist/core/capabilities/seeing/args.d.ts +348 -0
- package/dist/core/capabilities/seeing/args.js +178 -0
- package/dist/core/capabilities/seeing/candidates.d.ts +127 -0
- package/dist/core/capabilities/seeing/candidates.js +282 -0
- package/dist/core/capabilities/seeing/math.d.ts +134 -0
- package/dist/core/capabilities/seeing/math.js +269 -0
- package/dist/core/capabilities/seeing/probe.d.ts +62 -0
- package/dist/core/capabilities/seeing/probe.js +188 -0
- package/dist/core/capabilities/seeing/scoring.d.ts +235 -0
- package/dist/core/capabilities/seeing/scoring.js +639 -0
- package/dist/core/capabilities/seeing/seeing.d.ts +233 -0
- package/dist/core/capabilities/seeing/seeing.js +1341 -0
- package/dist/core/capabilities/seeing/shot-store.d.ts +52 -0
- package/dist/core/capabilities/seeing/shot-store.js +204 -0
- package/dist/core/capabilities/surface-snap-mesh.d.ts +88 -0
- package/dist/core/capabilities/surface-snap-mesh.js +425 -0
- package/dist/core/capabilities/surface-snap.d.ts +77 -0
- package/dist/core/capabilities/surface-snap.js +461 -0
- package/dist/core/capabilities/tool-dispatch.js +231 -72
- package/dist/core/capabilities/tscn.d.ts +85 -0
- package/dist/core/capabilities/tscn.js +391 -0
- package/dist/core/capabilities/world-snapshot.d.ts +58 -0
- package/dist/core/capabilities/world-snapshot.js +150 -0
- package/dist/core/capability-skew.d.ts +5 -5
- package/dist/core/capability-skew.js +14 -6
- package/dist/core/headless/worker-engine-client.d.ts +1 -1
- package/dist/core/headless/worker-engine-client.js +2 -2
- package/dist/core/library-read.d.ts +37 -5
- package/dist/core/library-read.js +264 -33
- package/dist/core/library-search.d.ts +2 -2
- package/dist/core/skills-registry.d.ts +9 -1
- package/dist/core/skills-registry.js +25 -2
- package/dist/installer/agent-config.d.ts +9 -4
- package/dist/installer/agent-config.js +194 -392
- package/dist/installer/agent-table.d.ts +119 -0
- package/dist/installer/agent-table.js +619 -0
- package/dist/installer/setup.js +4 -2
- package/dist/installer/skill-locations.d.ts +8 -17
- package/dist/installer/skill-locations.js +22 -101
- package/dist/installer/version-check.d.ts +5 -1
- package/dist/installer/version-check.js +38 -28
- package/dist/mcp/server.js +9 -3
- package/dist/mcp/tools/asset-tools.js +21 -3
- package/dist/mcp/tools/audit-tools.d.ts +23 -0
- package/dist/mcp/tools/audit-tools.js +60 -0
- package/dist/mcp/tools/debug-tools.js +3 -1
- package/dist/mcp/tools/file-tools.js +17 -4
- package/dist/mcp/tools/generate-tools.js +74 -66
- package/dist/mcp/tools/library-tools.js +2 -0
- package/dist/mcp/tools/perception-tools.js +6 -19
- package/dist/mcp/tools/placement-tools.d.ts +24 -0
- package/dist/mcp/tools/placement-tools.js +91 -0
- package/dist/mcp/tools/project-tools.js +18 -15
- package/dist/mcp/tools/scene-tools.js +71 -83
- package/dist/mcp/tools/seeing-tools.d.ts +24 -0
- package/dist/mcp/tools/seeing-tools.js +64 -0
- package/dist/mcp/tools/spatial-tools.js +17 -9
- package/dist/mcp/tools/visual-tools.js +59 -7
- package/gemini-extension.json +26 -4
- package/integrations/README.md +48 -19
- package/integrations/amp/README.md +12 -0
- package/integrations/amp/manifest-target.json +3 -0
- package/integrations/antigravity/README.md +12 -0
- package/integrations/antigravity/manifest-target.json +3 -0
- package/integrations/claude-desktop/README.md +12 -0
- package/integrations/claude-desktop/manifest-target.json +3 -0
- package/integrations/cline/README.md +8 -9
- package/integrations/cline-cli/README.md +12 -0
- package/integrations/cline-cli/manifest-target.json +3 -0
- package/integrations/copilot-jetbrains/README.md +12 -0
- package/integrations/copilot-jetbrains/manifest-target.json +3 -0
- package/integrations/crush/README.md +12 -0
- package/integrations/crush/manifest-target.json +3 -0
- package/integrations/github-copilot/README.md +8 -8
- package/integrations/goose/README.md +12 -0
- package/integrations/goose/manifest-target.json +3 -0
- package/integrations/grok-build/README.md +12 -0
- package/integrations/grok-build/manifest-target.json +3 -0
- package/integrations/hermes/README.md +12 -0
- package/integrations/hermes/manifest-target.json +3 -0
- package/integrations/junie/README.md +12 -0
- package/integrations/junie/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +6 -10
- package/integrations/kimi-code/README.md +12 -0
- package/integrations/kimi-code/manifest-target.json +3 -0
- package/integrations/kiro/README.md +12 -0
- package/integrations/kiro/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +8 -8
- package/integrations/mistral-vibe/README.md +12 -0
- package/integrations/mistral-vibe/manifest-target.json +3 -0
- package/integrations/opencode/README.md +9 -12
- package/integrations/qoder/README.md +12 -0
- package/integrations/qoder/manifest-target.json +3 -0
- package/integrations/qwen-code/README.md +12 -0
- package/integrations/qwen-code/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +8 -7
- package/integrations/rovo-dev/README.md +12 -0
- package/integrations/rovo-dev/manifest-target.json +3 -0
- package/integrations/trae/README.md +12 -0
- package/integrations/trae/manifest-target.json +3 -0
- package/integrations/visual-studio/README.md +12 -0
- package/integrations/visual-studio/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +9 -9
- package/integrations/warp/README.md +12 -0
- package/integrations/warp/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +8 -9
- package/integrations/zed/README.md +12 -0
- package/integrations/zed/manifest-target.json +3 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +59 -15
- package/library/references/mcp-tools-reference/resource.yaml +1 -1
- package/library/references/summer-folder/resource.yaml +1 -1
- package/library/references/summer-folder/summer-folder.md +1 -1
- package/library/skills/3d-lighting/SKILL.md +1 -1
- package/library/skills/README.md +264 -0
- package/library/skills/adaptive-music/SKILL.md +1 -1
- package/library/skills/agent-playtesting/SKILL.md +1 -1
- package/library/skills/ai-characters-in-games/SKILL.md +220 -0
- package/library/skills/ai-characters-in-games/resource.yaml +30 -0
- package/library/skills/ambient-bed/SKILL.md +1 -1
- package/library/skills/animated-loop/SKILL.md +1 -1
- package/library/skills/animation-tree/SKILL.md +1 -1
- package/library/skills/art-direction/SKILL.md +1 -1
- package/library/skills/asset-strategy/SKILL.md +2 -1
- package/library/skills/asset-strategy/resource.yaml +2 -1
- package/library/skills/audio-direction/SKILL.md +1 -1
- package/library/skills/auto-fire-targeting/SKILL.md +1 -1
- package/library/skills/brainstorm-game/SKILL.md +1 -1
- package/library/skills/brainstorming/SKILL.md +1 -1
- package/library/skills/browse-templates/SKILL.md +3 -3
- package/library/skills/browse-templates/resource.yaml +1 -1
- package/library/skills/camera-rigs/SKILL.md +128 -0
- package/library/skills/camera-rigs/resource.yaml +29 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +1 -1
- package/library/skills/character-animation-wiring/SKILL.md +1 -1
- package/library/skills/character-model/SKILL.md +1 -1
- package/library/skills/character-movement/SKILL.md +326 -0
- package/library/skills/character-movement/references/default-third-person-controller.gd +201 -0
- package/library/skills/character-movement/references/default-third-person-verification-probe.gd +154 -0
- package/library/skills/character-movement/references/movement-3d.md +136 -0
- package/library/skills/character-movement/references/platformer-feel.md +83 -0
- package/library/skills/character-movement/resource.yaml +40 -0
- package/library/skills/character-portrait/SKILL.md +1 -1
- package/library/skills/cinematic-cutscene/SKILL.md +1 -1
- package/library/skills/combat-basics/SKILL.md +159 -0
- package/library/skills/combat-basics/references/projectiles-and-aoe.md +100 -0
- package/library/skills/combat-basics/resource.yaml +34 -0
- package/library/skills/concept-art/SKILL.md +1 -1
- package/library/skills/create-asset-sheet/SKILL.md +1 -1
- package/library/skills/debug/SKILL.md +1 -1
- package/library/skills/debugging-game-feel/SKILL.md +1 -1
- package/library/skills/design-level/SKILL.md +1 -1
- package/library/skills/design-mechanic/SKILL.md +1 -1
- package/library/skills/design-npc/SKILL.md +1 -1
- package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
- package/library/skills/dispatching-parallel-agents/SKILL.md +1 -1
- package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
- package/library/skills/environment-kit/SKILL.md +1 -1
- package/library/skills/export-and-ship/SKILL.md +1 -1
- package/library/skills/fabricating-assets/SKILL.md +1 -1
- package/library/skills/facial-and-lipsync/SKILL.md +1 -1
- package/library/skills/fps-controller/SKILL.md +9 -7
- package/library/skills/fps-controller/resource.yaml +4 -1
- package/library/skills/game-feel/SKILL.md +1 -1
- package/library/skills/gameskill/SKILL.md +1 -1
- package/library/skills/gdscript-patterns/SKILL.md +1 -1
- package/library/skills/generate-motion/SKILL.md +9 -9
- package/library/skills/generate-motion/resource.yaml +2 -1
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
- package/library/skills/headless-scripting/SKILL.md +1 -1
- package/library/skills/in-game-purchases/SKILL.md +254 -0
- package/library/skills/in-game-purchases/resource.yaml +29 -0
- package/library/skills/instantiate-asset-pack/SKILL.md +1 -1
- package/library/skills/investigating-bugs/SKILL.md +1 -1
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +1 -1
- package/library/skills/make-game/SKILL.md +25 -3
- package/library/skills/make-game/references/2d-platformer-polish.md +93 -0
- package/library/skills/make-game/references/2d-platformer.md +117 -0
- package/library/skills/make-game/references/2d-rpg-content.md +234 -0
- package/library/skills/make-game/references/2d-rpg.md +241 -0
- package/library/skills/make-game/references/2d-survivors-progression.md +201 -0
- package/library/skills/make-game/references/2d-survivors.md +237 -0
- package/library/skills/make-game/references/3d-fps-systems.md +216 -0
- package/library/skills/make-game/references/3d-fps.md +177 -0
- package/library/skills/make-game/references/3d-horror-systems.md +186 -0
- package/library/skills/make-game/references/3d-horror.md +201 -0
- package/library/skills/make-game/references/3d-third-person-systems.md +220 -0
- package/library/skills/make-game/references/3d-third-person.md +215 -0
- package/library/skills/make-game/resource.yaml +6 -1
- package/library/skills/multiplayer/SKILL.md +150 -0
- package/library/skills/multiplayer/resource.yaml +33 -0
- package/library/skills/multiplayer-movement/SKILL.md +510 -0
- package/library/skills/multiplayer-movement/files.md +501 -0
- package/library/skills/multiplayer-movement/resource.yaml +30 -0
- package/library/skills/multiplayer-project/SKILL.md +521 -0
- package/library/skills/multiplayer-project/files.md +448 -0
- package/library/skills/multiplayer-project/resource.yaml +36 -0
- package/library/skills/multiplayer-publish/SKILL.md +229 -0
- package/library/skills/multiplayer-publish/export-errors.md +89 -0
- package/library/skills/multiplayer-publish/resource.yaml +28 -0
- package/library/skills/multiplayer-state/SKILL.md +438 -0
- package/library/skills/multiplayer-state/files.md +592 -0
- package/library/skills/multiplayer-state/resource.yaml +35 -0
- package/library/skills/multiplayer-testing/SKILL.md +236 -0
- package/library/skills/multiplayer-testing/resource.yaml +39 -0
- package/library/skills/music-track/SKILL.md +1 -1
- package/library/skills/navigate-summer/SKILL.md +1 -1
- package/library/skills/new-project/SKILL.md +1 -1
- package/library/skills/organic-model/SKILL.md +1 -1
- package/library/skills/pixel-art/SKILL.md +1 -1
- package/library/skills/play/SKILL.md +1 -1
- package/library/skills/playtesting-a-feature/SKILL.md +1 -1
- package/library/skills/procedural-animation/SKILL.md +2 -2
- package/library/skills/procedural-animation/resource.yaml +1 -1
- package/library/skills/prop-model/SKILL.md +1 -1
- package/library/skills/psx-retro-rendering/SKILL.md +1 -1
- package/library/skills/realtime-wet-surfaces/SKILL.md +2 -2
- package/library/skills/remote-deploy/SKILL.md +1 -1
- package/library/skills/retarget/SKILL.md +1 -1
- package/library/skills/running-in-the-cloud/SKILL.md +1 -1
- package/library/skills/save-load/SKILL.md +156 -0
- package/library/skills/save-load/resource.yaml +27 -0
- package/library/skills/scene-composition/SKILL.md +1 -1
- package/library/skills/scene-hierarchy-design/SKILL.md +1 -1
- package/library/skills/scene-scripting/SKILL.md +1 -1
- package/library/skills/scene-to-level/SKILL.md +1 -1
- package/library/skills/skill-create/SKILL.md +1 -1
- package/library/skills/skill-improve/SKILL.md +1 -1
- package/library/skills/skill-test/SKILL.md +1 -1
- package/library/skills/skintokens-auto-rigging/SKILL.md +1 -1
- package/library/skills/skybox-panorama/SKILL.md +1 -1
- package/library/skills/sound-effect/SKILL.md +1 -1
- package/library/skills/spatial-placement/SKILL.md +134 -3
- package/library/skills/spatial-placement/references/kit-placement-tools.md +364 -0
- package/library/skills/spatial-placement/resource.yaml +16 -2
- package/library/skills/sprite-sheet/SKILL.md +1 -1
- package/library/skills/summer-analytics/SKILL.md +147 -0
- package/library/skills/summer-analytics/resource.yaml +28 -0
- package/library/skills/summer-friends/SKILL.md +226 -0
- package/library/skills/summer-friends/resource.yaml +28 -0
- package/library/skills/summer-leaderboards/SKILL.md +231 -0
- package/library/skills/summer-leaderboards/resource.yaml +30 -0
- package/library/skills/summer-match-results/SKILL.md +286 -0
- package/library/skills/summer-match-results/resource.yaml +32 -0
- package/library/skills/summer-matchmaking/SKILL.md +301 -0
- package/library/skills/summer-matchmaking/resource.yaml +32 -0
- package/library/skills/summer-parties/SKILL.md +253 -0
- package/library/skills/summer-parties/resource.yaml +30 -0
- package/library/skills/summer-player-data/SKILL.md +322 -0
- package/library/skills/summer-player-data/resource.yaml +30 -0
- package/library/skills/summer-store/SKILL.md +271 -0
- package/library/skills/summer-store/resource.yaml +29 -0
- package/library/skills/summer-world-chat/SKILL.md +195 -0
- package/library/skills/summer-world-chat/resource.yaml +30 -0
- package/library/skills/summer-world-saves/SKILL.md +284 -0
- package/library/skills/summer-world-saves/resource.yaml +29 -0
- package/library/skills/text-to-motion/SKILL.md +99 -0
- package/library/skills/text-to-motion/prompts-and-controls.md +34 -0
- package/library/skills/text-to-motion/resource.yaml +41 -0
- package/library/skills/text-to-motion/rigging-for-text-motion.md +54 -0
- package/library/skills/tileable-texture/SKILL.md +1 -1
- package/library/skills/trailer-shot/SKILL.md +1 -1
- package/library/skills/tune-performance/SKILL.md +1 -1
- package/library/skills/ui-basics/SKILL.md +10 -1
- package/library/skills/ui-graphics/SKILL.md +1 -1
- package/library/skills/use-widget-asset/SKILL.md +1 -1
- package/library/skills/using-summer/SKILL.md +2 -2
- package/library/skills/using-summer/resource.yaml +2 -2
- package/library/skills/vehicle-model/SKILL.md +1 -1
- package/library/skills/verification-before-completion/SKILL.md +1 -1
- package/library/skills/verifying-scenes/SKILL.md +76 -2
- package/library/skills/verifying-scenes/resource.yaml +13 -2
- package/library/skills/vfx-dissolve/SKILL.md +1 -1
- package/library/skills/vfx-fire/SKILL.md +1 -1
- package/library/skills/vfx-hit-spark/SKILL.md +1 -1
- package/library/skills/vfx-lightning/SKILL.md +1 -1
- package/library/skills/vfx-magic-glow/SKILL.md +1 -1
- package/library/skills/vfx-muzzle-flash/SKILL.md +1 -1
- package/library/skills/vfx-smoke/SKILL.md +1 -1
- package/library/skills/vfx-water-ripple/SKILL.md +1 -1
- package/library/skills/voice-line/SKILL.md +1 -1
- package/library/skills/web-and-touch-input/SKILL.md +38 -0
- package/library/skills/web-and-touch-input/resource.yaml +28 -0
- package/library/skills/web-compatibility-look/SKILL.md +62 -0
- package/library/skills/web-compatibility-look/resource.yaml +30 -0
- package/library/skills/world-building-3d/SKILL.md +8 -1
- package/library/skills/world-building-3d/references/spatial-tools.md +1 -1
- package/library/skills/world-building-3d/resource.yaml +2 -1
- package/library/skills/writing-plans/SKILL.md +1 -1
- package/library/skills/writing-skills/SKILL.md +1 -1
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +2 -2
- package/library/tools/attach-to-surface/resource.yaml +142 -0
- package/library/tools/batch/resource.yaml +9 -3
- package/library/tools/connect-ports/resource.yaml +120 -0
- package/library/tools/connect-signal/resource.yaml +3 -2
- package/library/tools/debug-views/resource.yaml +94 -0
- package/library/tools/frame-nodes/resource.yaml +104 -0
- package/library/tools/frame-shot/resource.yaml +134 -0
- package/library/tools/generate-motion/resource.yaml +44 -9
- package/library/tools/get-board/resource.yaml +50 -0
- package/library/tools/get-project-context/resource.yaml +13 -2
- package/library/tools/grep/resource.yaml +77 -0
- package/library/tools/inspect-asset/resource.yaml +71 -0
- package/library/tools/inspect-node/resource.yaml +9 -2
- package/library/tools/inspect-resource/resource.yaml +16 -5
- package/library/tools/instantiate-scene/resource.yaml +27 -2
- package/library/tools/measure/resource.yaml +96 -0
- package/library/tools/place-adjacent/resource.yaml +113 -0
- package/library/tools/play/resource.yaml +15 -2
- package/library/tools/raycast/resource.yaml +101 -0
- package/library/tools/read-file/resource.yaml +36 -2
- package/library/tools/read-library/resource.yaml +2 -2
- package/library/tools/repeat-along/resource.yaml +129 -0
- package/library/tools/replace-node/resource.yaml +11 -5
- package/library/tools/scene-audit/resource.yaml +144 -0
- package/library/tools/screenshot/resource.yaml +13 -2
- package/library/tools/search-assets/resource.yaml +18 -0
- package/library/tools/shot-sheet/resource.yaml +110 -0
- package/library/tools/snap-to-surface/resource.yaml +4 -1
- package/library/tools/world-snapshot/resource.yaml +24 -3
- package/library/tools/zoom/resource.yaml +105 -0
- package/package.json +3 -3
- package/registry/generated/aliases.json +17 -3
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +26 -4
- package/registry/generated/index.json +2154 -469
- package/registry/generated/marketplace.claude.json +2 -2
- package/registry/generated/plugin.claude.json +27 -5
- package/registry/generated/plugin.codex.json +28 -6
- package/registry/generated/plugin.cursor.json +27 -5
- package/registry/generated/plugin.factory.json +27 -5
- package/registry/generated/skills-index.md +264 -0
- package/registry/generated/skills-registry.json +901 -206
- package/registry/generated/templates-registry.json +2 -2
- package/library/skills/host-authoritative-state/SKILL.md +0 -332
- package/library/skills/host-authoritative-state/resource.yaml +0 -28
- package/library/skills/peer-to-peer-multiplayer/SKILL.md +0 -373
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +0 -28
- package/library/skills/setup-multiplayer/SKILL.md +0 -336
- package/library/skills/setup-multiplayer/resource.yaml +0 -28
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
# multiplayer-project: complete files
|
|
2
|
+
|
|
3
|
+
Every file below ran as shown under Local Play. Compare against your project, or copy a file whole.
|
|
4
|
+
|
|
5
|
+
## `authority/main.gd`
|
|
6
|
+
|
|
7
|
+
```gdscript
|
|
8
|
+
extends Node
|
|
9
|
+
## The match server. It runs headless and owns every rule.
|
|
10
|
+
|
|
11
|
+
const Game = preload("res://network/game.gd")
|
|
12
|
+
const PlayerArchetype = preload("res://authority/player_archetype.tres")
|
|
13
|
+
|
|
14
|
+
var spawner: SummerNetworkSpawner
|
|
15
|
+
var world: SummerNetworkWorld
|
|
16
|
+
var seat_of := {} # session_id -> seat, held until the Session leaves
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
func _ready() -> void:
|
|
20
|
+
spawner = Game.build_network(self, PlayerArchetype)
|
|
21
|
+
world = $World
|
|
22
|
+
spawner.entity_spawned.connect(_on_player_spawned)
|
|
23
|
+
spawner.command_received.connect(_on_command)
|
|
24
|
+
world.session_left.connect(_on_session_left)
|
|
25
|
+
var initialized: SummerResult = await Summer.initialize(Game.GAME_ID).get_result_or_completed_signal()
|
|
26
|
+
if not initialized.ok:
|
|
27
|
+
push_error(initialized.message)
|
|
28
|
+
return
|
|
29
|
+
if not world.is_ready():
|
|
30
|
+
await world.binding_ready
|
|
31
|
+
if not spawner.is_network_ready():
|
|
32
|
+
await spawner.network_ready
|
|
33
|
+
print("COURTYARD_AUTHORITY_READY")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
## A seat is a player's place in this World for their whole stay, across
|
|
37
|
+
## reconnects. Returns -1 when the World is full.
|
|
38
|
+
func _seat(session: SummerSession) -> int:
|
|
39
|
+
if seat_of.has(session.session_id):
|
|
40
|
+
return seat_of[session.session_id]
|
|
41
|
+
var taken := seat_of.values()
|
|
42
|
+
for seat in Game.MAX_PLAYERS:
|
|
43
|
+
if seat not in taken:
|
|
44
|
+
seat_of[session.session_id] = seat
|
|
45
|
+
return seat
|
|
46
|
+
return -1
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
## The Spawner spawns one player entity per joined player, once that player's
|
|
50
|
+
## network is ready (and again after a reconnect).
|
|
51
|
+
func _on_player_spawned(entity: SummerNetworkEntity) -> void:
|
|
52
|
+
print("COURTYARD_PLAYER_SPAWNED seat=%d entity=%d" % [_seat(entity.session), entity.entity_id])
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
func _on_command(request: SummerNetworkCommandRequest) -> void:
|
|
56
|
+
var command := Game.unpack(request.payload)
|
|
57
|
+
match str(command.get("c", "")):
|
|
58
|
+
"join":
|
|
59
|
+
_join(request)
|
|
60
|
+
_:
|
|
61
|
+
request.refuse(&"unknown_command")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
## A client sends "join" once its network is ready.
|
|
65
|
+
func _join(request: SummerNetworkCommandRequest) -> void:
|
|
66
|
+
var seat := _seat(request.get_session())
|
|
67
|
+
if seat < 0:
|
|
68
|
+
request.refuse(&"match_full")
|
|
69
|
+
return
|
|
70
|
+
request.accept({}, Game.pack({"seat": seat}))
|
|
71
|
+
print("COURTYARD_PLAYER_JOINED seat=%d" % seat)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
## The Session ended for good: free the seat and everything the player had.
|
|
75
|
+
func _on_session_left(session: SummerSession, reason: String) -> void:
|
|
76
|
+
var seat: int = seat_of.get(session.session_id, -1)
|
|
77
|
+
seat_of.erase(session.session_id)
|
|
78
|
+
print("COURTYARD_PLAYER_LEFT seat=%d reason=%s" % [seat, reason])
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## `authority/main.tscn`
|
|
82
|
+
|
|
83
|
+
```ini
|
|
84
|
+
[gd_scene load_steps=2 format=3]
|
|
85
|
+
|
|
86
|
+
[ext_resource type="Script" path="res://authority/main.gd" id="1"]
|
|
87
|
+
|
|
88
|
+
[node name="Authority" type="Node"]
|
|
89
|
+
script = ExtResource("1")
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## `authority/player_archetype.tres`
|
|
93
|
+
|
|
94
|
+
```ini
|
|
95
|
+
[gd_resource type="SummerEntityArchetype" load_steps=3 format=3]
|
|
96
|
+
|
|
97
|
+
[ext_resource type="SummerNetworkSchema" path="res://network/player_schema.tres" id="1"]
|
|
98
|
+
[ext_resource type="PackedScene" path="res://authority/player_model.tscn" id="2"]
|
|
99
|
+
|
|
100
|
+
[resource]
|
|
101
|
+
archetype_id = &"player"
|
|
102
|
+
network_schema = ExtResource("1")
|
|
103
|
+
authority_model_scene = ExtResource("2")
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## `authority/player_model.tscn`
|
|
107
|
+
|
|
108
|
+
```ini
|
|
109
|
+
[gd_scene format=3]
|
|
110
|
+
|
|
111
|
+
[node name="PlayerModel" type="Node3D"]
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## `client/main.gd`
|
|
115
|
+
|
|
116
|
+
```gdscript
|
|
117
|
+
extends Node
|
|
118
|
+
## What each player runs: joins the match and shows every player.
|
|
119
|
+
|
|
120
|
+
const Game = preload("res://network/game.gd")
|
|
121
|
+
const PlayerArchetype = preload("res://client/player_archetype.tres")
|
|
122
|
+
|
|
123
|
+
var spawner: SummerNetworkSpawner
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
func _ready() -> void:
|
|
127
|
+
spawner = Game.build_network(self, PlayerArchetype)
|
|
128
|
+
# Connect signals like state_group_created here, before joining, or values
|
|
129
|
+
# that arrive during the join go unseen (multiplayer-movement adds them).
|
|
130
|
+
var initialized: SummerResult = await Summer.initialize(Game.GAME_ID).get_result_or_completed_signal()
|
|
131
|
+
if not initialized.ok:
|
|
132
|
+
push_error(initialized.message)
|
|
133
|
+
return
|
|
134
|
+
var join := Summer.client.join(SummerJoinTarget.queue(Game.QUEUE))
|
|
135
|
+
# Hosted matchmaking may ask the player to accept a match.
|
|
136
|
+
join.acceptance_required.connect(func(proposal: SummerMatchmakingProposal) -> void: proposal.accept())
|
|
137
|
+
var joined: SummerResult = await join.get_result_or_completed_signal()
|
|
138
|
+
if not joined.ok:
|
|
139
|
+
push_error("join failed: %s %s" % [joined.code, joined.message])
|
|
140
|
+
return
|
|
141
|
+
if not spawner.is_network_ready():
|
|
142
|
+
await spawner.network_ready
|
|
143
|
+
var entered := await command({"c": "join"})
|
|
144
|
+
if not entered.ok:
|
|
145
|
+
push_error("could not enter the match: %s" % entered.error)
|
|
146
|
+
return
|
|
147
|
+
print("COURTYARD_CLIENT_JOINED")
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
## Sends one Command and waits for the authority's answer.
|
|
151
|
+
func command(payload: Dictionary) -> Dictionary:
|
|
152
|
+
var admission := spawner.enqueue_command(Game.CMD, Game.pack(payload))
|
|
153
|
+
if not admission.is_enqueued():
|
|
154
|
+
return {"ok": false, "error": String(admission.get_code())}
|
|
155
|
+
var handle := admission.get_handle()
|
|
156
|
+
if not handle.is_terminal():
|
|
157
|
+
await handle.completed
|
|
158
|
+
if handle.get_outcome() == SummerNetworkCommandHandle.OUTCOME_ACCEPTED:
|
|
159
|
+
return {"ok": true, "error": "", "result": Game.unpack(handle.get_result())}
|
|
160
|
+
return {"ok": false, "error": String(handle.get_reason())}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## `client/main.tscn`
|
|
164
|
+
|
|
165
|
+
```ini
|
|
166
|
+
[gd_scene load_steps=5 format=3]
|
|
167
|
+
|
|
168
|
+
[ext_resource type="Script" path="res://client/main.gd" id="1"]
|
|
169
|
+
|
|
170
|
+
[sub_resource type="BoxShape3D" id="FloorShape"]
|
|
171
|
+
size = Vector3(80, 1, 80)
|
|
172
|
+
|
|
173
|
+
[sub_resource type="BoxMesh" id="FloorMesh"]
|
|
174
|
+
size = Vector3(80, 1, 80)
|
|
175
|
+
|
|
176
|
+
[node name="Main" type="Node"]
|
|
177
|
+
script = ExtResource("1")
|
|
178
|
+
|
|
179
|
+
[node name="Floor" type="StaticBody3D" parent="."]
|
|
180
|
+
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0)
|
|
181
|
+
|
|
182
|
+
[node name="Shape" type="CollisionShape3D" parent="Floor"]
|
|
183
|
+
shape = SubResource("FloorShape")
|
|
184
|
+
|
|
185
|
+
[node name="Mesh" type="MeshInstance3D" parent="Floor"]
|
|
186
|
+
mesh = SubResource("FloorMesh")
|
|
187
|
+
|
|
188
|
+
[node name="Sun" type="DirectionalLight3D" parent="."]
|
|
189
|
+
transform = Transform3D(1, 0, 0, 0, 0.5, 0.866, 0, -0.866, 0.5, 0, 10, 0)
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## `client/player_archetype.tres`
|
|
193
|
+
|
|
194
|
+
```ini
|
|
195
|
+
[gd_resource type="SummerEntityArchetype" load_steps=4 format=3]
|
|
196
|
+
|
|
197
|
+
[ext_resource type="SummerNetworkSchema" path="res://network/player_schema.tres" id="1"]
|
|
198
|
+
[ext_resource type="PackedScene" path="res://client/player_owner.tscn" id="2"]
|
|
199
|
+
[ext_resource type="PackedScene" path="res://client/player_observer.tscn" id="3"]
|
|
200
|
+
|
|
201
|
+
[resource]
|
|
202
|
+
archetype_id = &"player"
|
|
203
|
+
network_schema = ExtResource("1")
|
|
204
|
+
owner_projection_scene = ExtResource("2")
|
|
205
|
+
observer_projection_scene = ExtResource("3")
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## `client/player_observer.tscn`
|
|
209
|
+
|
|
210
|
+
```ini
|
|
211
|
+
[gd_scene load_steps=2 format=3]
|
|
212
|
+
|
|
213
|
+
[sub_resource type="CapsuleMesh" id="Mesh"]
|
|
214
|
+
|
|
215
|
+
[node name="PlayerObserver" type="Node3D"]
|
|
216
|
+
|
|
217
|
+
[node name="Body" type="MeshInstance3D" parent="."]
|
|
218
|
+
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
|
|
219
|
+
mesh = SubResource("Mesh")
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## `client/player_owner.tscn`
|
|
223
|
+
|
|
224
|
+
```ini
|
|
225
|
+
[gd_scene load_steps=3 format=3]
|
|
226
|
+
|
|
227
|
+
[sub_resource type="CapsuleShape3D" id="Shape"]
|
|
228
|
+
|
|
229
|
+
[sub_resource type="CapsuleMesh" id="Mesh"]
|
|
230
|
+
|
|
231
|
+
[node name="PlayerOwner" type="CharacterBody3D"]
|
|
232
|
+
|
|
233
|
+
[node name="Shape" type="CollisionShape3D" parent="."]
|
|
234
|
+
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
|
|
235
|
+
shape = SubResource("Shape")
|
|
236
|
+
|
|
237
|
+
[node name="Body" type="MeshInstance3D" parent="."]
|
|
238
|
+
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
|
|
239
|
+
mesh = SubResource("Mesh")
|
|
240
|
+
|
|
241
|
+
[node name="Camera3D" type="Camera3D" parent="."]
|
|
242
|
+
transform = Transform3D(1, 0, 0, 0, 0.8, 0.6, 0, -0.6, 0.8, 0, 6, 8)
|
|
243
|
+
current = true
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## `network/composition.tres`
|
|
247
|
+
|
|
248
|
+
```ini
|
|
249
|
+
[gd_resource type="SummerNetworkComposition" load_steps=6 format=3]
|
|
250
|
+
|
|
251
|
+
[sub_resource type="SummerNetworkField" id="CommandBytes"]
|
|
252
|
+
field_name = &"b"
|
|
253
|
+
type = 20
|
|
254
|
+
|
|
255
|
+
[sub_resource type="SummerNetworkSchema" id="CommandSchema"]
|
|
256
|
+
schema_id = &"courtyard.cmd.v1"
|
|
257
|
+
state_fields = Array[SummerNetworkField]([SubResource("CommandBytes")])
|
|
258
|
+
|
|
259
|
+
[sub_resource type="SummerNetworkField" id="ResultBytes"]
|
|
260
|
+
field_name = &"b"
|
|
261
|
+
type = 20
|
|
262
|
+
|
|
263
|
+
[sub_resource type="SummerNetworkSchema" id="ResultSchema"]
|
|
264
|
+
schema_id = &"courtyard.cmd.result.v1"
|
|
265
|
+
state_fields = Array[SummerNetworkField]([SubResource("ResultBytes")])
|
|
266
|
+
|
|
267
|
+
[sub_resource type="SummerNetworkOccurrenceStream" id="Commands"]
|
|
268
|
+
stream_id = &"courtyard.cmd"
|
|
269
|
+
command_scope = 2
|
|
270
|
+
command_tick_dispatch = true
|
|
271
|
+
command_timeout_msec = 8000
|
|
272
|
+
payload_schema = SubResource("CommandSchema")
|
|
273
|
+
result_schema = SubResource("ResultSchema")
|
|
274
|
+
|
|
275
|
+
[resource]
|
|
276
|
+
network_version = "1.0.0"
|
|
277
|
+
occurrence_streams = Array[SummerNetworkOccurrenceStream]([SubResource("Commands")])
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## `network/game.gd`
|
|
281
|
+
|
|
282
|
+
```gdscript
|
|
283
|
+
extends RefCounted
|
|
284
|
+
## Shared by the client and the authority: ids, streams and shared rules.
|
|
285
|
+
|
|
286
|
+
const GAME_ID := "game_courtyard"
|
|
287
|
+
const QUEUE := &"courtyard"
|
|
288
|
+
const CMD := &"courtyard.cmd"
|
|
289
|
+
const MAX_PLAYERS := 8
|
|
290
|
+
const COMPOSITION := preload("res://network/composition.tres")
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
## Adds the World, an Entities root and the Spawner under `parent`. Both sides
|
|
294
|
+
## pass their own player archetype; the composition is the same file.
|
|
295
|
+
static func build_network(parent: Node, player: SummerEntityArchetype) -> SummerNetworkSpawner:
|
|
296
|
+
var world := SummerNetworkWorld.new()
|
|
297
|
+
world.name = "World"
|
|
298
|
+
parent.add_child(world)
|
|
299
|
+
var entities := Node3D.new()
|
|
300
|
+
entities.name = "Entities"
|
|
301
|
+
parent.add_child(entities)
|
|
302
|
+
var spawner := SummerNetworkSpawner.new()
|
|
303
|
+
spawner.name = "Spawner"
|
|
304
|
+
spawner.network_world_path = NodePath("../World")
|
|
305
|
+
spawner.entities_root_path = NodePath("../Entities")
|
|
306
|
+
spawner.archetypes = [player]
|
|
307
|
+
spawner.player_archetype = &"player" # one entity per joined player
|
|
308
|
+
spawner.network_composition = COMPOSITION
|
|
309
|
+
parent.add_child(spawner)
|
|
310
|
+
return spawner
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
## Commands and results travel as JSON bytes: a network String holds at most
|
|
314
|
+
## 256 bytes.
|
|
315
|
+
static func pack(document: Dictionary) -> Dictionary:
|
|
316
|
+
return {"b": JSON.stringify(document).to_utf8_buffer()}
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
static func unpack(fields: Dictionary) -> Dictionary:
|
|
320
|
+
var parsed: Variant = JSON.parse_string((fields.get("b", PackedByteArray()) as PackedByteArray).get_string_from_utf8())
|
|
321
|
+
return parsed if parsed is Dictionary else {}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## `network/player_schema.tres`
|
|
325
|
+
|
|
326
|
+
```ini
|
|
327
|
+
[gd_resource type="SummerNetworkSchema" format=3]
|
|
328
|
+
|
|
329
|
+
[resource]
|
|
330
|
+
schema_id = &"courtyard.player.v1"
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
## `project.godot`
|
|
334
|
+
|
|
335
|
+
```ini
|
|
336
|
+
config_version=5
|
|
337
|
+
|
|
338
|
+
[application]
|
|
339
|
+
|
|
340
|
+
config/name="Courtyard"
|
|
341
|
+
run/main_scene="res://client/main.tscn"
|
|
342
|
+
run/main_scene.summer_client="res://client/main.tscn"
|
|
343
|
+
run/main_scene.summer_authority="res://authority/main.tscn"
|
|
344
|
+
|
|
345
|
+
[rendering]
|
|
346
|
+
|
|
347
|
+
textures/vram_compression/import_etc2_astc=true
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
## `runtime-manifest.json`
|
|
351
|
+
|
|
352
|
+
```json
|
|
353
|
+
{
|
|
354
|
+
"profile": "headless_engine",
|
|
355
|
+
"entry_point": "authority/main.tscn",
|
|
356
|
+
"export_preset": "Courtyard Authority"
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
## `source-domains.json`
|
|
361
|
+
|
|
362
|
+
```json
|
|
363
|
+
{
|
|
364
|
+
"schema": "summer.source-domain-graph.v1",
|
|
365
|
+
"roots": [
|
|
366
|
+
{ "domain": "shared", "paths": ["project.godot", "network", "world.json", "runtime-manifest.json"] },
|
|
367
|
+
{ "domain": "client", "paths": ["client"] },
|
|
368
|
+
{ "domain": "authority_engine", "paths": ["authority"] }
|
|
369
|
+
],
|
|
370
|
+
"dependencies": []
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## `summer.build.json`
|
|
375
|
+
|
|
376
|
+
```json
|
|
377
|
+
{
|
|
378
|
+
"schema": "summer.build.v2",
|
|
379
|
+
"gameId": "game_courtyard",
|
|
380
|
+
"executionMode": "hosted",
|
|
381
|
+
"targetPlatforms": ["ios", "macos"],
|
|
382
|
+
"project": { "directory": "." },
|
|
383
|
+
"server": { "exportPreset": "Courtyard Authority" },
|
|
384
|
+
"runtime": {
|
|
385
|
+
"protocolVersion": "1.0.0",
|
|
386
|
+
"interfaces": {
|
|
387
|
+
"multiplayer": 6, "session": 3, "lobby": 3, "presence": 3,
|
|
388
|
+
"config": 3, "party": 1, "matchSearch": 1
|
|
389
|
+
},
|
|
390
|
+
"scenes": ["res://client/main.tscn"],
|
|
391
|
+
"worldDefinitions": ["world.json"],
|
|
392
|
+
"queues": [
|
|
393
|
+
{
|
|
394
|
+
"name": "courtyard",
|
|
395
|
+
"minPlayers": 2,
|
|
396
|
+
"maxPlayers": 8,
|
|
397
|
+
"worldDefinition": "courtyard",
|
|
398
|
+
"policy": "fifo",
|
|
399
|
+
"transport": "enet"
|
|
400
|
+
}
|
|
401
|
+
],
|
|
402
|
+
"tickRate": 60,
|
|
403
|
+
"config": { "keys": {} },
|
|
404
|
+
"presence": { "tokens": {} },
|
|
405
|
+
"lobby": { "fields": {} },
|
|
406
|
+
"server": { "tier": "small" }
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
## `world.json`
|
|
412
|
+
|
|
413
|
+
```json
|
|
414
|
+
{
|
|
415
|
+
"schema": "summer.world-definition.v1",
|
|
416
|
+
"definition_id": "courtyard",
|
|
417
|
+
"lifetime": "match_scoped",
|
|
418
|
+
"topology": "dedicated",
|
|
419
|
+
"client_entry_point": "res://client/main.tscn",
|
|
420
|
+
"components": [
|
|
421
|
+
{
|
|
422
|
+
"component_id": "match",
|
|
423
|
+
"profile": "headless_engine",
|
|
424
|
+
"runtime_descriptor": "runtime-manifest.json",
|
|
425
|
+
"entry_point": "authority/main.tscn",
|
|
426
|
+
"owns": ["match"]
|
|
427
|
+
}
|
|
428
|
+
],
|
|
429
|
+
"source_graph": "source-domains.json",
|
|
430
|
+
"network_compositions": ["res://network/composition.tres"],
|
|
431
|
+
"services": { "required": [], "optional": [] },
|
|
432
|
+
"settlement": { "mode": "required", "version": 1 },
|
|
433
|
+
"persistence": {
|
|
434
|
+
"mode": "none",
|
|
435
|
+
"recovery_point_seconds": 0,
|
|
436
|
+
"snapshot_schemas": [],
|
|
437
|
+
"migration_ids": []
|
|
438
|
+
},
|
|
439
|
+
"lifecycle": {
|
|
440
|
+
"reconnect_seconds": 30,
|
|
441
|
+
"drain_seconds": 5,
|
|
442
|
+
"transfer": "disabled",
|
|
443
|
+
"completion_owner": "world"
|
|
444
|
+
},
|
|
445
|
+
"placement": { "region_policy": "nearest" },
|
|
446
|
+
"limits_profile": "default"
|
|
447
|
+
}
|
|
448
|
+
```
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
id: skill/multiplayer-project
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Set up a Summer multiplayer project: both entry scenes, World and queue files, joining, and a first Local Play run."
|
|
5
|
+
use_when:
|
|
6
|
+
- "making a Summer game playable online or co-op: the first multiplayer setup"
|
|
7
|
+
- "adding multiplayer to a Summer game: the client and authority scenes, summer.build.json, world.json and joining a queue"
|
|
8
|
+
- "a Summer multiplayer project has no summer.build.json or world.json yet, or Local Play cannot find the World"
|
|
9
|
+
- "laying out a multiplayer project in client/, authority/ and network/ folders"
|
|
10
|
+
facets:
|
|
11
|
+
lifecycle:
|
|
12
|
+
- build
|
|
13
|
+
domains:
|
|
14
|
+
- multiplayer
|
|
15
|
+
- project
|
|
16
|
+
- scripting
|
|
17
|
+
modalities:
|
|
18
|
+
- scripts
|
|
19
|
+
- scenes
|
|
20
|
+
- project
|
|
21
|
+
compatibility:
|
|
22
|
+
engine: ">=4.6"
|
|
23
|
+
related:
|
|
24
|
+
skills:
|
|
25
|
+
- skill/multiplayer
|
|
26
|
+
- skill/multiplayer-movement
|
|
27
|
+
- skill/multiplayer-state
|
|
28
|
+
- skill/multiplayer-testing
|
|
29
|
+
- skill/multiplayer-publish
|
|
30
|
+
- skill/summer-matchmaking
|
|
31
|
+
- skill/summer-parties
|
|
32
|
+
- skill/summer-world-saves
|
|
33
|
+
source: official
|
|
34
|
+
license: MIT
|
|
35
|
+
status: stable
|
|
36
|
+
recommended: false
|