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,136 @@
|
|
|
1
|
+
# 3D Controllers: First + Third Person
|
|
2
|
+
|
|
3
|
+
Both build on the minimal 3D walk in SKILL.md. The difference is entirely the
|
|
4
|
+
camera rig and how look rotation is split across nodes.
|
|
5
|
+
|
|
6
|
+
## First-person node layout (non-negotiable)
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
Player (CharacterBody3D) # yaw (horizontal look) rotates THIS
|
|
10
|
+
CollisionShape3D # CapsuleShape3D, radius 0.35, height 1.8
|
|
11
|
+
Head (Node3D) # y = 1.5; pitch (vertical look) rotates THIS
|
|
12
|
+
Camera3D # fov 70-75
|
|
13
|
+
WeaponHolder (Node3D) # weapons/tools ride here
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Yaw on the body, pitch on the Head. Never pitch the body (gimbal lock + physics
|
|
17
|
+
tilt). Camera is a child of Head so it inherits both rotations.
|
|
18
|
+
|
|
19
|
+
```gdscript
|
|
20
|
+
extends CharacterBody3D
|
|
21
|
+
|
|
22
|
+
@export var speed: float = 5.0
|
|
23
|
+
@export var sprint_speed: float = 8.0
|
|
24
|
+
@export var jump_velocity: float = 4.5
|
|
25
|
+
@export var mouse_sensitivity: float = 0.002
|
|
26
|
+
|
|
27
|
+
@onready var head: Node3D = $Head
|
|
28
|
+
var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
|
|
29
|
+
|
|
30
|
+
func _ready() -> void:
|
|
31
|
+
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
|
32
|
+
|
|
33
|
+
func _unhandled_input(event: InputEvent) -> void:
|
|
34
|
+
if event is InputEventMouseMotion:
|
|
35
|
+
rotate_y(-event.relative.x * mouse_sensitivity)
|
|
36
|
+
head.rotate_x(-event.relative.y * mouse_sensitivity)
|
|
37
|
+
head.rotation.x = clampf(head.rotation.x, -PI / 2.0, PI / 2.0)
|
|
38
|
+
if event.is_action_pressed("ui_cancel"):
|
|
39
|
+
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
|
40
|
+
|
|
41
|
+
func _physics_process(delta: float) -> void:
|
|
42
|
+
if not is_on_floor():
|
|
43
|
+
velocity.y -= gravity * delta
|
|
44
|
+
if Input.is_action_just_pressed("jump") and is_on_floor():
|
|
45
|
+
velocity.y = jump_velocity
|
|
46
|
+
var cur_speed := sprint_speed if Input.is_action_pressed("sprint") else speed
|
|
47
|
+
var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_back")
|
|
48
|
+
var direction := (transform.basis * Vector3(input_dir.x, 0.0, input_dir.y)).normalized()
|
|
49
|
+
if direction:
|
|
50
|
+
velocity.x = direction.x * cur_speed
|
|
51
|
+
velocity.z = direction.z * cur_speed
|
|
52
|
+
else:
|
|
53
|
+
velocity.x = move_toward(velocity.x, 0.0, cur_speed)
|
|
54
|
+
velocity.z = move_toward(velocity.z, 0.0, cur_speed)
|
|
55
|
+
move_and_slide()
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Crouch
|
|
59
|
+
|
|
60
|
+
Keep two collision shapes (standing + crouching), toggle `disabled`, and a
|
|
61
|
+
`RayCast3D` pointing up (`CeilingCheck`) so you cannot stand up under a ceiling.
|
|
62
|
+
Lerp the Head y from 1.5 to ~0.9 for a smooth crouch, not a snap.
|
|
63
|
+
|
|
64
|
+
## Headbob (optional polish)
|
|
65
|
+
|
|
66
|
+
Drive the Camera's local y with `sin(time * bob_freq) * bob_amp` scaled by
|
|
67
|
+
horizontal speed, only while `is_on_floor()`. Keep amp under 0.08 or it nauseates.
|
|
68
|
+
|
|
69
|
+
## Third-person node layout
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
Player (CharacterBody3D)
|
|
73
|
+
CharacterRotationRoot (Node3D) # only this visual node yaws toward movement
|
|
74
|
+
character.tscn # normalized role-neutral visual package
|
|
75
|
+
CameraController (Node3D)
|
|
76
|
+
SpringArm3D # extends behind the -Z-facing visual on local +Z
|
|
77
|
+
Camera3D
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The `SpringArm3D` is the whole trick: it raycasts from the pivot to the camera
|
|
81
|
+
and shortens when a wall is in the way, so the camera never clips into geometry.
|
|
82
|
+
Set its `collision_mask` to your Level layer only (not the player).
|
|
83
|
+
|
|
84
|
+
Third-person differences from FPS:
|
|
85
|
+
- Mouse motion rotates the `CameraController` (orbit), not the body.
|
|
86
|
+
- The visual wrapper rotates to face the MOVEMENT direction, decoupled from the camera.
|
|
87
|
+
Because imported characters face Godot forward `-Z`, lerp
|
|
88
|
+
`CharacterRotationRoot.rotation.y` toward `atan2(-direction.x, -direction.z)`.
|
|
89
|
+
- Rotate only `CharacterRotationRoot.rotation.y`. Do not yaw the CharacterBody3D or add a
|
|
90
|
+
compensating 180-degree model rotation. The package already normalizes forward to `-Z`.
|
|
91
|
+
- Keep the third-person camera behind the character on the camera rig's local `+Z` side.
|
|
92
|
+
- Camera direction drives movement basis: build `direction` from the spring-arm's
|
|
93
|
+
global basis, flattened to the XZ plane, so "forward" means "where the camera
|
|
94
|
+
looks".
|
|
95
|
+
|
|
96
|
+
## Canonical humanoid animation states
|
|
97
|
+
|
|
98
|
+
Keep translation in the controller and use package animations only as in-place visuals.
|
|
99
|
+
For a standard playable third-person character, read and copy
|
|
100
|
+
`default-third-person-controller.gd`. It already loads exact semantic roles
|
|
101
|
+
from `character.json`, selects state after `move_and_slide()`, gives airborne
|
|
102
|
+
Jump highest priority, changes clips only when state changes, uses camera-relative
|
|
103
|
+
movement, and turns only the normalized `-Z` visual root. Do not reassemble the
|
|
104
|
+
controller from partial examples.
|
|
105
|
+
|
|
106
|
+
Do not advance the `CharacterBody3D` from animation root translation. Rotate only the
|
|
107
|
+
visual child when movement is non-zero, and keep the last facing direction while idle.
|
|
108
|
+
|
|
109
|
+
## Legacy clip-name compatibility only
|
|
110
|
+
|
|
111
|
+
Use substring discovery only for old, non-package GLBs that have no manifest. Resolve Jump
|
|
112
|
+
before Run and claim each real clip at most once. Never use this for a canonical package:
|
|
113
|
+
|
|
114
|
+
```gdscript
|
|
115
|
+
func resolve_legacy_roles(player: AnimationPlayer) -> Dictionary:
|
|
116
|
+
var result: Dictionary = {}
|
|
117
|
+
var used_clips: Dictionary = {}
|
|
118
|
+
for role in [&"jump", &"idle", &"walk", &"run"]: # Jump must precede Run.
|
|
119
|
+
for clip in player.get_animation_list():
|
|
120
|
+
if used_clips.has(clip):
|
|
121
|
+
continue
|
|
122
|
+
if String(clip).to_lower().contains(String(role)):
|
|
123
|
+
result[role] = clip
|
|
124
|
+
used_clips[clip] = true
|
|
125
|
+
break
|
|
126
|
+
return result
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Validate every requested role after legacy resolution. Do not fall back from Jump to Walk
|
|
130
|
+
or Run, and do not reuse one clip for multiple roles.
|
|
131
|
+
|
|
132
|
+
## Shared traps
|
|
133
|
+
|
|
134
|
+
- Capture/release the mouse as a pair or you trap the player (see SKILL.md).
|
|
135
|
+
- Sprint reads an unbound `sprint` action = silent no-op; bind it first.
|
|
136
|
+
- Spring arm with the wrong mask collides with the player and jams at length 0.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Platformer Feel
|
|
2
|
+
|
|
3
|
+
The base controller in SKILL.md runs, but a raw `is_on_floor()` jump feels stiff
|
|
4
|
+
and unforgiving. These four additions are what separate a prototype from a game
|
|
5
|
+
that feels good. Add them in this order; each is independent.
|
|
6
|
+
|
|
7
|
+
## Coyote time
|
|
8
|
+
|
|
9
|
+
Let the player jump for a few frames AFTER walking off a ledge. Without it, jumps
|
|
10
|
+
near edges feel like the game ate the input.
|
|
11
|
+
|
|
12
|
+
```gdscript
|
|
13
|
+
@export var coyote_time: float = 0.1
|
|
14
|
+
var _coyote_timer: float = 0.0
|
|
15
|
+
|
|
16
|
+
func _physics_process(delta: float) -> void:
|
|
17
|
+
if not is_on_floor():
|
|
18
|
+
velocity.y += gravity * delta
|
|
19
|
+
_coyote_timer -= delta
|
|
20
|
+
else:
|
|
21
|
+
_coyote_timer = coyote_time
|
|
22
|
+
# jump check uses _coyote_timer > 0.0 instead of is_on_floor()
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Jump buffering
|
|
26
|
+
|
|
27
|
+
If the player presses jump a few frames BEFORE landing, remember it and fire on
|
|
28
|
+
touchdown. Without it, fast players feel like jumps get dropped.
|
|
29
|
+
|
|
30
|
+
```gdscript
|
|
31
|
+
@export var jump_buffer: float = 0.1
|
|
32
|
+
var _buffer_timer: float = 0.0
|
|
33
|
+
|
|
34
|
+
func _physics_process(delta: float) -> void:
|
|
35
|
+
if Input.is_action_just_pressed("jump"):
|
|
36
|
+
_buffer_timer = jump_buffer
|
|
37
|
+
_buffer_timer -= delta
|
|
38
|
+
if _buffer_timer > 0.0 and _coyote_timer > 0.0:
|
|
39
|
+
velocity.y = jump_velocity
|
|
40
|
+
_buffer_timer = 0.0
|
|
41
|
+
_coyote_timer = 0.0
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Variable jump height
|
|
45
|
+
|
|
46
|
+
Tap = short hop, hold = full jump. Cut upward velocity when the button releases.
|
|
47
|
+
|
|
48
|
+
```gdscript
|
|
49
|
+
if Input.is_action_just_released("jump") and velocity.y < 0.0:
|
|
50
|
+
velocity.y *= 0.4
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Asymmetric gravity (fall faster than you rise)
|
|
54
|
+
|
|
55
|
+
A heavier fall gravity is the single biggest feel upgrade. Rising floaty, falling
|
|
56
|
+
snappy reads as responsive.
|
|
57
|
+
|
|
58
|
+
```gdscript
|
|
59
|
+
@export var fall_multiplier: float = 1.6
|
|
60
|
+
|
|
61
|
+
func _physics_process(delta: float) -> void:
|
|
62
|
+
var g := gravity * (fall_multiplier if velocity.y > 0.0 else 1.0)
|
|
63
|
+
if not is_on_floor():
|
|
64
|
+
velocity.y += g * delta
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## One-way platforms
|
|
68
|
+
|
|
69
|
+
Use a `CollisionPolygon2D`/`CollisionShape2D` on a platform with
|
|
70
|
+
`one_way_collision = true` in the platform's collision shape. Drop through by
|
|
71
|
+
briefly disabling the player's collision with that layer, or move the player to a
|
|
72
|
+
lower collision layer while `move_down` is held.
|
|
73
|
+
|
|
74
|
+
## Tuning starting points
|
|
75
|
+
|
|
76
|
+
| Feel | speed | jump_velocity | gravity scale |
|
|
77
|
+
|------|-------|---------------|---------------|
|
|
78
|
+
| Tight/precise | 180 | -320 | 1.0 (fall 1.8) |
|
|
79
|
+
| Floaty/explorer | 220 | -420 | 0.7 (fall 1.3) |
|
|
80
|
+
| Fast/action | 300 | -380 | 1.0 (fall 2.0) |
|
|
81
|
+
|
|
82
|
+
Never ship default gravity 980 with a -350 jump and call it done - that is the
|
|
83
|
+
"why does my jump feel bad" default. Tune fall_multiplier first.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
id: skill/character-movement
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.2.1
|
|
4
|
+
summary: "Player controllers for 2D and 3D, plus the canonical third-person controller for Summer humanoid packages: movement owns translation, clips follow state."
|
|
5
|
+
use_when:
|
|
6
|
+
- building or fixing player movement — gravity, collision, side-scroller, top-down, or 3D walk
|
|
7
|
+
- wiring an imported Summer character package (character.tscn) as the playable third-person player
|
|
8
|
+
- walk, run, and jump animation states, facing, or mouse look for a player controller
|
|
9
|
+
- the jump feels bad — coyote time, jump buffering, variable jump height, one-way platforms
|
|
10
|
+
do_not_use_when:
|
|
11
|
+
- a production first-person shooter controller with air control and external velocity — use fps-controller
|
|
12
|
+
- Celeste-style momentum precision platforming with dash and wall climb — use celeste-momentum-platforming
|
|
13
|
+
facets:
|
|
14
|
+
lifecycle:
|
|
15
|
+
- build
|
|
16
|
+
domains:
|
|
17
|
+
- character-controller
|
|
18
|
+
- gameplay
|
|
19
|
+
- 2d
|
|
20
|
+
- 3d
|
|
21
|
+
modalities:
|
|
22
|
+
- scripts
|
|
23
|
+
- scenes
|
|
24
|
+
- animation
|
|
25
|
+
compatibility:
|
|
26
|
+
engine: ">=4.6"
|
|
27
|
+
related:
|
|
28
|
+
skills:
|
|
29
|
+
- skill/make-game
|
|
30
|
+
- skill/camera-rigs
|
|
31
|
+
- skill/combat-basics
|
|
32
|
+
- skill/fps-controller
|
|
33
|
+
- skill/celeste-momentum-platforming
|
|
34
|
+
- skill/character-animation-wiring
|
|
35
|
+
- skill/character-model
|
|
36
|
+
- skill/playtesting-a-feature
|
|
37
|
+
source: official
|
|
38
|
+
license: MIT
|
|
39
|
+
status: preview
|
|
40
|
+
recommended: false
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: character-portrait
|
|
3
|
-
description:
|
|
3
|
+
description: "Generate a single polished character bust for dialogue UI, character select, lore cards, or codex entries. One character, locked composition, VN-style."
|
|
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: cinematic-cutscene
|
|
3
|
-
description:
|
|
3
|
+
description: "Generate a non-interactive cutscene — reference-locked look, a 5-10s image-to-video shot, optional TTS dialogue — wired as a fading VideoStreamPlayer."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: video
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: combat-basics
|
|
3
|
+
description: "Damage in Summer Engine: hitbox and hurtbox Areas on opposing layers, a reusable Health component, damage signals, knockback, hit feedback, projectiles."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
|
|
6
|
+
category: gameplay-mechanics
|
|
7
|
+
user-invocable: false
|
|
8
|
+
allowed-tools: Read Grep summer_read_file summer_write_file summer_replace_text summer_add_node summer_set_prop summer_batch summer_project_setting summer_save_scene summer_get_script_errors summer_get_diagnostics
|
|
9
|
+
paths: ["**/*.gd", "**/*.tscn"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Combat Basics
|
|
13
|
+
|
|
14
|
+
The Godot combat pattern is hitbox + hurtbox + health, wired by signals. Build it
|
|
15
|
+
component-first: the same three pieces work for player, enemies, and destructibles.
|
|
16
|
+
|
|
17
|
+
## The layer model (set this up first)
|
|
18
|
+
|
|
19
|
+
Attacks are `Area2D`/`Area3D`, not solid bodies. A hitbox (the attack) detects a
|
|
20
|
+
hurtbox (the thing that can be hurt) via collision layers/masks:
|
|
21
|
+
|
|
22
|
+
| Node | on layer | masks (detects) |
|
|
23
|
+
|------|----------|-----------------|
|
|
24
|
+
| Player hurtbox | PlayerHurt | EnemyHit |
|
|
25
|
+
| Player hitbox (sword) | PlayerHit | EnemyHurt |
|
|
26
|
+
| Enemy hurtbox | EnemyHurt | PlayerHit |
|
|
27
|
+
| Enemy hitbox | EnemyHit | PlayerHurt |
|
|
28
|
+
|
|
29
|
+
Rule: every combat Area masks only the OPPOSING side. This is why the player's
|
|
30
|
+
sword never damages the player. An Area reports `area_entered` only for areas on
|
|
31
|
+
a layer in its OWN mask, so the hurtbox below (which listens) must mask the
|
|
32
|
+
opposing hitbox layer; a hurtbox with an empty mask never registers a hit.
|
|
33
|
+
|
|
34
|
+
Name the layers once so you are not counting bits by hand —
|
|
35
|
+
`summer_project_setting(key="layer_names/2d_physics/layer_4", value="PlayerHit")`
|
|
36
|
+
(use `layer_names/3d_physics/...` for 3D), one call per layer.
|
|
37
|
+
|
|
38
|
+
## Health component (reuse everywhere)
|
|
39
|
+
|
|
40
|
+
Attach to any damageable node. It owns HP and fires signals; UI and death logic
|
|
41
|
+
just listen.
|
|
42
|
+
|
|
43
|
+
```gdscript
|
|
44
|
+
class_name Health extends Node
|
|
45
|
+
|
|
46
|
+
signal damaged(amount: int, current: int)
|
|
47
|
+
signal died
|
|
48
|
+
|
|
49
|
+
@export var max_health: int = 100
|
|
50
|
+
var current: int
|
|
51
|
+
|
|
52
|
+
func _ready() -> void:
|
|
53
|
+
current = max_health
|
|
54
|
+
|
|
55
|
+
func take_damage(amount: int) -> void:
|
|
56
|
+
if current <= 0:
|
|
57
|
+
return
|
|
58
|
+
current = maxi(0, current - amount)
|
|
59
|
+
damaged.emit(amount, current)
|
|
60
|
+
if current == 0:
|
|
61
|
+
died.emit()
|
|
62
|
+
|
|
63
|
+
func heal(amount: int) -> void:
|
|
64
|
+
current = mini(max_health, current + amount)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Hurtbox -> Health
|
|
68
|
+
|
|
69
|
+
The hurtbox is an Area on the body; when a hitbox overlaps it, read the hitbox's
|
|
70
|
+
damage and route it to the Health node.
|
|
71
|
+
|
|
72
|
+
```gdscript
|
|
73
|
+
extends Area2D # Hurtbox, child of the character
|
|
74
|
+
|
|
75
|
+
@export var health_path: NodePath
|
|
76
|
+
@onready var health: Health = get_node(health_path)
|
|
77
|
+
|
|
78
|
+
func _ready() -> void:
|
|
79
|
+
area_entered.connect(_on_area_entered)
|
|
80
|
+
|
|
81
|
+
func _on_area_entered(hitbox: Area2D) -> void:
|
|
82
|
+
if hitbox.has_method("get_damage"):
|
|
83
|
+
health.take_damage(hitbox.get_damage())
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Hitbox
|
|
87
|
+
|
|
88
|
+
```gdscript
|
|
89
|
+
extends Area2D # Hitbox, child of weapon or attack
|
|
90
|
+
|
|
91
|
+
@export var damage: int = 10
|
|
92
|
+
func get_damage() -> int:
|
|
93
|
+
return damage
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Enable the hitbox only during the active frames of a swing (toggle
|
|
97
|
+
`monitoring`/`monitorable` or the CollisionShape's `disabled`), driven by an
|
|
98
|
+
AnimationPlayer track. An always-on melee hitbox hits on touch, which feels wrong.
|
|
99
|
+
|
|
100
|
+
## Death, knockback, feedback
|
|
101
|
+
|
|
102
|
+
- On `died`: `queue_free()`, spawn a death VFX, drop loot, `add_kill()` on your
|
|
103
|
+
game manager. For the player, switch to a GAME_OVER state instead of freeing.
|
|
104
|
+
- Knockback: push the victim `velocity = (victim.global_position -
|
|
105
|
+
attacker.global_position).normalized() * force`, decay it each frame.
|
|
106
|
+
- Every hit needs feedback or it reads as broken: a flash (`modulate` to white for
|
|
107
|
+
0.05s), a damage number (floating Label), a small screen shake, a hitstop
|
|
108
|
+
(`Engine.time_scale = 0.05` for one frame). Silent damage feels like a no-op.
|
|
109
|
+
|
|
110
|
+
## Projectiles (short version)
|
|
111
|
+
|
|
112
|
+
An `Area2D/3D` that moves forward and calls `take_damage` on what it hits, then
|
|
113
|
+
frees itself.
|
|
114
|
+
|
|
115
|
+
```gdscript
|
|
116
|
+
extends Area2D # projectile
|
|
117
|
+
|
|
118
|
+
@export var speed: float = 600.0
|
|
119
|
+
@export var damage: int = 15
|
|
120
|
+
var direction: Vector2 = Vector2.RIGHT
|
|
121
|
+
|
|
122
|
+
func _ready() -> void:
|
|
123
|
+
body_entered.connect(_on_hit)
|
|
124
|
+
get_tree().create_timer(3.0).timeout.connect(queue_free) # lifetime
|
|
125
|
+
|
|
126
|
+
func _physics_process(delta: float) -> void:
|
|
127
|
+
position += direction * speed * delta
|
|
128
|
+
|
|
129
|
+
func _on_hit(body: Node) -> void:
|
|
130
|
+
if body.has_node("Health"):
|
|
131
|
+
body.get_node("Health").take_damage(damage)
|
|
132
|
+
queue_free()
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Homing, piercing, AoE, and pooling many bullets are in this skill's
|
|
136
|
+
`references/projectiles-and-aoe.md` — read it only when you need one of those.
|
|
137
|
+
|
|
138
|
+
## Traps
|
|
139
|
+
|
|
140
|
+
- Hitbox on the wrong layer/mask = no hits or friendly fire. Verify the layer
|
|
141
|
+
table above before debugging the scripts.
|
|
142
|
+
- Two Areas with neither `monitoring` nor `monitorable` never report overlap.
|
|
143
|
+
- Freeing a node mid-signal can error - defer with `queue_free()` (safe), not
|
|
144
|
+
`free()`.
|
|
145
|
+
- Damaging in `_process` instead of on overlap = continuous per-frame damage.
|
|
146
|
+
|
|
147
|
+
## Applying it in Summer Engine
|
|
148
|
+
|
|
149
|
+
- Scripts (`health.gd`, `hurtbox.gd`, `hitbox.gd`, `projectile.gd`) are files:
|
|
150
|
+
create with `summer_write_file(path=..., content=..., create_only=true)`,
|
|
151
|
+
change with `summer_replace_text`. Check each with `summer_get_script_errors`.
|
|
152
|
+
- Nodes (the Area, its CollisionShape, the Health child) are scene mutations:
|
|
153
|
+
`summer_add_node` / `summer_set_prop` with `scenePath`, or one `summer_batch`
|
|
154
|
+
with `AddNode` / `SetProp` ops so the scene saves once. Set `collision_layer`
|
|
155
|
+
and `collision_mask` as integers (bit values), not layer names.
|
|
156
|
+
- Prove a hit with a `RunVerification` probe (see `playtesting-a-feature`):
|
|
157
|
+
spawn or find one enemy, press the attack action, `report()` the enemy's
|
|
158
|
+
`Health.current` before and after. A static scene check cannot show that a
|
|
159
|
+
hit registered.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Projectiles, AoE, and Pooling
|
|
2
|
+
|
|
3
|
+
Extends the base projectile in SKILL.md. Pick the behavior you need; they compose.
|
|
4
|
+
|
|
5
|
+
## Homing
|
|
6
|
+
|
|
7
|
+
Steer the direction toward the nearest target each frame. Turn rate keeps it from
|
|
8
|
+
being unavoidable.
|
|
9
|
+
|
|
10
|
+
```gdscript
|
|
11
|
+
@export var turn_rate: float = 4.0
|
|
12
|
+
var target: Node2D
|
|
13
|
+
|
|
14
|
+
func _physics_process(delta: float) -> void:
|
|
15
|
+
if is_instance_valid(target):
|
|
16
|
+
var desired := (target.global_position - global_position).normalized()
|
|
17
|
+
direction = direction.lerp(desired, turn_rate * delta).normalized()
|
|
18
|
+
position += direction * speed * delta
|
|
19
|
+
rotation = direction.angle()
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Find the nearest target by querying a group: iterate
|
|
23
|
+
`get_tree().get_nodes_in_group("enemies")` and keep the min `distance_to`. For
|
|
24
|
+
hundreds of enemies, cache the list and refresh every few frames, not per bullet.
|
|
25
|
+
|
|
26
|
+
## Piercing
|
|
27
|
+
|
|
28
|
+
Do not free on first hit; count hits and track who was already hit.
|
|
29
|
+
|
|
30
|
+
```gdscript
|
|
31
|
+
@export var pierce: int = 3
|
|
32
|
+
var _hit: Array = []
|
|
33
|
+
|
|
34
|
+
func _on_hit(body: Node) -> void:
|
|
35
|
+
if body in _hit:
|
|
36
|
+
return
|
|
37
|
+
_hit.append(body)
|
|
38
|
+
_apply_damage(body)
|
|
39
|
+
pierce -= 1
|
|
40
|
+
if pierce <= 0:
|
|
41
|
+
queue_free()
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Area of effect (explosion)
|
|
45
|
+
|
|
46
|
+
Spawn an Area with a large CollisionShape for one frame, damage everything
|
|
47
|
+
overlapping, then free. Scale damage by distance for a shockwave feel.
|
|
48
|
+
|
|
49
|
+
```gdscript
|
|
50
|
+
func explode() -> void:
|
|
51
|
+
for body in $Blast.get_overlapping_bodies():
|
|
52
|
+
if body.has_node("Health"):
|
|
53
|
+
var t := 1.0 - global_position.distance_to(body.global_position) / radius
|
|
54
|
+
body.get_node("Health").take_damage(int(max_damage * maxf(t, 0.2)))
|
|
55
|
+
spawn_vfx()
|
|
56
|
+
queue_free()
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Ground DOT (burning patch): an Area that ticks damage on a `Timer.timeout` to
|
|
60
|
+
bodies currently inside it, for a lifetime, then frees.
|
|
61
|
+
|
|
62
|
+
## Object pooling (many projectiles)
|
|
63
|
+
|
|
64
|
+
Instancing and freeing hundreds of bullets per second stutters. Reuse a fixed pool.
|
|
65
|
+
|
|
66
|
+
```gdscript
|
|
67
|
+
extends Node2D # BulletPool autoload or level node
|
|
68
|
+
|
|
69
|
+
@export var bullet_scene: PackedScene
|
|
70
|
+
@export var pool_size: int = 200
|
|
71
|
+
var _pool: Array[Node2D] = []
|
|
72
|
+
var _next: int = 0
|
|
73
|
+
|
|
74
|
+
func _ready() -> void:
|
|
75
|
+
for i in pool_size:
|
|
76
|
+
var b := bullet_scene.instantiate()
|
|
77
|
+
b.set_process(false)
|
|
78
|
+
b.hide()
|
|
79
|
+
add_child(b)
|
|
80
|
+
_pool.append(b)
|
|
81
|
+
|
|
82
|
+
func fire(pos: Vector2, dir: Vector2) -> void:
|
|
83
|
+
var b := _pool[_next]
|
|
84
|
+
_next = (_next + 1) % pool_size
|
|
85
|
+
b.global_position = pos
|
|
86
|
+
b.direction = dir
|
|
87
|
+
b.set_process(true)
|
|
88
|
+
b.show()
|
|
89
|
+
# bullet hides + set_process(false) instead of queue_free on hit/lifetime
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Deactivate (hide + `set_process(false)`) instead of freeing; the pool recycles the
|
|
93
|
+
oldest. This is how survivors-style games sustain thousands of projectiles.
|
|
94
|
+
|
|
95
|
+
## Traps
|
|
96
|
+
|
|
97
|
+
- Homing with no turn cap = undodgeable and unfun. Cap `turn_rate`.
|
|
98
|
+
- Pooled bullets that `queue_free()` defeat the pool - hide and disable instead.
|
|
99
|
+
- AoE that reads overlaps in `_process` re-damages every frame; do it once.
|
|
100
|
+
- Distance-scaled damage with no floor (`maxf(t, 0.2)`) makes edges deal 0.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
id: skill/combat-basics
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Damage in Summer Engine: hitbox and hurtbox Areas on opposing layers, a reusable Health component, damage signals, knockback, hit feedback, projectiles."
|
|
5
|
+
use_when:
|
|
6
|
+
- adding attacks, health and damage, or enemies that can be hit and hit back
|
|
7
|
+
- adding projectiles or bullets — homing, piercing, area-of-effect, or pooling hundreds of them
|
|
8
|
+
- wiring death and respawn, or debugging hits that never land or friendly fire
|
|
9
|
+
do_not_use_when:
|
|
10
|
+
- auto-fire weapons that over-commit or overkill targets — that is the pending-damage pattern in auto-fire-targeting
|
|
11
|
+
- hits work but feel weak or floaty — tune the feedback layer with game-feel or debugging-game-feel
|
|
12
|
+
facets:
|
|
13
|
+
lifecycle:
|
|
14
|
+
- build
|
|
15
|
+
domains:
|
|
16
|
+
- gameplay
|
|
17
|
+
- scripting
|
|
18
|
+
- game-design
|
|
19
|
+
modalities:
|
|
20
|
+
- scripts
|
|
21
|
+
- scenes
|
|
22
|
+
compatibility:
|
|
23
|
+
engine: ">=4.6"
|
|
24
|
+
related:
|
|
25
|
+
skills:
|
|
26
|
+
- skill/make-game
|
|
27
|
+
- skill/character-movement
|
|
28
|
+
- skill/game-feel
|
|
29
|
+
- skill/auto-fire-targeting
|
|
30
|
+
- skill/design-npc
|
|
31
|
+
source: official
|
|
32
|
+
license: MIT
|
|
33
|
+
status: preview
|
|
34
|
+
recommended: false
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: concept-art
|
|
3
|
-
description:
|
|
3
|
+
description: "Explore art direction with 3-4 rough concept variants of a character, environment, or prop to pick a vibe before committing to a final asset."
|
|
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: create-asset-sheet
|
|
3
|
-
description:
|
|
3
|
+
description: "Generate a pack of 2D game assets from one prompt — tile sheet, UI kit, character pack, or biome set — sliced, classified, and saved as one pack ArtAsset."
|
|
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: debug
|
|
3
|
-
description:
|
|
3
|
+
description: "Disciplined bug/crash/error loop for Summer projects — script errors, console, debugger, hypothesis, fix, verify — before making code or scene changes."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
|
|
6
6
|
category: debugging
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: debugging-game-feel
|
|
3
|
-
description:
|
|
3
|
+
description: "Debug features that work but feel wrong — floaty jumps, mushy combat, sluggish camera — subjective bugs living in tuning, timing, and feedback layers."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Debugging Game Feel
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: design-level
|
|
3
|
-
description:
|
|
3
|
+
description: "Design a single level — layout, pacing, encounters, secrets, reward gating — outputs a level design doc and a node-tree skeleton for summer_create_scene."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: level-design
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: design-mechanic
|
|
3
|
-
description:
|
|
3
|
+
description: "Design one game mechanic in detail — input, response, feedback, failure modes, depth, tunables — outputs a design doc, node-graph sketch, GDScript stub."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: gameplay-mechanics
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: design-npc
|
|
3
|
-
description:
|
|
3
|
+
description: "Design enemy/NPC/boss/companion behavior — perception, personality, intent, action state machine, telegraphs — outputs a GDScript stub plus node tree."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: ai-and-npcs
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: diagnosing-perf-regressions
|
|
3
|
-
description:
|
|
3
|
+
description: "Find why frame rate, frame time, or load time got worse since a known-good state — regression hunting, not general performance tuning."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Diagnosing Performance Regressions
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dispatching-parallel-agents
|
|
3
|
-
description:
|
|
3
|
+
description: "Work 2+ independent tasks in parallel when they share no state and have no sequential dependencies."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Dispatching Parallel Agents
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: driving-the-editor-ui
|
|
3
|
-
description:
|
|
3
|
+
description: "Drive the editor UI by name: invoke actions, clear blocking dialogs, switch the main screen, read a dock — and route scene work to the scene tools instead."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Driving the Editor UI
|