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,236 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: multiplayer-testing
|
|
3
|
+
description: "Test a Summer multiplayer game with Local Play: several players, a bad network, bots, and what a passing run shows."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: multiplayer-and-networking
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Edit Write summer_project_setting summer_play summer_stop summer_get_diagnostics summer_get_console summer_screenshot
|
|
9
|
+
paths: ["project.godot", "summer.build.json", "client/**", "authority/**", "network/**"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# /multiplayer-testing — prove it works before saying it works
|
|
13
|
+
|
|
14
|
+
Step 4 of the multiplayer sequence (`multiplayer` explains the model).
|
|
15
|
+
|
|
16
|
+
**Local Play** runs a Summer multiplayer game on one machine. It starts the
|
|
17
|
+
World's authority scene headless and N clients, and each client joins through
|
|
18
|
+
the game's own `Summer.client.join`. No account, server or extra tools are
|
|
19
|
+
needed. It can also make the network bad on purpose, which is where
|
|
20
|
+
multiplayer bugs show.
|
|
21
|
+
|
|
22
|
+
## 1. Start Local Play
|
|
23
|
+
|
|
24
|
+
Pick whichever the session has.
|
|
25
|
+
|
|
26
|
+
**Summer MCP tools** (they set project settings, then play):
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
summer_project_setting name="summer/local_play/players" value=2
|
|
30
|
+
summer_play
|
|
31
|
+
summer_get_diagnostics
|
|
32
|
+
summer_stop
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Editor:** **Debug > Local Multiplayer**, pick the player count, press Play.
|
|
36
|
+
The client windows tile side by side.
|
|
37
|
+
|
|
38
|
+
**Terminal** (`<summer>` is the Summer editor executable). Import once after
|
|
39
|
+
adding scripts so their classes register:
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
<summer> --headless --path . --import
|
|
43
|
+
<summer> --path . --summer-local-play 2 --summer-local-play-timeout 30
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
| Setting | Terminal flag | Meaning |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| `summer/local_play/players` | `--summer-local-play <n>` | Players to start. `-1` uses the queue's `minPlayers`; `0` turns Local Play off |
|
|
49
|
+
| `summer/local_play/queue` | `--summer-local-play-queue <name>` | Which `summer.build.json` queue to stand in for (default: the first) |
|
|
50
|
+
| — | `--summer-local-play-headless` | Run the clients without windows too |
|
|
51
|
+
| — | `--summer-local-play-timeout <s>` | End the session after that many seconds |
|
|
52
|
+
| — | `--summer-local-play-smoke` | Headless clients; exit 0 once every client joined and stayed 3 s |
|
|
53
|
+
| — | `--summer-local-play-spectators <n>` | Also start spectator clients |
|
|
54
|
+
| — | `--summer-local-play-web` | Run the clients in a browser (the game's Web export) |
|
|
55
|
+
|
|
56
|
+
## 2. Make the network bad
|
|
57
|
+
|
|
58
|
+
Loopback has no latency, so it hides every timing bug. Always run once with
|
|
59
|
+
these settings; they apply to every client:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
summer_project_setting name="summer/local_play/network/round_trip_msec" value=100
|
|
63
|
+
summer_project_setting name="summer/local_play/network/jitter_msec" value=10
|
|
64
|
+
summer_project_setting name="summer/local_play/network/loss_percent" value=1
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Or put them in `project.godot` while testing:
|
|
68
|
+
|
|
69
|
+
```ini
|
|
70
|
+
[summer]
|
|
71
|
+
|
|
72
|
+
local_play/network/round_trip_msec=100
|
|
73
|
+
local_play/network/jitter_msec=10
|
|
74
|
+
local_play/network/loss_percent=1
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Ranges: round trip 0–2000 ms, jitter 0–1000 ms, loss 0–50 %. Each client
|
|
78
|
+
prints `NETWORK_EMULATION round_trip_ms=100 ...` when it applies. Try 200 ms
|
|
79
|
+
too: that is a player on another continent.
|
|
80
|
+
|
|
81
|
+
## 3. Read the run
|
|
82
|
+
|
|
83
|
+
Every output line is prefixed by its process: `[authority]`, `[player-1]`,
|
|
84
|
+
`[player-2]`. The last line is the summary:
|
|
85
|
+
|
|
86
|
+
```text
|
|
87
|
+
SUMMER_LOCAL_PLAY_RESULT {"ok":true,"players":2,"network":{...},"processes":[{"label":"authority","script_errors":0,...},{"label":"player-1","joined":true,"script_errors":0,...}],...}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
A run passes only when **all** of these hold:
|
|
91
|
+
|
|
92
|
+
- [ ] `"ok":true`, and every process has `"script_errors":0`.
|
|
93
|
+
- [ ] The game's own ready lines appear: the authority's, and one per client after its `join` Command (`COURTYARD_AUTHORITY_READY`, `COURTYARD_CLIENT_JOINED` in the Courtyard example). Print one in your game too.
|
|
94
|
+
- [ ] No `[SummerNetworkSpawner] cannot attach` warning on any process.
|
|
95
|
+
- [ ] No `SCRIPT ERROR` lines.
|
|
96
|
+
|
|
97
|
+
`"ok":true` alone only proves that clients got seats. If the composition is
|
|
98
|
+
invalid, the Spawner logs `cannot attach` as a warning and nothing networked
|
|
99
|
+
works, yet every client still counts as joined. The smoke flag
|
|
100
|
+
(`--summer-local-play-smoke`) proves the same thing and no more.
|
|
101
|
+
|
|
102
|
+
With MCP, `summer_get_diagnostics` reports runtime errors from the debugger.
|
|
103
|
+
Read it after every play; `summer_get_console` alone misses them.
|
|
104
|
+
|
|
105
|
+
## 4. Drive the game with bots
|
|
106
|
+
|
|
107
|
+
To test gameplay without hands, give the game a bot mode. Arguments after
|
|
108
|
+
`--` reach every process, and `{client}` becomes 1, 2, ... for players and 0
|
|
109
|
+
for the authority:
|
|
110
|
+
|
|
111
|
+
```sh
|
|
112
|
+
<summer> --path . --summer-local-play 2 --summer-local-play-headless --summer-local-play-timeout 20 -- --bot={client}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Put the bot in `client/bot.gd`. It presses the same input actions a player
|
|
116
|
+
does, so it tests the real controls:
|
|
117
|
+
|
|
118
|
+
```gdscript
|
|
119
|
+
extends Node
|
|
120
|
+
## Test bot for Local Play, enabled with `-- --bot={client}`. It presses the
|
|
121
|
+
## real input actions. Bot 1 walks to the first coin and collects it; every
|
|
122
|
+
## bot prints what it sees, for the test run to check.
|
|
123
|
+
|
|
124
|
+
const COIN := "0"
|
|
125
|
+
|
|
126
|
+
var number := 0
|
|
127
|
+
var main: Node
|
|
128
|
+
var elapsed := 0.0
|
|
129
|
+
var step := 0
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
func _process(delta: float) -> void:
|
|
133
|
+
elapsed += delta
|
|
134
|
+
var me := _own_player()
|
|
135
|
+
if me == null:
|
|
136
|
+
return
|
|
137
|
+
if number == 1 and step == 0:
|
|
138
|
+
var at: Array = main.match_doc.get("coins", {}).get(COIN, [])
|
|
139
|
+
if at.is_empty():
|
|
140
|
+
return
|
|
141
|
+
var to_coin := Vector2(at[0] - me.global_position.x, at[2] - me.global_position.z)
|
|
142
|
+
if to_coin.length() > 0.5:
|
|
143
|
+
_steer(to_coin.normalized())
|
|
144
|
+
return
|
|
145
|
+
_steer(Vector2.ZERO)
|
|
146
|
+
step = 1
|
|
147
|
+
print("BOT_MOVED %s" % me.global_position)
|
|
148
|
+
var collected: Dictionary = await main.collect(COIN)
|
|
149
|
+
print("BOT_COLLECT %s" % JSON.stringify(collected))
|
|
150
|
+
if elapsed > 6.0 and step < 2:
|
|
151
|
+
step = 2
|
|
152
|
+
for node in main.get_node("Entities").get_children():
|
|
153
|
+
if node != me:
|
|
154
|
+
print("BOT_SAW %s" % node.global_position)
|
|
155
|
+
print("BOT_SCORES %s" % JSON.stringify(main.match_doc.get("scores", {})))
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
func _own_player() -> Node3D:
|
|
159
|
+
for node in main.get_node("Entities").get_children():
|
|
160
|
+
if node.get_script() == preload("res://client/player_owner.gd"):
|
|
161
|
+
return node
|
|
162
|
+
return null
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
func _steer(direction: Vector2) -> void:
|
|
166
|
+
for action in [&"ui_left", &"ui_right", &"ui_up", &"ui_down"]:
|
|
167
|
+
Input.action_release(action)
|
|
168
|
+
if direction.x > 0.0: Input.action_press(&"ui_right", direction.x)
|
|
169
|
+
if direction.x < 0.0: Input.action_press(&"ui_left", -direction.x)
|
|
170
|
+
if direction.y > 0.0: Input.action_press(&"ui_down", direction.y)
|
|
171
|
+
if direction.y < 0.0: Input.action_press(&"ui_up", -direction.y)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Add it from `client/main.gd` only when the argument is there, after the
|
|
175
|
+
player has joined:
|
|
176
|
+
|
|
177
|
+
```gdscript
|
|
178
|
+
# Local Play test bot: `-- --bot={client}` (see multiplayer-testing).
|
|
179
|
+
for arg in OS.get_cmdline_user_args():
|
|
180
|
+
if arg.begins_with("--bot="):
|
|
181
|
+
var bot := preload("res://client/bot.gd").new()
|
|
182
|
+
bot.number = int(arg.trim_prefix("--bot="))
|
|
183
|
+
bot.main = self
|
|
184
|
+
add_child(bot)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Then check the lines it prints. The Courtyard bot walks player 1 to a coin
|
|
188
|
+
and collects it; player 2 watches:
|
|
189
|
+
|
|
190
|
+
- [ ] `[player-1] BOT_MOVED` and `[player-2] BOT_SAW` report the same position (the observer is up to 100 ms behind while moving, then equal).
|
|
191
|
+
- [ ] `[player-1] BOT_COLLECT {"ok":true...}` and both players print the new score.
|
|
192
|
+
|
|
193
|
+
Keep bot code in `client/`: files under `test/` or other debug folders are
|
|
194
|
+
left out of the players' pack, so the shipped game could not load them.
|
|
195
|
+
|
|
196
|
+
Headless clients have no real window. Guard calls that need one (mouse
|
|
197
|
+
capture, window size) with `DisplayServer.get_name() != "headless"`.
|
|
198
|
+
|
|
199
|
+
## 5. What Local Play cannot show
|
|
200
|
+
|
|
201
|
+
- **Hosted-only services** answer with an error code locally: parties,
|
|
202
|
+
friends, World chat, the store, client leaderboards and analytics. Their
|
|
203
|
+
skills list the codes. Make the UI hide or explain them; never crash on them.
|
|
204
|
+
- **Matchmaking's accept prompt.** Local Play seats players directly: no
|
|
205
|
+
proposal, one World per queue.
|
|
206
|
+
- **A player leaving for good.** A client that quits or calls
|
|
207
|
+
`Summer.client.leave()` only disconnects. `session_disconnected` fires and
|
|
208
|
+
their seat is held. `session_left` arrives when the World ends; hosted, it
|
|
209
|
+
arrives when Summer ends the Session.
|
|
210
|
+
- **Real devices, real accounts, real distances.** Publish to staging for that
|
|
211
|
+
(`multiplayer-publish`).
|
|
212
|
+
|
|
213
|
+
## Checklist for any multiplayer change
|
|
214
|
+
|
|
215
|
+
- [ ] Ran Local Play with at least 2 players, and once with 100 ms / 10 ms / 1 %.
|
|
216
|
+
- [ ] Every process: no `SCRIPT ERROR`, no `cannot attach`, `script_errors` 0.
|
|
217
|
+
- [ ] The game's own ready lines appear for the authority and every client.
|
|
218
|
+
- [ ] Your own player responds instantly and never snaps while moving normally.
|
|
219
|
+
- [ ] Other players move smoothly and end where their owners are.
|
|
220
|
+
- [ ] Shared state matches on every client; private state reaches only its owner.
|
|
221
|
+
- [ ] A refused Command changes nothing and shows its reason.
|
|
222
|
+
|
|
223
|
+
## Common mistakes
|
|
224
|
+
|
|
225
|
+
| Don't | Do | Why |
|
|
226
|
+
|---|---|---|
|
|
227
|
+
| Test only on loopback | Add round trip, jitter and loss | Latency bugs are invisible at 0 ms |
|
|
228
|
+
| Read `"ok":true` as success | Also check your ready lines, `cannot attach` and `script_errors` | A broken composition still joins |
|
|
229
|
+
| Read only `summer_get_console` | `summer_get_diagnostics` after each play | Runtime errors live in the debugger |
|
|
230
|
+
| Put bot or test code under `test/` and load it from the game | Keep the bot in `client/`, enabled by `--bot` | Debug folders are left out of the players' pack |
|
|
231
|
+
| Wait for `session_left` in a local test | Watch `session_disconnected` | Local Play ends Sessions only when the World ends |
|
|
232
|
+
| Skip the import pass after adding scripts | `<summer> --headless --path . --import` first | New classes are unknown until imported |
|
|
233
|
+
|
|
234
|
+
## Next
|
|
235
|
+
|
|
236
|
+
`multiplayer-publish`: export the summer.games bundle and upload it as a Build.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
id: skill/multiplayer-testing
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Test a Summer multiplayer game with Local Play: several players, a bad network, bots, and what a passing run shows."
|
|
5
|
+
use_when:
|
|
6
|
+
- "running or testing a Summer multiplayer game locally with several players (Local Play)"
|
|
7
|
+
- "testing multiplayer under latency, jitter or packet loss, or with bots"
|
|
8
|
+
- "a multiplayer run says ok but nothing networked works, or deciding whether a multiplayer change is done"
|
|
9
|
+
facets:
|
|
10
|
+
lifecycle:
|
|
11
|
+
- build
|
|
12
|
+
- support
|
|
13
|
+
domains:
|
|
14
|
+
- multiplayer
|
|
15
|
+
- playtest
|
|
16
|
+
- verification
|
|
17
|
+
modalities:
|
|
18
|
+
- scripts
|
|
19
|
+
- project
|
|
20
|
+
compatibility:
|
|
21
|
+
engine: ">=4.6"
|
|
22
|
+
related:
|
|
23
|
+
skills:
|
|
24
|
+
- skill/multiplayer
|
|
25
|
+
- skill/multiplayer-project
|
|
26
|
+
- skill/multiplayer-movement
|
|
27
|
+
- skill/multiplayer-state
|
|
28
|
+
- skill/multiplayer-publish
|
|
29
|
+
- skill/summer-friends
|
|
30
|
+
- skill/summer-match-results
|
|
31
|
+
- skill/summer-matchmaking
|
|
32
|
+
- skill/summer-parties
|
|
33
|
+
- skill/summer-player-data
|
|
34
|
+
- skill/summer-store
|
|
35
|
+
- skill/summer-world-chat
|
|
36
|
+
source: official
|
|
37
|
+
license: MIT
|
|
38
|
+
status: stable
|
|
39
|
+
recommended: false
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: music-track
|
|
3
|
-
description:
|
|
3
|
+
description: "Generate a looped or cinematic music track — loops authored at >=30s with a marked loop point, cinematic tracks at >=60s linear."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: audio
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: navigate-summer
|
|
3
|
-
description:
|
|
3
|
+
description: "When to open a Summer web page or editor surface FOR the user (billing, their games, the scene just built) versus acting through the API, using summer_open."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode, Factory, Copilot]
|
|
6
6
|
category: _meta
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: new-project
|
|
3
|
-
description:
|
|
3
|
+
description: "Create a fresh blank Summer Engine project — asks one question (project name) and runs summer create empty."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
|
|
6
6
|
category: scene-and-project
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: organic-model
|
|
3
|
-
description:
|
|
3
|
+
description: "Generate organic 3D shapes — trees, rocks, mushrooms, coral, plants, vines, crystals — where AI artifacts read as natural irregularity."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 3d-assets
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: pixel-art
|
|
3
|
-
description:
|
|
3
|
+
description: "Generate pixel-art assets — sprites, items, tiles, portraits — at a specific resolution with pixel-perfect grid, limited palette, retro feel."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 2d-assets
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: play
|
|
3
|
-
description:
|
|
3
|
+
description: "Run the project in Summer Engine, wait briefly, then report what's happening — clean run, errors, or warnings."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: scene-and-project
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: playtesting-a-feature
|
|
3
|
-
description:
|
|
3
|
+
description: "Before claiming a gameplay feature done: actually run the game and walk through the feature. Static diagnostics and type checks do not count."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Playtesting A Feature
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: procedural-animation
|
|
3
|
-
description:
|
|
3
|
+
description: "Runtime bone modification on top of clips — head look-at, foot IK, hand-grabs-prop, additive lean, recoil. Code-and-modifier patterns, not generation."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: animation
|
|
@@ -243,7 +243,7 @@ You need PhysicalBone3D children matching every major bone (set up once via the
|
|
|
243
243
|
- **Character is mounted (riding a horse).** Disable foot IK on the rider; ride animation already sells the contact. Enable upper-body additive sway driven by horse acceleration.
|
|
244
244
|
- **First-person hands.** Same modifier set, but only the arm chain is visible — disable head/spine modifiers, keep hand-on-prop IK.
|
|
245
245
|
- **Character is a quadruped.** All four legs need foot IK. The bone names are different (`FrontLeftLeg`, `BackRightLeg`, etc.); inspect first.
|
|
246
|
-
- **Network-synced ragdoll.** Don't simulate on every client
|
|
246
|
+
- **Network-synced ragdoll.** Don't simulate it on every client and don't sync bones with `MultiplayerSynchronizer`. In a Summer multiplayer game, send the few values that drive the ragdoll (the impulse, the moment it starts) as State or an Event and let each client simulate locally; see `multiplayer-state`.
|
|
247
247
|
|
|
248
248
|
## Fallback (no MCP)
|
|
249
249
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
id: skill/procedural-animation
|
|
2
2
|
kind: skill
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.4
|
|
4
4
|
summary: Runtime bone modification on top of clips — head look-at, foot IK, hand-grabs-prop, additive lean, recoil. Code-and-modifier patterns, not generation.
|
|
5
5
|
use_when:
|
|
6
6
|
- the user needs runtime-driven bone modification on top of clips — head look-at, foot IK on uneven ground, additive lean, hit recoil, ragdoll
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: prop-model
|
|
3
|
-
description:
|
|
3
|
+
description: "Generate a single static 3D prop — sword, barrel, chest, lantern, throne, statue — one isolated object, no rigging, wired as a MeshInstance3D."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 3d-assets
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: psx-retro-rendering
|
|
3
|
-
description: "
|
|
3
|
+
description: "Hardware-informed PlayStation 1 rendering in Godot 4 — low-res output, RGB5 and exact dither, affine textures, vertex snapping, blend modes, fog; limits named."
|
|
4
4
|
license: MIT
|
|
5
5
|
category: shaders
|
|
6
6
|
tags:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: realtime-wet-surfaces
|
|
3
|
-
description: "
|
|
3
|
+
description: "Real-time wetness on existing Godot 4 materials without losing their values — value-copying wet shader, geometry-driven wet mask, instance-uniform wet amount."
|
|
4
4
|
license: MIT
|
|
5
5
|
category: shaders
|
|
6
6
|
tags:
|
|
@@ -186,4 +186,4 @@ The source author states heightmap support so wetness flows along map bumps is *
|
|
|
186
186
|
|
|
187
187
|
## Evidence
|
|
188
188
|
|
|
189
|
-
-
|
|
189
|
+
- Source record `sources/x/tenmomo-unity-realtime-wet/source.md`, kept outside this package (the evidence boundaries above summarise it).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: remote-deploy
|
|
3
|
-
description:
|
|
3
|
+
description: "Run or test the game on a real device — phone, tablet, another computer — via the Remote Deploy button, runnable export presets, and on-device debugging."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: deployment
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: retarget
|
|
3
|
-
description:
|
|
3
|
+
description: "Apply existing animation clips from one rigged character to a different rigged character — same library, multiple models, no regeneration."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: animation
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: running-in-the-cloud
|
|
3
|
-
description:
|
|
3
|
+
description: "Run Summer Engine on a Linux box with no display — install it, launch headless, know when xvfb + software GL are needed, authenticate without a browser."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Running in the Cloud
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: save-load
|
|
3
|
+
description: "Persist game state in Summer Engine: user:// paths, JSON progress vs ConfigFile settings, a versioned save schema with migration, autosave hooks."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
|
|
6
|
+
category: scripting-patterns
|
|
7
|
+
user-invocable: false
|
|
8
|
+
allowed-tools: Read Grep summer_read_file summer_write_file summer_replace_text summer_project_setting summer_get_script_errors summer_get_diagnostics
|
|
9
|
+
paths: ["**/*.gd", "project.godot"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Save / Load
|
|
13
|
+
|
|
14
|
+
Trigger phrases: "save progress", "settings menu should remember", "high scores",
|
|
15
|
+
"checkpoints", "save slots", "JSON or ConfigFile?", "saves broke after the update".
|
|
16
|
+
|
|
17
|
+
Save what the player would be angry to lose, and nothing else. Persist DATA
|
|
18
|
+
(numbers, ids, flags), never live nodes or scene references.
|
|
19
|
+
|
|
20
|
+
## Where saves go
|
|
21
|
+
|
|
22
|
+
Always `user://` - a writable per-user dir (`res://` is read-only in an export).
|
|
23
|
+
|
|
24
|
+
- `user://save_0.json` - progress
|
|
25
|
+
- `user://settings.cfg` - options
|
|
26
|
+
|
|
27
|
+
Never write gameplay saves to `res://`; it fails in the shipped game.
|
|
28
|
+
|
|
29
|
+
## JSON vs ConfigFile
|
|
30
|
+
|
|
31
|
+
| Use JSON when | Use ConfigFile when |
|
|
32
|
+
|---------------|---------------------|
|
|
33
|
+
| Nested/structured game state (inventory, quests, world) | Flat key/value settings |
|
|
34
|
+
| One document you load whole | Sectioned options (audio, video, controls) |
|
|
35
|
+
| You want a schema + version field | You want human-editable ini-style |
|
|
36
|
+
|
|
37
|
+
Default to JSON for game progress, ConfigFile for settings.
|
|
38
|
+
|
|
39
|
+
## Save schema (version it from day one)
|
|
40
|
+
|
|
41
|
+
A top-level `version` field is the difference between "old saves still load after
|
|
42
|
+
an update" and "everyone loses their progress on patch day".
|
|
43
|
+
|
|
44
|
+
```gdscript
|
|
45
|
+
const SAVE_PATH := "user://save_0.json"
|
|
46
|
+
const SAVE_VERSION := 1
|
|
47
|
+
|
|
48
|
+
func build_save() -> Dictionary:
|
|
49
|
+
return {
|
|
50
|
+
"version": SAVE_VERSION,
|
|
51
|
+
"level": GameManager.current_level,
|
|
52
|
+
"player": {
|
|
53
|
+
"hp": GameManager.player_health,
|
|
54
|
+
"gold": GameManager.player_gold,
|
|
55
|
+
"pos": var_to_str(player.global_position), # Vector serialized as string
|
|
56
|
+
},
|
|
57
|
+
"inventory": GameManager.inventory, # array of item ids, not item nodes
|
|
58
|
+
"flags": GameManager.story_flags,
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Serialize Vectors/Colors with `var_to_str()` and restore with `str_to_var()` -
|
|
63
|
+
JSON has no native Vector2/3.
|
|
64
|
+
|
|
65
|
+
## Write and read
|
|
66
|
+
|
|
67
|
+
```gdscript
|
|
68
|
+
func save_game() -> void:
|
|
69
|
+
var f := FileAccess.open(SAVE_PATH, FileAccess.WRITE)
|
|
70
|
+
if f == null:
|
|
71
|
+
push_error("save failed: %s" % FileAccess.get_open_error())
|
|
72
|
+
return
|
|
73
|
+
f.store_string(JSON.stringify(build_save(), "\t")) # tab-indented, readable
|
|
74
|
+
f.close()
|
|
75
|
+
|
|
76
|
+
func load_game() -> bool:
|
|
77
|
+
if not FileAccess.file_exists(SAVE_PATH):
|
|
78
|
+
return false
|
|
79
|
+
var f := FileAccess.open(SAVE_PATH, FileAccess.READ)
|
|
80
|
+
var data: Variant = JSON.parse_string(f.get_as_text())
|
|
81
|
+
f.close()
|
|
82
|
+
if typeof(data) != TYPE_DICTIONARY:
|
|
83
|
+
return false # corrupt/partial file
|
|
84
|
+
data = _migrate(data) # bring old versions up to current
|
|
85
|
+
_apply_save(data)
|
|
86
|
+
return true
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Migration (do not skip)
|
|
90
|
+
|
|
91
|
+
When the schema changes, bump `SAVE_VERSION` and upgrade old saves instead of
|
|
92
|
+
rejecting them.
|
|
93
|
+
|
|
94
|
+
```gdscript
|
|
95
|
+
func _migrate(data: Dictionary) -> Dictionary:
|
|
96
|
+
var v: int = data.get("version", 0)
|
|
97
|
+
if v < 1:
|
|
98
|
+
data["flags"] = data.get("flags", {}) # field added in v1
|
|
99
|
+
data["version"] = 1
|
|
100
|
+
return data
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Settings with ConfigFile
|
|
104
|
+
|
|
105
|
+
```gdscript
|
|
106
|
+
func save_settings() -> void:
|
|
107
|
+
var cfg := ConfigFile.new()
|
|
108
|
+
cfg.set_value("audio", "master", master_volume)
|
|
109
|
+
cfg.set_value("video", "fullscreen", is_fullscreen)
|
|
110
|
+
cfg.save("user://settings.cfg")
|
|
111
|
+
|
|
112
|
+
func load_settings() -> void:
|
|
113
|
+
var cfg := ConfigFile.new()
|
|
114
|
+
if cfg.load("user://settings.cfg") != OK:
|
|
115
|
+
return # first run, use defaults
|
|
116
|
+
master_volume = cfg.get_value("audio", "master", 1.0)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Always pass a default to `get_value` so a missing key never crashes.
|
|
120
|
+
|
|
121
|
+
## Autosave hooks
|
|
122
|
+
|
|
123
|
+
- Save on meaningful checkpoints (level end, area transition, shop close), not
|
|
124
|
+
every frame. Disk writes stutter.
|
|
125
|
+
- Save on quit via `_notification`:
|
|
126
|
+
|
|
127
|
+
```gdscript
|
|
128
|
+
func _notification(what: int) -> void:
|
|
129
|
+
if what == NOTIFICATION_WM_CLOSE_REQUEST:
|
|
130
|
+
save_game()
|
|
131
|
+
get_tree().quit()
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Set `get_tree().set_auto_accept_quit(false)` so you control the quit.
|
|
135
|
+
|
|
136
|
+
## Traps
|
|
137
|
+
|
|
138
|
+
- Storing a node/`PackedScene`/callable in the save = unserializable or huge.
|
|
139
|
+
Store ids and rebuild.
|
|
140
|
+
- Writing to `res://` - read-only in exports; silently fails or errors.
|
|
141
|
+
- No `version` field - the first schema change wipes every player's save.
|
|
142
|
+
- `JSON.parse_string` returns `null` on bad input; type-check before using it.
|
|
143
|
+
- Floats round-trip fine; ints may load back as floats from JSON - cast on read
|
|
144
|
+
(`int(data["gold"])`).
|
|
145
|
+
|
|
146
|
+
## Applying it in Summer Engine
|
|
147
|
+
|
|
148
|
+
- The save code is a script, usually an autoload (`res://scripts/autoloads/save_manager.gd`):
|
|
149
|
+
create it with `summer_write_file(path=..., content=..., create_only=true)`,
|
|
150
|
+
then register it with `summer_project_setting(key="autoload/SaveManager", value="*res://scripts/autoloads/save_manager.gd")`
|
|
151
|
+
(the leading `*` makes it a singleton). Check it with `summer_get_script_errors`.
|
|
152
|
+
- `user://` is the per-user data dir, outside the project, so do not expect
|
|
153
|
+
`summer_read_file` (a project-file reader) to show a save file. Prove a round trip from inside the game
|
|
154
|
+
instead: a `RunVerification` probe (see `playtesting-a-feature`) that calls
|
|
155
|
+
`save_game()`, changes a value, calls `load_game()`, and `report()`s the
|
|
156
|
+
restored value.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
id: skill/save-load
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Persist game state in Summer Engine: user:// paths, JSON progress vs ConfigFile settings, a versioned save schema with migration, autosave hooks."
|
|
5
|
+
use_when:
|
|
6
|
+
- persisting progress, settings, high scores, checkpoints, or save slots
|
|
7
|
+
- deciding between JSON and ConfigFile for a save or settings file
|
|
8
|
+
- making saves survive game updates with a schema version and migration
|
|
9
|
+
facets:
|
|
10
|
+
lifecycle:
|
|
11
|
+
- build
|
|
12
|
+
domains:
|
|
13
|
+
- scripting
|
|
14
|
+
- gameplay
|
|
15
|
+
modalities:
|
|
16
|
+
- scripts
|
|
17
|
+
compatibility:
|
|
18
|
+
engine: ">=4.6"
|
|
19
|
+
related:
|
|
20
|
+
skills:
|
|
21
|
+
- skill/make-game
|
|
22
|
+
- skill/gdscript-patterns
|
|
23
|
+
- skill/ui-basics
|
|
24
|
+
source: official
|
|
25
|
+
license: MIT
|
|
26
|
+
status: preview
|
|
27
|
+
recommended: false
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: scene-composition
|
|
3
|
-
description: "
|
|
3
|
+
description: "Scene structure conventions — node hierarchy, when to extract sub-scenes, reusable prefab patterns, and instance-versus-add-node decisions."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: scene-and-project
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: scene-hierarchy-design
|
|
3
|
-
description: "
|
|
3
|
+
description: "Structure Summer Engine scenes by access pattern — asset vs live hierarchies, wrapper nodes per operation, sub-scenes for reuse, path-agnostic logic."
|
|
4
4
|
license: MIT
|
|
5
5
|
category: workflow
|
|
6
6
|
tags:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: scene-scripting
|
|
3
|
-
description:
|
|
3
|
+
description: "One GDScript in the live editor (summer_run_script) builds scenes, 2D levels, HUDs and gameplay wiring instead of CRUD chains; verify with diff + screenshot."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Scene Scripting
|