summer-engine 2.3.0 → 2.5.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 +1 -1
- package/.claude-plugin/plugin.json +20 -5
- package/.codex-plugin/plugin.json +15 -5
- package/.cursor-plugin/plugin.json +15 -5
- package/.factory-plugin/plugin.json +2 -2
- package/.opencode/INSTALL.md +1 -1
- package/CHANGELOG.md +27 -6
- package/CLAUDE.md +2 -2
- package/GEMINI.md +2 -3
- package/README.md +51 -30
- package/_persona/summer/SKILL.md +5 -6
- package/commands/gameskill.md +103 -0
- package/dist/bin/summer.js +12 -4
- package/dist/commands/create.js +2 -0
- package/dist/commands/doctor.js +71 -1
- package/dist/commands/install.d.ts +17 -0
- package/dist/commands/install.js +63 -4
- package/dist/commands/memory.d.ts +14 -0
- package/dist/commands/memory.js +196 -0
- package/dist/commands/setup.js +8 -2
- package/dist/commands/skills.js +90 -6
- package/dist/commands/status.js +3 -0
- package/dist/lib/agent-config.d.ts +2 -2
- package/dist/lib/agent-config.js +134 -7
- package/dist/lib/api-client.d.ts +13 -0
- package/dist/lib/api-client.js +63 -26
- package/dist/lib/async-op-lifecycle.d.ts +60 -0
- package/dist/lib/async-op-lifecycle.js +83 -0
- package/dist/lib/project-memory.d.ts +33 -0
- package/dist/lib/project-memory.js +220 -0
- package/dist/lib/skills-registry.d.ts +134 -61
- package/dist/lib/skills-registry.js +102 -4
- package/dist/lib/version-check.d.ts +106 -0
- package/dist/lib/version-check.js +338 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +81 -0
- package/dist/mcp/tools/debug-tools.js +32 -2
- package/dist/mcp/tools/project-tools.js +18 -6
- package/dist/mcp/tools/with-engine.d.ts +14 -0
- package/dist/mcp/tools/with-engine.js +52 -7
- package/gemini-extension.json +2 -2
- package/hooks/pre-commit-doctor.sh +0 -0
- package/hooks/run-hook.cmd +0 -0
- package/hooks/session-start.sh +0 -0
- package/package.json +6 -4
- package/skills/2d-assets/character-portrait/SKILL.md +1 -1
- package/skills/2d-assets/concept-art/SKILL.md +1 -1
- package/skills/2d-assets/create-asset-sheet/SKILL.md +163 -0
- package/skills/2d-assets/instantiate-asset-pack/SKILL.md +245 -0
- package/skills/2d-assets/pixel-art/SKILL.md +1 -1
- package/skills/2d-assets/skybox-panorama/SKILL.md +1 -1
- package/skills/2d-assets/sprite-sheet/SKILL.md +1 -1
- package/skills/2d-assets/tileable-texture/SKILL.md +1 -1
- package/skills/2d-assets/ui-graphics/SKILL.md +1 -1
- package/skills/2d-assets/use-widget-asset/SKILL.md +217 -0
- package/skills/3d-assets/character-model/SKILL.md +1 -1
- package/skills/3d-assets/organic-model/SKILL.md +1 -1
- package/skills/3d-assets/prop-model/SKILL.md +1 -1
- package/skills/3d-assets/vehicle-model/SKILL.md +1 -1
- package/skills/README.md +37 -30
- package/skills/ai-and-npcs/design-npc/SKILL.md +6 -6
- package/skills/animation/animation-tree/SKILL.md +2 -2
- package/skills/animation/facial-and-lipsync/SKILL.md +1 -1
- package/skills/animation/generate-motion/SKILL.md +1 -1
- package/skills/animation/procedural-animation/SKILL.md +2 -2
- package/skills/audio/adaptive-music/SKILL.md +1 -1
- package/skills/audio/audio-direction/SKILL.md +5 -5
- package/skills/audio/sound-effect/SKILL.md +2 -2
- package/skills/audio/voice-line/SKILL.md +25 -3
- package/skills/character-controllers/fps-controller/SKILL.md +5 -5
- package/skills/debugging/debug/SKILL.md +39 -1
- package/skills/deployment/export-and-ship/SKILL.md +4 -4
- package/skills/gameplay-mechanics/auto-fire-targeting/SKILL.md +170 -0
- package/skills/gameplay-mechanics/design-mechanic/SKILL.md +8 -8
- package/skills/level-design/design-level/SKILL.md +5 -5
- package/skills/level-design/scene-to-level/SKILL.md +125 -0
- package/skills/multiplayer-and-networking/host-authoritative-state/SKILL.md +4 -4
- package/skills/multiplayer-and-networking/peer-to-peer-multiplayer/SKILL.md +4 -4
- package/skills/multiplayer-and-networking/setup-multiplayer/SKILL.md +7 -7
- package/skills/performance/tune-performance/SKILL.md +5 -5
- package/skills/rendering-and-lighting/3d-lighting/SKILL.md +1 -1
- package/skills/rendering-and-lighting/art-direction/SKILL.md +5 -5
- package/skills/scene-and-project/brainstorm-game/SKILL.md +4 -4
- package/skills/scene-and-project/play/SKILL.md +1 -1
- package/skills/scene-and-project/scene-composition/SKILL.md +30 -1
- package/skills/scripting-patterns/gdscript-patterns/SKILL.md +53 -0
- package/skills/ui-and-ux/ui-basics/SKILL.md +1 -1
- package/skills/video/animated-loop/SKILL.md +1 -1
- package/skills/video/cinematic-cutscene/SKILL.md +1 -1
- package/skills/video/trailer-shot/SKILL.md +1 -1
- package/skills/visual-effects/game-feel/SKILL.md +6 -6
- package/skills/workflow/brainstorming/SKILL.md +164 -0
- package/skills/workflow/brainstorming/scripts/frame-template.html +214 -0
- package/skills/workflow/brainstorming/scripts/helper.js +88 -0
- package/skills/workflow/brainstorming/scripts/server.cjs +354 -0
- package/skills/workflow/brainstorming/scripts/start-server.sh +148 -0
- package/skills/workflow/brainstorming/scripts/stop-server.sh +56 -0
- package/skills/workflow/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/skills/workflow/brainstorming/visual-companion.md +287 -0
- package/skills/workflow/debugging-game-feel/SKILL.md +174 -0
- package/skills/workflow/diagnosing-perf-regressions/SKILL.md +190 -0
- package/skills/workflow/dispatching-parallel-agents/SKILL.md +182 -0
- package/skills/workflow/gameskill/SKILL.md +111 -0
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +119 -0
- package/skills/workflow/investigating-bugs/SKILL.md +296 -0
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +158 -0
- package/skills/workflow/investigating-bugs/condition-based-waiting.md +115 -0
- package/skills/workflow/investigating-bugs/defense-in-depth.md +122 -0
- package/skills/workflow/investigating-bugs/find-polluter.sh +63 -0
- package/skills/workflow/investigating-bugs/root-cause-tracing.md +169 -0
- package/skills/workflow/investigating-bugs/test-academic.md +14 -0
- package/skills/workflow/investigating-bugs/test-pressure-1.md +58 -0
- package/skills/workflow/investigating-bugs/test-pressure-2.md +68 -0
- package/skills/workflow/investigating-bugs/test-pressure-3.md +69 -0
- package/skills/workflow/playtesting-a-feature/SKILL.md +173 -0
- package/skills/{_meta → workflow}/skill-create/SKILL.md +32 -22
- package/skills/{_meta → workflow}/skill-improve/SKILL.md +9 -10
- package/skills/{_meta → workflow}/skill-test/SKILL.md +12 -12
- package/skills/{_meta → workflow}/using-summer/SKILL.md +5 -2
- package/skills/workflow/verification-before-completion/SKILL.md +139 -0
- package/skills/workflow/writing-plans/SKILL.md +152 -0
- package/skills/workflow/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/skills/workflow/writing-skills/SKILL.md +655 -0
- package/skills/workflow/writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/workflow/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/workflow/writing-skills/persuasion-principles.md +187 -0
- package/skills/workflow/writing-skills/render-graphs.js +168 -0
- package/skills/workflow/writing-skills/testing-skills-with-subagents.md +384 -0
- package/dist/commands/assets.d.ts +0 -2
- package/dist/commands/assets.js +0 -189
- package/dist/commands/debug.d.ts +0 -2
- package/dist/commands/debug.js +0 -127
- package/dist/commands/doctor.test.d.ts +0 -1
- package/dist/commands/doctor.test.js +0 -29
- package/dist/commands/project.d.ts +0 -2
- package/dist/commands/project.js +0 -170
- package/dist/commands/scene.d.ts +0 -2
- package/dist/commands/scene.js +0 -290
- package/dist/lib/agent-config.test.d.ts +0 -1
- package/dist/lib/agent-config.test.js +0 -80
- package/dist/lib/format.test.d.ts +0 -1
- package/dist/lib/format.test.js +0 -36
- package/dist/lib/plugin-manifests.test.d.ts +0 -1
- package/dist/lib/plugin-manifests.test.js +0 -134
- package/dist/lib/with-engine.d.ts +0 -14
- package/dist/lib/with-engine.js +0 -109
- package/skills/_shared/collaborative-protocol.md +0 -50
- package/skills/_shared/gd-style.md +0 -121
- package/skills/_shared/godot-version.md +0 -32
- package/skills/_shared/mcp-tools-reference.md +0 -133
- package/skills/_shared/summer-folder.md +0 -44
- package/skills/_shared/template-registry.md +0 -40
- package/skills/_tests/runner.md +0 -90
- package/skills/_tests/specs/3d-lighting.md +0 -19
- package/skills/_tests/specs/art-direction.md +0 -115
- package/skills/_tests/specs/asset-strategy.md +0 -19
- package/skills/_tests/specs/audio-direction.md +0 -123
- package/skills/_tests/specs/brainstorm-game.md +0 -99
- package/skills/_tests/specs/debug.md +0 -94
- package/skills/_tests/specs/design-level.md +0 -113
- package/skills/_tests/specs/design-mechanic.md +0 -112
- package/skills/_tests/specs/design-npc.md +0 -143
- package/skills/_tests/specs/export-and-ship.md +0 -114
- package/skills/_tests/specs/fps-controller.md +0 -113
- package/skills/_tests/specs/gdscript-patterns.md +0 -19
- package/skills/_tests/specs/host-authoritative-state.md +0 -104
- package/skills/_tests/specs/make-game.md +0 -19
- package/skills/_tests/specs/peer-to-peer-multiplayer.md +0 -99
- package/skills/_tests/specs/play.md +0 -88
- package/skills/_tests/specs/scene-composition.md +0 -19
- package/skills/_tests/specs/setup-multiplayer.md +0 -106
- package/skills/_tests/specs/tune-performance.md +0 -104
- package/skills/_tests/specs/ui-basics.md +0 -19
- package/skills/_tests/specs/vfx.md +0 -116
- package/skills/catalog.yaml +0 -991
|
@@ -190,7 +190,7 @@ summer_set_prop(path="./World/Enemies/Enemy/Sight", key="enabled", value="true")
|
|
|
190
190
|
summer_set_prop(path="./World/Enemies/Enemy/Sight", key="target_position", value="Vector3(0, 0, -12)")
|
|
191
191
|
```
|
|
192
192
|
|
|
193
|
-
Save the Vision sphere as standalone `.tres` (do NOT inline sub_resource — see `
|
|
193
|
+
Save the Vision sphere as standalone `.tres` (do NOT inline sub_resource — see `references/mcp-tools-reference.md` § "Trap"):
|
|
194
194
|
|
|
195
195
|
```
|
|
196
196
|
summer_set_prop(path="./World/Enemies/Enemy/Vision/VisionShape", key="shape", value="res://shapes/vision_sphere.tres")
|
|
@@ -460,7 +460,7 @@ If the enemy doesn't aggro, common causes:
|
|
|
460
460
|
|
|
461
461
|
## Collaborative protocol
|
|
462
462
|
|
|
463
|
-
This skill writes scenes and scripts. Always ask before each step. Group related writes into one ask. See `
|
|
463
|
+
This skill writes scenes and scripts. Always ask before each step. Group related writes into one ask. See `references/collaborative-protocol.md`.
|
|
464
464
|
|
|
465
465
|
## Want a working starter?
|
|
466
466
|
|
|
@@ -471,10 +471,10 @@ For a fully-rigged enemy with anim controller + loot drop:
|
|
|
471
471
|
|
|
472
472
|
## See also
|
|
473
473
|
|
|
474
|
-
- `
|
|
475
|
-
- `
|
|
476
|
-
- `
|
|
477
|
-
- `
|
|
474
|
+
- `references/mcp-tools-reference.md` — full MCP tool list
|
|
475
|
+
- `references/godot-version.md` — Godot 4.5 API notes
|
|
476
|
+
- `references/collaborative-protocol.md` — "May I write" pattern
|
|
477
|
+
- `references/gd-style.md` — typed GDScript conventions
|
|
478
478
|
- `ai-and-npcs/state-machine-npc/SKILL.md` — FSM pattern deep dive
|
|
479
479
|
- `ai-and-npcs/behavior-trees/SKILL.md` — when complexity demands a BT
|
|
480
480
|
- `ai-and-npcs/perception-sight-and-hearing/SKILL.md` — sensor patterns
|
|
@@ -256,5 +256,5 @@ Open the scene in Godot 4.5 editor, add `AnimationTree` node, set `Anim Player`
|
|
|
256
256
|
|
|
257
257
|
- `summer:animation/generate-motion` — produce the clips this tree references.
|
|
258
258
|
- `summer:animation/retarget` — share one tree across many characters.
|
|
259
|
-
- `
|
|
260
|
-
- `
|
|
259
|
+
- `references/gd-style.md` — typed GDScript conventions in the controller snippets.
|
|
260
|
+
- `references/mcp-tools-reference.md` — `summer_connect_signal` and `summer_set_resource_property` rules.
|
|
@@ -278,5 +278,5 @@ For projects that can't use any cloud or third-party tool, Godot 4.5's `AudioStr
|
|
|
278
278
|
- `summer:audio/generate-voice` — TTS upstream of this skill.
|
|
279
279
|
- `summer:animation/animation-tree` — wire the lipsync OneShot into the character's tree.
|
|
280
280
|
- `summer:animation/procedural-animation` — eye blinks, saccades, head idle.
|
|
281
|
-
- `
|
|
281
|
+
- `references/mcp-tools-reference.md` — `summer_generate_audio` schema (TTS).
|
|
282
282
|
- Rhubarb Lip Sync — https://github.com/DanielSWolf/rhubarb-lip-sync (external tool; phoneme extraction).
|
|
@@ -123,7 +123,7 @@ The user can upload to Meshy directly at meshy.ai, generate via the dashboard, d
|
|
|
123
123
|
|
|
124
124
|
## See also
|
|
125
125
|
|
|
126
|
-
- `
|
|
126
|
+
- `references/mcp-tools-reference.md` — `summer_generate_motion` parameter schema, error codes.
|
|
127
127
|
- `summer:asset-pipeline/asset-strategy` — how to get a Meshy-rigged character in the first place.
|
|
128
128
|
- `summer:animation/animation-tree` — wire the generated clips into a state machine.
|
|
129
129
|
- `summer:animation/retarget` — re-use one library across many characters without regenerating.
|
|
@@ -229,6 +229,6 @@ Add modifiers in the Godot editor under Skeleton3D, set bone names from the insp
|
|
|
229
229
|
|
|
230
230
|
## See also
|
|
231
231
|
|
|
232
|
-
- `
|
|
233
|
-
- `
|
|
232
|
+
- `references/gd-style.md` — typed GDScript conventions in the snippets.
|
|
233
|
+
- `references/mcp-tools-reference.md` — `summer_set_prop` enum-int conventions for axis settings.
|
|
234
234
|
- Godot 4.5 docs: `SkeletonModifier3D`, `LookAtModifier3D`, `SkeletonIK3D`, `PhysicalBoneSimulator3D`.
|
|
@@ -323,4 +323,4 @@ Print the bus layout, the node tree, and the GDScript. User constructs in the Go
|
|
|
323
323
|
- `audio/audio-direction` — defines the dynamic music plan and bus layout
|
|
324
324
|
- `audio/music-track` — generates the stems
|
|
325
325
|
- `audio/voice-line` — the voice bus that triggers ducking
|
|
326
|
-
- `
|
|
326
|
+
- `references/godot-version.md` — Godot 4.5 AudioServer and Tween API
|
|
@@ -235,11 +235,11 @@ End with:
|
|
|
235
235
|
| Pure sine "ding" for pickup | Reads as cheap mobile game. Use a major-third interval with character. |
|
|
236
236
|
| Same footstep sample for all surfaces | Material-aware footsteps are 80% of the perceived audio quality. |
|
|
237
237
|
| No master ceiling / true peak | Audio clips on console builds without `-1 dBTP` ceiling. Always set it. |
|
|
238
|
-
| Calling SetResourceProperty on inline sub_resources | Silent fail. See `
|
|
238
|
+
| Calling SetResourceProperty on inline sub_resources | Silent fail. See `references/mcp-tools-reference.md` § Trap. |
|
|
239
239
|
|
|
240
240
|
## Collaborative protocol
|
|
241
241
|
|
|
242
|
-
This skill writes one bible (`.summer/audio-bible.md`), creates a bus layout (`audio/default_bus_layout.tres`), modifies `project.godot`, and may generate audio (metered). Always ask before writing or generating. See `
|
|
242
|
+
This skill writes one bible (`.summer/audio-bible.md`), creates a bus layout (`audio/default_bus_layout.tres`), modifies `project.godot`, and may generate audio (metered). Always ask before writing or generating. See `references/collaborative-protocol.md`.
|
|
243
243
|
|
|
244
244
|
## Want a working starter?
|
|
245
245
|
|
|
@@ -247,9 +247,9 @@ No template — this is a workflow that produces the bible the rest of the proje
|
|
|
247
247
|
|
|
248
248
|
## See also
|
|
249
249
|
|
|
250
|
-
- `
|
|
251
|
-
- `
|
|
252
|
-
- `
|
|
250
|
+
- `references/collaborative-protocol.md`
|
|
251
|
+
- `references/godot-version.md` — Godot 4.5 audio API notes
|
|
252
|
+
- `references/mcp-tools-reference.md`
|
|
253
253
|
- `scene-and-project/brainstorm-game/SKILL.md` — produces the brief that anchors the bible
|
|
254
254
|
- `rendering-and-lighting/art-direction/SKILL.md` — the visual counterpart; audio must rhyme with it
|
|
255
255
|
- `audio/audio-bus-setup/SKILL.md` (NEXT) — implements the bus layout in detail
|
|
@@ -233,5 +233,5 @@ After the SFX is wired:
|
|
|
233
233
|
- `audio/ambient-bed` — long looping textures
|
|
234
234
|
- `audio/music-track` — music
|
|
235
235
|
- `audio/voice-line` — TTS
|
|
236
|
-
- `
|
|
237
|
-
- `
|
|
236
|
+
- `references/mcp-tools-reference.md`
|
|
237
|
+
- `references/godot-version.md` — Godot 4.5 audio nodes
|
|
@@ -6,7 +6,7 @@ compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
|
6
6
|
category: audio
|
|
7
7
|
user-invocable: true
|
|
8
8
|
allowed-tools: Read Grep Glob Write Edit summer_generate_voice summer_generate_audio summer_list_models summer_search_assets summer_import_from_url summer_add_node summer_set_prop summer_inspect_node
|
|
9
|
-
paths: ["audio/voice/**", "scripts/**", "**/*.tscn"]
|
|
9
|
+
paths: [".summer/**", "audio/voice/**", "scripts/**", "**/*.tscn"]
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# /voice-line — Generate TTS Voice for NPCs, Narrator, Dialogue
|
|
@@ -33,8 +33,11 @@ Then it generates one line (or a multi-turn dialogue) with the right stability /
|
|
|
33
33
|
|
|
34
34
|
```
|
|
35
35
|
Read .summer/audio-bible.md
|
|
36
|
+
Read .summer/memory/casting/voices.md # preferred cast memory, if present
|
|
37
|
+
Read .summer/voice-cast.md # legacy cast memory, if present
|
|
36
38
|
Read .summer/characters.md # if present
|
|
37
39
|
Glob .summer/characters/*.md
|
|
40
|
+
Glob .summer/memory/characters/*.md
|
|
38
41
|
```
|
|
39
42
|
|
|
40
43
|
If a character bible exists, the voice should match the character's age / gender / regional origin / energy. If it doesn't, ask:
|
|
@@ -83,9 +86,23 @@ After the pick:
|
|
|
83
86
|
|
|
84
87
|
> Locked voice: `Hodge` (id `21m00Tcm4TlvDq8ikWAM`). I'll use this for all `<character>` lines unless you say otherwise.
|
|
85
88
|
|
|
86
|
-
|
|
89
|
+
Ask before writing:
|
|
90
|
+
|
|
91
|
+
> May I update `.summer/memory/casting/voices.md` with this locked voice assignment?
|
|
92
|
+
|
|
93
|
+
Save it in `.summer/memory/casting/voices.md`:
|
|
87
94
|
|
|
88
95
|
```markdown
|
|
96
|
+
---
|
|
97
|
+
id: casting.voice.main-cast
|
|
98
|
+
type: casting
|
|
99
|
+
status: active
|
|
100
|
+
priority: locked
|
|
101
|
+
stable: true
|
|
102
|
+
providers:
|
|
103
|
+
- elevenlabs
|
|
104
|
+
---
|
|
105
|
+
|
|
89
106
|
# Voice Cast
|
|
90
107
|
|
|
91
108
|
| Character | Voice name | Voice id | Notes |
|
|
@@ -96,6 +113,8 @@ Save it in `.summer/voice-cast.md`:
|
|
|
96
113
|
|
|
97
114
|
This is the cast bible. Every future voice line uses these ids — consistency is the point.
|
|
98
115
|
|
|
116
|
+
If legacy `.summer/voice-cast.md` already exists, read it first and either keep using it for this project or ask to migrate it into `.summer/memory/casting/voices.md`. Do not maintain two conflicting cast files.
|
|
117
|
+
|
|
99
118
|
### 5. Tune stability / similarity / style / speed for delivery
|
|
100
119
|
|
|
101
120
|
ElevenLabs voice options:
|
|
@@ -199,7 +218,9 @@ The bible's mix rule says voice ducks music: when this player starts, fade the m
|
|
|
199
218
|
|
|
200
219
|
### 10. Save to the cast bible
|
|
201
220
|
|
|
202
|
-
After generation, append to `.summer/
|
|
221
|
+
After generation, append to `.summer/memory/casting/voices.md` so future skills find existing lines and don't regenerate. Include line text + filename + voice id.
|
|
222
|
+
|
|
223
|
+
If the assignment is marked `priority: locked`, do not replace the voice id automatically. If a scene, script, import config, or user prompt conflicts with the locked memory, stop and ask whether to update memory or fix the implementation.
|
|
203
224
|
|
|
204
225
|
## Reference card — voice-pick by archetype
|
|
205
226
|
|
|
@@ -220,6 +241,7 @@ Narrator intimate: warmer mid pitch, lower stability for breath
|
|
|
220
241
|
|
|
221
242
|
- **Picking a voice without auditioning samples.** The user must hear it.
|
|
222
243
|
- **Reusing a voice id across two characters.** Players notice instantly. Lock the cast.
|
|
244
|
+
- **Changing a locked voice without approval.** A cast voice is project memory, not a throwaway generation option.
|
|
223
245
|
- **Stage directions in the text.** `(angrily) Get out!` is read literally as "angrily get out". Use stability/style.
|
|
224
246
|
- **One long blob for a multi-turn scene.** Use `text_to_dialogue` so pacing is dialogue-aware.
|
|
225
247
|
- **Voice on `Master` bus.** Must be on `Voice` bus so it can duck music per the bible.
|
|
@@ -48,7 +48,7 @@ summer_set_resource_property(nodePath="./World/Player/Collision", resourceProper
|
|
|
48
48
|
summer_set_resource_property(nodePath="./World/Player/Collision", resourceProperty="shape", subProperty="height", value="1.8")
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
`summer_set_prop` with a class-name string creates a standalone sub-resource. NEVER call `summer_set_resource_property` against an inline `sub_resource` — the value is silently dropped. See `
|
|
51
|
+
`summer_set_prop` with a class-name string creates a standalone sub-resource. NEVER call `summer_set_resource_property` against an inline `sub_resource` — the value is silently dropped. See `references/mcp-tools-reference.md`.
|
|
52
52
|
|
|
53
53
|
### 4. Add the Head pivot + Camera
|
|
54
54
|
|
|
@@ -328,14 +328,14 @@ Then patch `project.godot` with the InputMap actions (`input/move_forward = { ..
|
|
|
328
328
|
|
|
329
329
|
## Collaborative Protocol
|
|
330
330
|
|
|
331
|
-
This skill writes scene nodes, an InputMap, and a `.gd` script. Always ask before applying. Group writes per phase: "May I add the Player + Collision + Head + Camera, bind WASD/jump/sprint, and attach `player_controller.gd`?" See `../../
|
|
331
|
+
This skill writes scene nodes, an InputMap, and a `.gd` script. Always ask before applying. Group writes per phase: "May I add the Player + Collision + Head + Camera, bind WASD/jump/sprint, and attach `player_controller.gd`?" See `../../references/collaborative-protocol.md`.
|
|
332
332
|
|
|
333
333
|
If the user asks for a "third-person FPS", flag the contradiction: FPS = first-person. Either clarify, or hand off to the `tps-controller` skill when it ships.
|
|
334
334
|
|
|
335
335
|
## See Also
|
|
336
336
|
|
|
337
|
-
- `
|
|
338
|
-
- `
|
|
339
|
-
- `
|
|
337
|
+
- `references/gd-style.md` — typed GDScript conventions used in the skeleton.
|
|
338
|
+
- `references/mcp-tools-reference.md` — `summer_set_resource_property` rules + the inline-sub-resource silent-fail trap.
|
|
339
|
+
- `references/collaborative-protocol.md` — when to ask before writing.
|
|
340
340
|
- `scripting-patterns/state-machine-patterns/SKILL.md` — once movement grows past this skeleton (slide, grapple, hover), refactor into a state machine instead of stuffing more branches into `_physics_process`.
|
|
341
341
|
- `physics/character-body-tuning/SKILL.md` (when shipped) — slope handling, step-up, floor-snap.
|
|
@@ -111,7 +111,7 @@ Surface the proposed fix in plain language and ask permission. Two patterns:
|
|
|
111
111
|
|
|
112
112
|
- For GDScript edits: `Read` the 20–40 lines around the error, `Edit` the exact change. Don't read the whole file. Don't reformat. Don't rename other things.
|
|
113
113
|
- For scene edits: use the appropriate `summer_*` tool (`summer_add_node`, `summer_set_prop`, `summer_replace_node`). Group multi-step changes in `summer_batch` for one undo step.
|
|
114
|
-
- **Trap to avoid:** never call `summer_set_resource_property` against an inline `sub_resource` — the value is silently dropped. If the property is on a nested resource, first call `summer_set_prop` with the resource class name to instantiate a standalone resource, then drill in. See `
|
|
114
|
+
- **Trap to avoid:** never call `summer_set_resource_property` against an inline `sub_resource` — the value is silently dropped. If the property is on a nested resource, first call `summer_set_prop` with the resource class name to instantiate a standalone resource, then drill in. See `references/mcp-tools-reference.md`.
|
|
115
115
|
|
|
116
116
|
### 6. Verify — re-run the diagnostic that found it
|
|
117
117
|
|
|
@@ -155,3 +155,41 @@ A debug session is done when:
|
|
|
155
155
|
3. No new errors or warnings have been introduced.
|
|
156
156
|
|
|
157
157
|
Tell the user one short sentence: "Fixed `<file>:<line>` — `<change>`. Diagnostic clean." Then stop.
|
|
158
|
+
|
|
159
|
+
## What the MCP debug tools CAN and CAN'T see (read this before claiming "clean")
|
|
160
|
+
|
|
161
|
+
The `summer_*` tools are powerful for static + boot-time issues but **can't substitute for play-testing**. Knowing the gaps prevents false-clean reports.
|
|
162
|
+
|
|
163
|
+
### What the MCP CAN see
|
|
164
|
+
|
|
165
|
+
- **Script parse errors** (`summer_get_script_errors`) — full text + file:line. Reliable.
|
|
166
|
+
- **Editor console output** (`summer_get_console`) — `print` statements, editor-side warnings, std startup messages. Full text.
|
|
167
|
+
- **Runtime debugger error count + full text** (`summer_get_debugger_errors`) — returns `errors_data` with `error`, `error_descr`, `callstack`, `file`, `function`, `line`. Reliable for errors.
|
|
168
|
+
- **Diagnostics summary** (`summer_get_diagnostics`) — counts of console errors, debugger errors, debugger warnings, script errors. Tells you where to drill.
|
|
169
|
+
- **Scene tree + node properties** (`summer_get_scene_tree`, `summer_inspect_node`) — only the **edited** scene, not the running game's live tree.
|
|
170
|
+
- **Whether the game is running** (`summer_is_running`) — and on which scene.
|
|
171
|
+
|
|
172
|
+
### What the MCP CAN'T see (right now)
|
|
173
|
+
|
|
174
|
+
- **Debugger warning text.** `summer_get_debugger_errors` returns a `warnings: <count>` integer but no `warnings_data` array. You see "the game has 66 warnings" but you can't read them through MCP. **Tell the user: "I see N warnings exist but the MCP doesn't expose their text — paste the Debugger panel if any feel relevant."**
|
|
175
|
+
- **Live runtime scene tree.** `summer_get_scene_tree` returns the editor's edited scene, not what's currently instantiated in the running game. When debugging runtime state, you can't introspect the live nodes.
|
|
176
|
+
- **Keyboard / mouse / controller input simulation.** No tool sends key presses or mouse motion. So bugs that only fire from gameplay (player movement, weapon firing, level transitions, button clicks) require the user to play.
|
|
177
|
+
- **Screenshot / visual diff.** No tool captures the rendered viewport. Visual regressions ("the floor looks wrong", "the camera clips through terrain") require user eyes.
|
|
178
|
+
- **Frame-by-frame physics state.** No tool steps the simulation or watches for transient errors over time.
|
|
179
|
+
|
|
180
|
+
### The "static-only is not testing" rule
|
|
181
|
+
|
|
182
|
+
A clean `summer_get_diagnostics` after `summer_play` only proves: **the game booted without parse errors or @implicit_ready null-derefs.** It does NOT prove gameplay works. Auto-fire weapons, level transitions, spell casting, boss attacks, UI interactions all happen *after* boot and won't surface in the diagnostics until they fire.
|
|
183
|
+
|
|
184
|
+
When you've made code changes and want to declare them "verified":
|
|
185
|
+
|
|
186
|
+
1. **Required**: `summer_get_script_errors` clean on every modified file.
|
|
187
|
+
2. **Required**: `summer_play` boot returns 0 errors (use the scene most likely to exercise the change).
|
|
188
|
+
3. **Recommended**: ask the user to play through the specific scenario the change touches, then re-run `summer_get_diagnostics`.
|
|
189
|
+
4. **Never claim "verified" from static analysis alone.** Say "compiles and boots clean — needs play-test to confirm <specific behavior>."
|
|
190
|
+
|
|
191
|
+
### The cost of skipping it
|
|
192
|
+
|
|
193
|
+
A typical cautionary scenario: many parallel agents write thousands of lines of game code in one batch with verification static-only. The build is "diagnostic-clean" yet the running game has telegraph meshes that render the wrong axis, parse-valid scripts that crash on first autoload because of a guard pattern that doesn't compile, projectile tracers sized so they read as straight lines instead of projectiles, transform-leaked colliders from a copied scene, and `@onready` paths that throw on every boot when the script is loaded into a sibling scene that lacks one of the referenced children. None of these surface in `summer_get_diagnostics` until the user actually plays.
|
|
194
|
+
|
|
195
|
+
Static analysis is necessary but never sufficient.
|
|
@@ -280,7 +280,7 @@ Use this as a one-shot grep before any export:
|
|
|
280
280
|
|
|
281
281
|
## Collaborative protocol
|
|
282
282
|
|
|
283
|
-
This skill produces release artifacts. Always ask before each build is invoked. Group platforms — "I'm about to build Windows + Mac + Linux release configs into `build/`. OK?". See `
|
|
283
|
+
This skill produces release artifacts. Always ask before each build is invoked. Group platforms — "I'm about to build Windows + Mac + Linux release configs into `build/`. OK?". See `references/collaborative-protocol.md`.
|
|
284
284
|
|
|
285
285
|
## Want a working starter?
|
|
286
286
|
|
|
@@ -288,9 +288,9 @@ No template — this is a workflow. Each project's export config and store asset
|
|
|
288
288
|
|
|
289
289
|
## See also
|
|
290
290
|
|
|
291
|
-
- `
|
|
292
|
-
- `
|
|
293
|
-
- `
|
|
291
|
+
- `references/mcp-tools-reference.md` — full MCP tool list
|
|
292
|
+
- `references/godot-version.md` — Godot 4.5 export-template versioning
|
|
293
|
+
- `references/collaborative-protocol.md` — "May I write" pattern
|
|
294
294
|
- `deployment/export-presets/SKILL.md` — preset config deep dive
|
|
295
295
|
- `deployment/web-html5-export/SKILL.md` — HTML5-specific traps
|
|
296
296
|
- `deployment/steam-uploader/SKILL.md` — `steamcmd` + GodotSteam (when shipped)
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: auto-fire-targeting
|
|
3
|
+
description: Use when designing or fixing the targeting system for an auto-fire weapon (survivors-genre, top-down ARPG, tower-defense). Covers the pending-damage pattern that prevents over-commit when bullet flight time is longer than fire rate. Trigger on "auto-fire", "auto-aim", "weapon targeting", "targeting", "wasted bullets", "overkill", "damage prediction", "survivors weapon".
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: gameplay-mechanics
|
|
7
|
+
allowed-tools: Read Edit Grep
|
|
8
|
+
paths: ["**/*.gd"]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Auto-Fire Weapon Targeting — pending-damage pattern
|
|
12
|
+
|
|
13
|
+
A survivors-genre auto-fire weapon picks a target each fire frame. Naive nearest-enemy targeting wastes bullets when fire rate exceeds bullet flight time. This skill encodes the pending-damage pattern that fixes it.
|
|
14
|
+
|
|
15
|
+
## The problem
|
|
16
|
+
|
|
17
|
+
Auto-fire weapon. Bullet speed 22 m/s. Target 10m away. Bullet takes ~0.45s to arrive. With high attack speed the player fires several bullets per second. By the time the first bullet arrives and kills the target, several more bullets are already in flight toward where the target was. They miss into empty space. The player sees bullets "fan out in a cone past the dead enemy" while other enemies stand around untouched.
|
|
18
|
+
|
|
19
|
+
This is not a re-targeting bug. The weapon's `_fire()` correctly re-runs `find_nearest_enemy()` each shot. The issue is that the target is alive at fire-time and dead at arrival-time. All shots fired in that window aim at it because none of them know about the kill in flight.
|
|
20
|
+
|
|
21
|
+
## The fix — pending damage commitment
|
|
22
|
+
|
|
23
|
+
Each enemy carries a counter of damage that is in flight toward it. Targeting de-prefers (but does not exclude) enemies whose pending damage already exceeds their current HP.
|
|
24
|
+
|
|
25
|
+
### 1. Add the counter to the enemy base class
|
|
26
|
+
|
|
27
|
+
```gdscript
|
|
28
|
+
# enemy_base_3d.gd
|
|
29
|
+
|
|
30
|
+
var pending_damage: float = 0.0
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
func commit_pending(amount: float) -> void:
|
|
34
|
+
pending_damage += amount
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
func release_pending(amount: float) -> void:
|
|
38
|
+
pending_damage = maxf(0.0, pending_damage - amount)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
## True if enough damage is already in flight to kill this enemy.
|
|
42
|
+
func is_saturated() -> bool:
|
|
43
|
+
return pending_damage >= health
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 2. Update the targeting helper
|
|
47
|
+
|
|
48
|
+
The selector keeps the saturated set as a fallback. If every enemy is saturated, the player must still be able to fire on someone — fall through to a normal nearest pick across saturated enemies. Otherwise prefer non-saturated.
|
|
49
|
+
|
|
50
|
+
```gdscript
|
|
51
|
+
# targeting.gd
|
|
52
|
+
|
|
53
|
+
static func pick(origin: Vector3, mode: int, max_range: float, ...) -> Node3D:
|
|
54
|
+
var enemies: Array = GameManager.get_enemies()
|
|
55
|
+
var best: Node3D = null
|
|
56
|
+
var best_score: float = -INF
|
|
57
|
+
var fallback: Node3D = null
|
|
58
|
+
var fallback_score: float = -INF
|
|
59
|
+
for enemy in enemies:
|
|
60
|
+
# ... existing range + LoS filters ...
|
|
61
|
+
var score := _score(enemy, d_sq, mode)
|
|
62
|
+
var saturated: bool = "is_saturated" in enemy and enemy.is_saturated()
|
|
63
|
+
if saturated:
|
|
64
|
+
if score > fallback_score:
|
|
65
|
+
fallback_score = score
|
|
66
|
+
fallback = enemy
|
|
67
|
+
else:
|
|
68
|
+
if score > best_score:
|
|
69
|
+
best_score = score
|
|
70
|
+
best = enemy
|
|
71
|
+
if best != null:
|
|
72
|
+
return best
|
|
73
|
+
return fallback # everyone is saturated; fire on the next-best anyway
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 3. Commit at fire time
|
|
77
|
+
|
|
78
|
+
```gdscript
|
|
79
|
+
# projectile_weapon.gd
|
|
80
|
+
|
|
81
|
+
func _spawn_projectile(dir: Vector3, target: Node3D) -> void:
|
|
82
|
+
var dmg: float = base_damage * GameManager.player_damage_mult
|
|
83
|
+
# Commit expected damage. No crit factor — we don't gamble on RNG. If crit
|
|
84
|
+
# over-kills the target, the next-frame release refunds the difference.
|
|
85
|
+
var commit_amount: float = dmg
|
|
86
|
+
if target != null and target.has_method("commit_pending"):
|
|
87
|
+
target.commit_pending(commit_amount)
|
|
88
|
+
var proj: Node3D = _projectile_scene.instantiate()
|
|
89
|
+
# ... add_child, position, etc ...
|
|
90
|
+
proj.setup(dir * PROJECTILE_SPEED, dmg, ..., target, commit_amount)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 4. Release at bullet death (catch-all)
|
|
94
|
+
|
|
95
|
+
The bullet must release the commitment exactly once when it leaves the tree, regardless of how. Hit, pierce-out, range-expire, or any other free path. Use `tree_exiting` so the release is guaranteed without each free-site having to remember.
|
|
96
|
+
|
|
97
|
+
```gdscript
|
|
98
|
+
# bullet.gd
|
|
99
|
+
|
|
100
|
+
var _committed_target: Node = null
|
|
101
|
+
var _committed_amount: float = 0.0
|
|
102
|
+
var _committed_released: bool = false
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
func setup(..., commit_target: Node = null, commit_amount: float = 0.0) -> void:
|
|
106
|
+
# ... other setup ...
|
|
107
|
+
_committed_target = commit_target
|
|
108
|
+
_committed_amount = commit_amount
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
func _ready() -> void:
|
|
112
|
+
# ... other wiring ...
|
|
113
|
+
tree_exiting.connect(_release_committed)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
## Idempotent so multiple call paths can't double-release.
|
|
117
|
+
func _release_committed() -> void:
|
|
118
|
+
if _committed_released:
|
|
119
|
+
return
|
|
120
|
+
_committed_released = true
|
|
121
|
+
if _committed_amount <= 0.0:
|
|
122
|
+
return
|
|
123
|
+
if _committed_target != null and is_instance_valid(_committed_target) \
|
|
124
|
+
and _committed_target.has_method("release_pending"):
|
|
125
|
+
_committed_target.release_pending(_committed_amount)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Bonus — spread fan across multiple enemies
|
|
129
|
+
|
|
130
|
+
When the weapon fires N projectiles per shot (extra-projectiles upgrade, multishot), pick a fresh target per projectile instead of fanning all N at the primary target. Combined with the saturation filter this drains follow-on shots toward fresh enemies.
|
|
131
|
+
|
|
132
|
+
```gdscript
|
|
133
|
+
# projectile_weapon.gd, multishot path
|
|
134
|
+
|
|
135
|
+
for i in total_projectiles:
|
|
136
|
+
var per_shot_target := Targeting.pick(global_position, mode, range)
|
|
137
|
+
if per_shot_target == null:
|
|
138
|
+
per_shot_target = primary_target # fall back if nothing else in range
|
|
139
|
+
_spawn_projectile(dir.rotated(Vector3.UP, fan_angle), per_shot_target)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Bonus — bump projectile speed
|
|
143
|
+
|
|
144
|
+
The over-commit window is `attack_speed * bullet_travel_time`. Faster bullets shrink it for free. 22 m/s up to 35 m/s halves the window without affecting balance much. Cheap fix to bundle with the pattern.
|
|
145
|
+
|
|
146
|
+
## What this does NOT solve
|
|
147
|
+
|
|
148
|
+
- **Pierce > 1 weapons.** The committed amount is reserved on the first target only. Subsequent pierces are bonus damage to whoever happens to be in line. That is fine — pierce already feels random by design.
|
|
149
|
+
- **AOE / nova / orbital weapons.** They hit everyone in radius regardless of "target," so single-target pending-damage doesn't apply. Skip them.
|
|
150
|
+
- **Slow-but-massive weapons.** A single shot that one-shots multiple enemies in sequence (rocket launcher, railgun) doesn't benefit much. The window where the over-commit happens is too short to matter.
|
|
151
|
+
|
|
152
|
+
## Why this beats alternatives
|
|
153
|
+
|
|
154
|
+
| Alternative | Why we didn't pick it |
|
|
155
|
+
|---|---|
|
|
156
|
+
| In-flight bullet retargeting (each bullet seeks the nearest live enemy mid-flight) | Per-bullet logic is expensive and the homing visual reads as a different weapon archetype. Pending-damage is fire-and-forget. |
|
|
157
|
+
| Predict the kill (fire only enough bullets to kill) | Requires knowing exact damage including crit and item modifiers. Edge cases multiply. |
|
|
158
|
+
| Just bump bullet speed | Helps but doesn't eliminate the issue at very high attack-speed builds. |
|
|
159
|
+
| Shoot-through-enemies (everyone gets free pierce) | Changes weapon identity. AOE bleed. |
|
|
160
|
+
|
|
161
|
+
Pending-damage is local to the targeting query, requires no per-bullet ticking, and keeps each weapon archetype's identity intact.
|
|
162
|
+
|
|
163
|
+
## Verification
|
|
164
|
+
|
|
165
|
+
Test scenario: spawn a single weak enemy directly in front of the player at point-blank range. Equip the auto-fire weapon and the highest-attack-speed item. Watch the bullet fan when the enemy dies.
|
|
166
|
+
|
|
167
|
+
Before: 5-15 bullets continue past the corpse over the next ~0.5s.
|
|
168
|
+
After: 1-2 bullets continue (the ones that were already past the half-flight point), the rest of the fire pool redirects to whatever target Targeting picks next, or stops if there's none in range.
|
|
169
|
+
|
|
170
|
+
Use `summer_get_diagnostics` to confirm no new errors. Use `summer_inspect_node` on a sample enemy mid-fight to confirm `pending_damage` is being incremented and decremented as expected.
|
|
@@ -148,7 +148,7 @@ lifetime = 0.4
|
|
|
148
148
|
|
|
149
149
|
### 7. Write the GDScript stub
|
|
150
150
|
|
|
151
|
-
Stub only — implementation is the next session. Use `
|
|
151
|
+
Stub only — implementation is the next session. Use `references/gd-style.md` conventions. For double-jump:
|
|
152
152
|
|
|
153
153
|
```gdscript
|
|
154
154
|
class_name PlayerController
|
|
@@ -236,12 +236,12 @@ Ask:
|
|
|
236
236
|
| Hand-wave depth | "Players will use it strategically" is not depth. Name the choice the player makes. |
|
|
237
237
|
| Tunables hard-coded as `const` | Use `@export` so designers tune in the inspector. |
|
|
238
238
|
| Adding the mechanic without the FX/audio nodes | Without nodes for feedback, the mechanic ships feeling cheap. Scaffold the nodes alongside the script. |
|
|
239
|
-
| Setting `position` for movement instead of `velocity` | Physics objects use `velocity` in `_physics_process`. See `
|
|
240
|
-
| Calling SetResourceProperty on inline sub_resources | Silent fail. See `
|
|
239
|
+
| Setting `position` for movement instead of `velocity` | Physics objects use `velocity` in `_physics_process`. See `references/gd-style.md`. |
|
|
240
|
+
| Calling SetResourceProperty on inline sub_resources | Silent fail. See `references/mcp-tools-reference.md` § Trap. |
|
|
241
241
|
|
|
242
242
|
## Collaborative protocol
|
|
243
243
|
|
|
244
|
-
This skill writes scene nodes and one or more files (`.gd`, `.summer/mechanics/<name>.md`). Group writes into one ask per phase. See `
|
|
244
|
+
This skill writes scene nodes and one or more files (`.gd`, `.summer/mechanics/<name>.md`). Group writes into one ask per phase. See `references/collaborative-protocol.md`.
|
|
245
245
|
|
|
246
246
|
## Want a working starter?
|
|
247
247
|
|
|
@@ -254,10 +254,10 @@ This skill is a workflow that designs and scaffolds — the templates are runnab
|
|
|
254
254
|
|
|
255
255
|
## See also
|
|
256
256
|
|
|
257
|
-
- `
|
|
258
|
-
- `
|
|
259
|
-
- `
|
|
260
|
-
- `
|
|
257
|
+
- `references/collaborative-protocol.md`
|
|
258
|
+
- `references/mcp-tools-reference.md`
|
|
259
|
+
- `references/gd-style.md` — GDScript conventions
|
|
260
|
+
- `references/godot-version.md` — Godot 4.5 API notes
|
|
261
261
|
- `scene-and-project/brainstorm-game/SKILL.md` — produces `.summer/GameSoul.md` this skill reads
|
|
262
262
|
- `level-design/design-level/SKILL.md` — design the levels that exercise the mechanic
|
|
263
263
|
- `character-controllers/fps-controller/SKILL.md` — FPS movement scaffolding
|
|
@@ -239,11 +239,11 @@ End with:
|
|
|
239
239
|
| Reward gating too generous | Free heals before the peak deflate the peak. Gate them after the test. |
|
|
240
240
|
| Blending level types | Stealth + puzzle + boss in one level = three half-baked levels. Pick one. |
|
|
241
241
|
| Building geometry before the skeleton | Skeleton-first lets you iterate on layout cheaply. Geometry comes after the design is locked. |
|
|
242
|
-
| Calling SetResourceProperty on inline sub_resources | Silent fail. See `
|
|
242
|
+
| Calling SetResourceProperty on inline sub_resources | Silent fail. See `references/mcp-tools-reference.md` § Trap. |
|
|
243
243
|
|
|
244
244
|
## Collaborative protocol
|
|
245
245
|
|
|
246
|
-
This skill creates a new scene file (`.tscn`) and a design doc (`.md`). Group writes per phase. Always ask before `summer_create_scene`. See `
|
|
246
|
+
This skill creates a new scene file (`.tscn`) and a design doc (`.md`). Group writes per phase. Always ask before `summer_create_scene`. See `references/collaborative-protocol.md`.
|
|
247
247
|
|
|
248
248
|
## Want a working starter?
|
|
249
249
|
|
|
@@ -256,9 +256,9 @@ The skeleton this skill produces is meant to be filled in via `/summer:design-me
|
|
|
256
256
|
|
|
257
257
|
## See also
|
|
258
258
|
|
|
259
|
-
- `
|
|
260
|
-
- `
|
|
261
|
-
- `
|
|
259
|
+
- `references/collaborative-protocol.md`
|
|
260
|
+
- `references/mcp-tools-reference.md`
|
|
261
|
+
- `references/godot-version.md` — Godot 4.5 API notes
|
|
262
262
|
- `scene-and-project/brainstorm-game/SKILL.md` — produces `.summer/GameSoul.md`
|
|
263
263
|
- `gameplay-mechanics/design-mechanic/SKILL.md` — designs the verbs the level exercises
|
|
264
264
|
- `ai-and-npcs/design-npc/SKILL.md` — designs the enemies the encounters reference
|