summer-engine 1.4.0 → 2.0.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/plugin.json +18 -10
- package/.codex-plugin/plugin.json +36 -8
- package/.cursor-plugin/plugin.json +19 -11
- package/.opencode/INSTALL.md +69 -0
- package/.opencode/plugins/summer.js +9 -4
- package/CHANGELOG.md +31 -1
- package/README.md +268 -86
- package/dist/bin/summer.js +0 -0
- package/dist/commands/assets.d.ts +2 -0
- package/dist/commands/assets.js +189 -0
- package/dist/commands/create.js +55 -17
- package/dist/commands/debug.d.ts +2 -0
- package/dist/commands/debug.js +127 -0
- package/dist/commands/list.js +24 -5
- package/dist/commands/project.d.ts +2 -0
- package/dist/commands/project.js +170 -0
- package/dist/commands/scene.d.ts +2 -0
- package/dist/commands/scene.js +290 -0
- package/dist/lib/banner.js +2 -2
- package/dist/lib/log-filters.d.ts +53 -0
- package/dist/lib/log-filters.js +130 -0
- package/dist/lib/plugin-manifests.test.d.ts +1 -0
- package/dist/lib/plugin-manifests.test.js +134 -0
- package/dist/lib/remote-templates.d.ts +25 -0
- package/dist/lib/remote-templates.js +86 -0
- package/dist/lib/skills-registry.d.ts +33 -1
- package/dist/lib/skills-registry.js +56 -1
- package/dist/lib/telemetry.d.ts +13 -0
- package/dist/lib/telemetry.js +63 -0
- package/dist/lib/with-engine.d.ts +14 -0
- package/dist/lib/with-engine.js +109 -0
- package/dist/mcp/tools/asset-tools.js +12 -13
- package/dist/mcp/tools/debug-tools.js +32 -9
- package/dist/mcp/tools/with-engine.js +4 -0
- 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/marketplace.json +2 -2
- package/package.json +3 -3
- package/skills/README.md +1 -1
- package/skills/_meta/skill-create/SKILL.md +1 -1
- package/skills/_meta/skill-improve/SKILL.md +1 -1
- package/skills/_meta/skill-test/SKILL.md +1 -1
- package/skills/_meta/using-summer/SKILL.md +130 -0
- package/skills/_tests/specs/design-npc.md +43 -12
- package/skills/_tests/specs/fps-controller.md +33 -20
- package/skills/_tests/specs/host-authoritative-state.md +104 -0
- package/skills/_tests/specs/vfx.md +56 -38
- package/skills/ai-and-npcs/design-npc/SKILL.md +264 -122
- package/skills/asset-pipeline/asset-strategy/SKILL.md +1 -1
- package/skills/catalog.yaml +21 -4
- package/skills/character-controllers/fps-controller/SKILL.md +260 -79
- package/skills/debugging/debug/SKILL.md +102 -82
- package/skills/multiplayer-and-networking/host-authoritative-state/SKILL.md +332 -0
- package/skills/rendering-and-lighting/3d-lighting/SKILL.md +1 -1
- package/skills/scene-and-project/browse-templates/SKILL.md +105 -0
- package/skills/scene-and-project/make-game/SKILL.md +159 -346
- package/skills/scene-and-project/new-project/SKILL.md +106 -0
- package/skills/scene-and-project/scene-composition/SKILL.md +1 -1
- package/skills/scripting-patterns/gdscript-patterns/SKILL.md +1 -1
- package/skills/ui-and-ux/ui-basics/SKILL.md +1 -1
- package/skills/visual-effects/vfx/SKILL.md +233 -134
|
@@ -1,452 +1,265 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: make-game
|
|
3
|
-
description:
|
|
3
|
+
description: Use when the user says "make me a game", "build me a game", "I want to make a [genre] game", "let's build something" — the orchestration spine that runs the full game-dev pipeline: brainstorm → plan → scaffold → build core mechanics → art direction → audio → polish/VFX → verify → ship. Delegates to specialist skills with explicit checkpoints between phases. Trigger on "make a game", "build me a game", "create a new game", "make me a game", "let's build a game", "I want to build [game shape]".
|
|
4
4
|
license: MIT
|
|
5
|
-
compatibility: [Cursor, Claude Code, Windsurf,
|
|
5
|
+
compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
|
|
6
6
|
category: scene-and-project
|
|
7
|
-
user-invocable:
|
|
8
|
-
allowed-tools: Read
|
|
9
|
-
paths: ["
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Edit Write Bash Skill summer_get_project_context summer_get_scene_tree summer_create_scene summer_add_node summer_set_prop summer_save_scene summer_play summer_stop summer_get_diagnostics summer_get_script_errors
|
|
9
|
+
paths: [".summer/**", "project.godot", "**/*.gd", "**/*.tscn"]
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
# /make-game — The orchestration spine
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
This is the skill that runs end-to-end when a user says "make me a game." It does **not** try to do everything itself. It runs the right specialist skills in the right order with explicit handoffs and a checkpoint between every phase.
|
|
15
15
|
|
|
16
|
-
**
|
|
16
|
+
**Core principle:** structure beats vibes. A guided pipeline that delegates to focused specialists produces a real game. Off-the-cuff "let me think about it" loops produce three half-finished prototypes. Follow the phases. Don't skip.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
## Phase 0: Gather Requirements
|
|
21
|
-
|
|
22
|
-
Before touching any tools, ask the user:
|
|
23
|
-
1. **What kind of game?** (platformer, FPS, top-down, puzzle, racing, etc.)
|
|
24
|
-
2. **2D or 3D?**
|
|
25
|
-
3. **Art style?** (realistic, low-poly, cartoon, pixel art)
|
|
26
|
-
4. **Core mechanic?** One sentence. ("player jumps between platforms collecting coins")
|
|
27
|
-
5. **Scope?** (1 level prototype, or multi-level)
|
|
18
|
+
## When to use this skill
|
|
28
19
|
|
|
29
|
-
|
|
20
|
+
- User says: "make me a game", "build me a game", "I want to make a [genre]", "let's build a game", "build me a [shape]".
|
|
21
|
+
- User has nothing yet and wants the full path from idea → playable.
|
|
22
|
+
- User has a vague idea and wants the agent to drive the whole arc.
|
|
30
23
|
|
|
31
|
-
|
|
32
|
-
|-------|-----------|--------|-------------|-----------|
|
|
33
|
-
| FPS | Node3D | Camera3D on player | CharacterBody3D | 3D |
|
|
34
|
-
| Platformer 2D | Node2D | Camera2D following | CharacterBody2D | 2D |
|
|
35
|
-
| Platformer 3D | Node3D | Camera3D following | CharacterBody3D | 3D |
|
|
36
|
-
| Top-down | Node2D | Camera2D | CharacterBody2D | 2D |
|
|
37
|
-
| Puzzle | Node2D or Control | Camera2D or none | varies | 2D |
|
|
38
|
-
| Racing | Node3D | Camera3D behind car | VehicleBody3D | 3D |
|
|
39
|
-
|
|
40
|
-
---
|
|
24
|
+
## When NOT to use this skill
|
|
41
25
|
|
|
42
|
-
|
|
26
|
+
- User has a specific narrow ask ("add jump", "fix this bug", "design the inventory") → use the specific skill, not this orchestrator.
|
|
27
|
+
- User already has a working scaffold and wants to iterate → start at the relevant phase below, don't re-run the whole pipeline.
|
|
28
|
+
- User says "I want to use a template" → run `summer:browse-templates` first; come back here only if they decide they want a custom build instead.
|
|
43
29
|
|
|
44
|
-
|
|
30
|
+
## The Pipeline
|
|
45
31
|
|
|
46
32
|
```
|
|
47
|
-
|
|
48
|
-
|
|
33
|
+
Brainstorm → Plan → Scaffold → Build → Layer → Polish → Verify → Ship
|
|
34
|
+
│ │ │ │ │ │ │ │
|
|
35
|
+
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
|
|
36
|
+
brainstorm plan new-project build-loop art vfx play export
|
|
37
|
+
-game (this browse- (this skill) audio debug -and-
|
|
38
|
+
skill) templates ship
|
|
39
|
+
|
|
40
|
+
↓
|
|
41
|
+
(one mechanic at a time:
|
|
42
|
+
design-mechanic + scene-composition
|
|
43
|
+
+ gdscript-patterns + play check)
|
|
49
44
|
```
|
|
50
45
|
|
|
51
|
-
|
|
46
|
+
Run the phases in order. Between every phase, **stop and confirm with the user before continuing.** The user owns scope decisions; the agent owns execution discipline.
|
|
52
47
|
|
|
53
|
-
|
|
48
|
+
## Phase 1: Brainstorm
|
|
54
49
|
|
|
55
|
-
|
|
56
|
-
summer_project_setting(key="application/config/name", value="<game name>")
|
|
57
|
-
summer_project_setting(key="display/window/size/viewport_width", value=1280)
|
|
58
|
-
summer_project_setting(key="display/window/size/viewport_height", value=720)
|
|
59
|
-
summer_project_setting(key="application/run/main_scene", value="res://scenes/main_level.tscn")
|
|
60
|
-
```
|
|
50
|
+
**Goal**: turn a vague idea into a 1-page brief.
|
|
61
51
|
|
|
62
|
-
For 2D pixel art, add:
|
|
63
52
|
```
|
|
64
|
-
|
|
53
|
+
Skill: summer:brainstorm-game
|
|
65
54
|
```
|
|
66
55
|
|
|
67
|
-
|
|
56
|
+
That skill asks one question, scopes mechanics, picks an art direction, and writes `.summer/GameSoul.md`. Don't skip this. **The brief is what every later phase reads.**
|
|
68
57
|
|
|
69
|
-
|
|
70
|
-
summer_create_scene(path="res://scenes/main_level.tscn", rootName="World", allow_temporary_scene_mutation=true)
|
|
71
|
-
summer_create_scene(path="res://scenes/player.tscn", rootName="Player", allow_temporary_scene_mutation=true)
|
|
72
|
-
```
|
|
58
|
+
If the user already has `.summer/GameSoul.md` (check via Read), skip the brainstorm and confirm:
|
|
73
59
|
|
|
74
|
-
|
|
60
|
+
> "Found `.summer/GameSoul.md` — should I build from this brief, or do you want to start over?"
|
|
75
61
|
|
|
76
|
-
|
|
77
|
-
- `res://scripts/` -- .gd files
|
|
78
|
-
- `res://assets/models/` -- 3D models
|
|
79
|
-
- `res://assets/textures/` -- images, sprites
|
|
80
|
-
- `res://assets/audio/` -- sounds, music
|
|
62
|
+
**Checkpoint before continuing:**
|
|
81
63
|
|
|
82
|
-
|
|
64
|
+
> "Brief saved at `.summer/GameSoul.md`. Want me to plan the build?"
|
|
83
65
|
|
|
84
|
-
## Phase 2:
|
|
66
|
+
## Phase 2: Plan
|
|
85
67
|
|
|
86
|
-
|
|
68
|
+
**Goal**: turn the brief into a concrete checklist of scenes, mechanics, and assets, in priority order.
|
|
87
69
|
|
|
88
|
-
|
|
70
|
+
This phase doesn't have a dedicated skill yet — do it inline. Read `.summer/GameSoul.md` and produce a plan with three sections:
|
|
89
71
|
|
|
90
|
-
|
|
72
|
+
1. **Core scenes** — main scene, level/menu scenes, prefabs the game needs
|
|
73
|
+
2. **Core mechanics** — ranked, max 3 (the brief enforces this; respect it)
|
|
74
|
+
3. **Cut list** — what's explicitly NOT in scope
|
|
91
75
|
|
|
92
|
-
|
|
93
|
-
summer_search_assets(query="low-poly tree", assetType="3d_model", limit=5)
|
|
94
|
-
summer_import_asset(query="wooden barrel", parent="./World/Props", assetType="3d_model")
|
|
95
|
-
```
|
|
76
|
+
Save the plan to `.summer/build-plan.md`. Format:
|
|
96
77
|
|
|
97
|
-
|
|
78
|
+
```markdown
|
|
79
|
+
# Build plan — <game name>
|
|
98
80
|
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
summer_generate_image(prompt="top-down grass tileset, seamless, 512x512", style="cartoon")
|
|
102
|
-
```
|
|
103
|
-
Returns `localPath` -- use Read tool to show the user for approval.
|
|
104
|
-
Then import:
|
|
105
|
-
```
|
|
106
|
-
summer_import_from_url(url="<asset.fileUrl>", path="res://assets/textures/grass.png")
|
|
107
|
-
```
|
|
81
|
+
Source: .summer/GameSoul.md (date)
|
|
108
82
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
83
|
+
## Core scenes
|
|
84
|
+
- [ ] main.tscn — World + Player + Camera + Light + Floor
|
|
85
|
+
- [ ] level_01.tscn — first playable level
|
|
86
|
+
- [ ] hud.tscn — health, score
|
|
87
|
+
- [ ] (more)
|
|
114
88
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
summer_generate_3d(kind="image-to-3d", imageUrl="<asset.fileUrl>")
|
|
120
|
-
```
|
|
89
|
+
## Core mechanics (in build order)
|
|
90
|
+
1. [ ] Movement (FPS / TPS / 2D platformer / etc.)
|
|
91
|
+
2. [ ] Primary action (shoot / jump / interact)
|
|
92
|
+
3. [ ] Win/lose state
|
|
121
93
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**Parallel generation**: Start multiple 3D jobs with `wait=false`, work on scene setup, then check later:
|
|
130
|
-
```
|
|
131
|
-
summer_generate_3d(prompt="...", wait=false) -> jobId: "abc"
|
|
132
|
-
summer_generate_3d(prompt="...", wait=false) -> jobId: "def"
|
|
133
|
-
# ... do scene work ...
|
|
134
|
-
summer_check_job(jobId="abc")
|
|
135
|
-
summer_check_job(jobId="def")
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Strategy C: Primitive Meshes (instant, offline)
|
|
139
|
-
|
|
140
|
-
For prototyping or blocking out levels:
|
|
141
|
-
```
|
|
142
|
-
summer_add_node(parent="./World", type="MeshInstance3D", name="Floor")
|
|
143
|
-
summer_set_prop(path="./World/Floor", key="mesh", value="BoxMesh")
|
|
144
|
-
summer_set_resource_property(nodePath="./World/Floor", resourceProperty="mesh", subProperty="size", value="Vector3(20, 0.2, 20)")
|
|
94
|
+
## Cut list (NOT in scope this pass)
|
|
95
|
+
- Multiplayer
|
|
96
|
+
- Save/load
|
|
97
|
+
- Settings menu
|
|
98
|
+
- ...
|
|
145
99
|
```
|
|
146
100
|
|
|
147
|
-
|
|
101
|
+
**Checkpoint before continuing:**
|
|
148
102
|
|
|
149
|
-
|
|
103
|
+
> "Plan saved. Three core mechanics: movement, primary action, win condition. Anything you want to add or cut before I start building?"
|
|
150
104
|
|
|
151
|
-
|
|
105
|
+
## Phase 3: Scaffold
|
|
152
106
|
|
|
153
|
-
|
|
107
|
+
**Goal**: working project on disk, scene opens in the engine.
|
|
154
108
|
|
|
155
|
-
|
|
156
|
-
summer_batch(ops=[
|
|
157
|
-
{"op":"AddNode","parent":"./","type":"Node3D","name":"Level"},
|
|
158
|
-
{"op":"AddNode","parent":"./Level","type":"MeshInstance3D","name":"Ground"},
|
|
159
|
-
{"op":"SetProp","path":"./Level/Ground","key":"mesh","value":"PlaneMesh"},
|
|
160
|
-
{"op":"SetResourceProperty","nodePath":"./Level/Ground","resourceProperty":"mesh","subProperty":"size","value":"Vector2(50,50)"},
|
|
161
|
-
{"op":"AddNode","parent":"./","type":"DirectionalLight3D","name":"Sun"},
|
|
162
|
-
{"op":"SetProp","path":"./Sun","key":"rotation_degrees","value":"Vector3(-45,30,0)"},
|
|
163
|
-
{"op":"SetProp","path":"./Sun","key":"shadow_enabled","value":"true"},
|
|
164
|
-
{"op":"AddNode","parent":"./","type":"WorldEnvironment","name":"Env"}
|
|
165
|
-
])
|
|
166
|
-
```
|
|
109
|
+
If the user said "I want to use a template" earlier, this is just `summer:browse-templates`.
|
|
167
110
|
|
|
168
|
-
|
|
111
|
+
If from scratch:
|
|
169
112
|
|
|
170
|
-
**3D FPS/Third-person:**
|
|
171
113
|
```
|
|
172
|
-
|
|
173
|
-
summer_batch(ops=[
|
|
174
|
-
{"op":"AddNode","parent":"./","type":"CollisionShape3D","name":"Collision"},
|
|
175
|
-
{"op":"SetProp","path":"./Collision","key":"shape","value":"CapsuleShape3D"},
|
|
176
|
-
{"op":"AddNode","parent":"./","type":"Camera3D","name":"Camera"},
|
|
177
|
-
{"op":"SetProp","path":"./Camera","key":"position","value":"Vector3(0,1.6,0)"}
|
|
178
|
-
])
|
|
114
|
+
Skill: summer:new-project
|
|
179
115
|
```
|
|
180
116
|
|
|
181
|
-
|
|
182
|
-
```
|
|
183
|
-
summer_open_scene(path="res://scenes/player.tscn")
|
|
184
|
-
summer_batch(ops=[
|
|
185
|
-
{"op":"AddNode","parent":"./","type":"CollisionShape2D","name":"Collision"},
|
|
186
|
-
{"op":"SetProp","path":"./Collision","key":"shape","value":"RectangleShape2D"},
|
|
187
|
-
{"op":"AddNode","parent":"./","type":"Sprite2D","name":"Sprite"},
|
|
188
|
-
{"op":"AddNode","parent":"./","type":"Camera2D","name":"Camera"}
|
|
189
|
-
])
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### 3c. Input bindings
|
|
117
|
+
That picks `empty` vs `3d-basic` based on the GameSoul brief. After the project is created and `summer run` succeeds:
|
|
193
118
|
|
|
194
119
|
```
|
|
195
|
-
|
|
196
|
-
summer_input_map_bind(name="move_back", events=[{"type":"key","key":"S"}])
|
|
197
|
-
summer_input_map_bind(name="move_left", events=[{"type":"key","key":"A"}])
|
|
198
|
-
summer_input_map_bind(name="move_right", events=[{"type":"key","key":"D"}])
|
|
199
|
-
summer_input_map_bind(name="jump", events=[{"type":"key","key":"Space"}])
|
|
200
|
-
summer_input_map_bind(name="interact", events=[{"type":"key","key":"E"}])
|
|
120
|
+
Skill: summer:scene-composition
|
|
201
121
|
```
|
|
202
122
|
|
|
203
|
-
|
|
123
|
+
To set up the canonical hierarchy for the genre. For 3D action games:
|
|
204
124
|
|
|
205
125
|
```
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
126
|
+
World (Node3D)
|
|
127
|
+
├── Player (CharacterBody3D)
|
|
128
|
+
├── Level (Node3D)
|
|
129
|
+
├── Lighting (Node3D)
|
|
130
|
+
│ ├── Sun (DirectionalLight3D)
|
|
131
|
+
│ └── Environment (WorldEnvironment)
|
|
132
|
+
├── HUD (CanvasLayer)
|
|
133
|
+
└── GameManager (Node) # autoload-style, holds win/lose state
|
|
210
134
|
```
|
|
211
135
|
|
|
212
|
-
|
|
136
|
+
Save the scene. Run `summer_play` once to verify the empty scaffold opens cleanly. If it crashes, run `summer:debug` immediately — do NOT continue building on a broken base.
|
|
213
137
|
|
|
214
|
-
|
|
215
|
-
summer_save_scene()
|
|
216
|
-
```
|
|
138
|
+
**Checkpoint before continuing:**
|
|
217
139
|
|
|
218
|
-
|
|
140
|
+
> "Scaffold is in. Empty scene plays clean. Building mechanic 1 of N: <name>. OK?"
|
|
219
141
|
|
|
220
|
-
## Phase 4:
|
|
142
|
+
## Phase 4: Build (one mechanic at a time)
|
|
221
143
|
|
|
222
|
-
**
|
|
144
|
+
**Goal**: each mechanic from the plan, fully working, before moving to the next.
|
|
223
145
|
|
|
224
|
-
|
|
225
|
-
1. Write the script file to disk
|
|
226
|
-
2. Attach: `summer_set_prop(path="./Player", key="script", value="res://scripts/player.gd")`
|
|
227
|
-
3. Check: `summer_get_script_errors(path="res://scripts/player.gd")`
|
|
228
|
-
4. Wire signals: `summer_connect_signal(emitter="./Coin", signal="body_entered", receiver="./Coin", method="_on_body_entered")`
|
|
146
|
+
For each mechanic in the plan, **in order**:
|
|
229
147
|
|
|
230
|
-
|
|
148
|
+
1. **Design pass**:
|
|
149
|
+
```
|
|
150
|
+
Skill: summer:design-mechanic
|
|
151
|
+
```
|
|
152
|
+
Outputs the mechanic spec: input, response, feedback, failure modes, depth, tunables, GDScript stub.
|
|
231
153
|
|
|
232
|
-
|
|
154
|
+
2. **Implement**:
|
|
155
|
+
- Add the nodes via `summer_add_node` / `summer_set_prop`. Use `summer:scene-composition` if the structure is non-trivial.
|
|
156
|
+
- For movement-class mechanics, prefer the matching pre-built skill: `summer:fps-controller`, `summer:peer-to-peer-multiplayer`, etc.
|
|
157
|
+
- Write GDScript with `summer:gdscript-patterns` open.
|
|
233
158
|
|
|
234
|
-
|
|
235
|
-
|
|
159
|
+
3. **Verify**:
|
|
160
|
+
```
|
|
161
|
+
Skill: summer:play
|
|
162
|
+
```
|
|
163
|
+
Then `summer_get_diagnostics`. Clean? Move on. Errors? `summer:debug` until clean. **Do not stack mechanic 2 on top of a broken mechanic 1.**
|
|
236
164
|
|
|
237
|
-
|
|
238
|
-
@export var jump_velocity: float = 4.5
|
|
239
|
-
@export var mouse_sensitivity: float = 0.002
|
|
165
|
+
4. **Checkpoint**:
|
|
240
166
|
|
|
241
|
-
|
|
167
|
+
> "Mechanic 1 of N working: <name>. <One-line proof: 'WASD moves the player, jump works'>. Building mechanic 2 of N: <name>. OK?"
|
|
242
168
|
|
|
243
|
-
|
|
244
|
-
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
|
169
|
+
Repeat until every mechanic in the plan is implemented OR the user calls cut.
|
|
245
170
|
|
|
246
|
-
|
|
247
|
-
if event is InputEventMouseMotion:
|
|
248
|
-
rotate_y(-event.relative.x * mouse_sensitivity)
|
|
249
|
-
$Camera.rotate_x(-event.relative.y * mouse_sensitivity)
|
|
250
|
-
$Camera.rotation.x = clampf($Camera.rotation.x, -PI/2, PI/2)
|
|
251
|
-
if event.is_action_pressed("ui_cancel"):
|
|
252
|
-
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
|
171
|
+
## Phase 5: Layer (look + sound)
|
|
253
172
|
|
|
254
|
-
|
|
255
|
-
if not is_on_floor():
|
|
256
|
-
velocity.y -= gravity * delta
|
|
173
|
+
**Goal**: the game stops looking like a programmer art prototype.
|
|
257
174
|
|
|
258
|
-
if Input.is_action_just_pressed("jump") and is_on_floor():
|
|
259
|
-
velocity.y = jump_velocity
|
|
260
|
-
|
|
261
|
-
var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_back")
|
|
262
|
-
var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
|
|
263
|
-
|
|
264
|
-
if direction:
|
|
265
|
-
velocity.x = direction.x * speed
|
|
266
|
-
velocity.z = direction.z * speed
|
|
267
|
-
else:
|
|
268
|
-
velocity.x = move_toward(velocity.x, 0, speed)
|
|
269
|
-
velocity.z = move_toward(velocity.z, 0, speed)
|
|
270
|
-
|
|
271
|
-
move_and_slide()
|
|
272
175
|
```
|
|
273
|
-
|
|
274
|
-
### 2D Platformer Controller
|
|
275
|
-
|
|
276
|
-
Write to `res://scripts/player.gd`:
|
|
277
|
-
|
|
278
|
-
```gdscript
|
|
279
|
-
extends CharacterBody2D
|
|
280
|
-
|
|
281
|
-
@export var speed: float = 200.0
|
|
282
|
-
@export var jump_velocity: float = -350.0
|
|
283
|
-
|
|
284
|
-
var gravity: float = ProjectSettings.get_setting("physics/2d/default_gravity")
|
|
285
|
-
|
|
286
|
-
func _physics_process(delta: float) -> void:
|
|
287
|
-
if not is_on_floor():
|
|
288
|
-
velocity.y += gravity * delta
|
|
289
|
-
|
|
290
|
-
if Input.is_action_just_pressed("jump") and is_on_floor():
|
|
291
|
-
velocity.y = jump_velocity
|
|
292
|
-
|
|
293
|
-
var direction := Input.get_axis("move_left", "move_right")
|
|
294
|
-
velocity.x = direction * speed if direction else move_toward(velocity.x, 0, speed)
|
|
295
|
-
|
|
296
|
-
move_and_slide()
|
|
176
|
+
Skill: summer:art-direction
|
|
297
177
|
```
|
|
298
178
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
Write to `res://scripts/collectible.gd`:
|
|
302
|
-
|
|
303
|
-
```gdscript
|
|
304
|
-
extends Area3D
|
|
179
|
+
That writes `.summer/art-bible.md` if it doesn't exist, then guides the lighting / material / palette pass. Use `summer:3d-lighting` for the actual scene work.
|
|
305
180
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
func _ready() -> void:
|
|
309
|
-
body_entered.connect(_on_body_entered)
|
|
310
|
-
|
|
311
|
-
func _on_body_entered(body: Node3D) -> void:
|
|
312
|
-
if body.is_in_group("player"):
|
|
313
|
-
collected.emit()
|
|
314
|
-
queue_free()
|
|
181
|
+
```
|
|
182
|
+
Skill: summer:audio-direction
|
|
315
183
|
```
|
|
316
184
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
Write to `res://scripts/enemy_patrol.gd`:
|
|
320
|
-
|
|
321
|
-
```gdscript
|
|
322
|
-
extends CharacterBody3D
|
|
185
|
+
Writes `.summer/audio-bible.md` and sets up the audio bus structure. Wires SFX hooks into the mechanics from Phase 4.
|
|
323
186
|
|
|
324
|
-
|
|
325
|
-
@export var patrol_distance: float = 5.0
|
|
187
|
+
Use `summer:asset-strategy` to decide whether to generate assets, search the library, or use primitives. **Public asset library search is free** — encourage it before generation, which costs credits.
|
|
326
188
|
|
|
327
|
-
|
|
328
|
-
var direction: float = 1.0
|
|
329
|
-
var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
|
|
189
|
+
**Checkpoint before continuing:**
|
|
330
190
|
|
|
331
|
-
|
|
332
|
-
start_pos = global_position
|
|
191
|
+
> "Art and audio direction set. Want me to add a polish pass (juice / VFX / camera shake / hit feedback)?"
|
|
333
192
|
|
|
334
|
-
|
|
335
|
-
if not is_on_floor():
|
|
336
|
-
velocity.y -= gravity * delta
|
|
193
|
+
## Phase 6: Polish (skip if user wants to ship raw)
|
|
337
194
|
|
|
338
|
-
|
|
339
|
-
move_and_slide()
|
|
195
|
+
**Goal**: the game *feels* good. Hit-flash, screen shake, audio ducking, weight.
|
|
340
196
|
|
|
341
|
-
if global_position.distance_to(start_pos) > patrol_distance:
|
|
342
|
-
direction *= -1
|
|
343
197
|
```
|
|
344
|
-
|
|
345
|
-
---
|
|
346
|
-
|
|
347
|
-
## Phase 5: Test and Debug
|
|
348
|
-
|
|
349
|
-
```
|
|
350
|
-
summer_clear_console()
|
|
351
|
-
summer_play()
|
|
198
|
+
Skill: summer:vfx
|
|
352
199
|
```
|
|
353
200
|
|
|
354
|
-
|
|
355
|
-
```
|
|
356
|
-
summer_get_diagnostics()
|
|
357
|
-
```
|
|
201
|
+
Walks the canonical Godot 4.5 game-feel stack — hit-flash + trauma camera shake + audio ducking — wired so a single hit fires all three.
|
|
358
202
|
|
|
359
|
-
If errors:
|
|
360
203
|
```
|
|
361
|
-
|
|
362
|
-
summer_get_script_errors(path="res://scripts/player.gd")
|
|
204
|
+
Skill: summer:tune-performance
|
|
363
205
|
```
|
|
364
206
|
|
|
365
|
-
|
|
366
|
-
```
|
|
367
|
-
summer_stop()
|
|
368
|
-
# apply fix
|
|
369
|
-
summer_play()
|
|
370
|
-
```
|
|
207
|
+
Only if `summer_get_diagnostics` flags rendering or physics hotspots. Don't optimize prematurely.
|
|
371
208
|
|
|
372
|
-
|
|
209
|
+
## Phase 7: Verify (final QA pass)
|
|
373
210
|
|
|
374
|
-
|
|
375
|
-
|-------|-------|-----|
|
|
376
|
-
| "Node not found" | Bad $NodePath | Check path with `summer_get_scene_tree()` |
|
|
377
|
-
| "Invalid call" on move_and_slide | Wrong base class | Script must extend CharacterBody3D/2D |
|
|
378
|
-
| Falling through floor | No collision | Add StaticBody3D + CollisionShape3D to ground |
|
|
379
|
-
| "No main scene" | Not configured | `summer_project_setting(key="application/run/main_scene", ...)` |
|
|
380
|
-
| Mouse not captured | Missing in _ready | Add `Input.mouse_mode = Input.MOUSE_MODE_CAPTURED` |
|
|
211
|
+
**Goal**: the full game runs end-to-end without errors, and the win condition can actually be reached.
|
|
381
212
|
|
|
382
|
-
|
|
213
|
+
1. `summer:play` from main scene.
|
|
214
|
+
2. Walk every mechanic from the plan.
|
|
215
|
+
3. Hit the win condition (or lose condition).
|
|
216
|
+
4. `summer_get_diagnostics` clean.
|
|
217
|
+
5. `summer:debug` until clean if not.
|
|
383
218
|
|
|
384
|
-
|
|
219
|
+
**Don't skip this even if every mechanic worked individually.** Integration bugs hide between mechanics.
|
|
385
220
|
|
|
386
|
-
|
|
221
|
+
## Phase 8: Ship
|
|
387
222
|
|
|
388
|
-
|
|
389
|
-
-
|
|
390
|
-
|
|
391
|
-
- **Sound**: Generate with `summer_generate_audio`, attach AudioStreamPlayer3D
|
|
392
|
-
- **Lighting**: Set up WorldEnvironment + lights (see 3d-lighting skill)
|
|
393
|
-
- **Game states**: Main menu > gameplay > game over flow via SceneTree.change_scene_to_file()
|
|
223
|
+
```
|
|
224
|
+
Skill: summer:export-and-ship
|
|
225
|
+
```
|
|
394
226
|
|
|
395
|
-
|
|
227
|
+
Pre-flight checklist (icon, store banners, build config) before producing release builds for the targets in the brief.
|
|
228
|
+
|
|
229
|
+
If the brief said "jam" or "prototype", skip this phase. If the brief said "game I want to release", run it.
|
|
396
230
|
|
|
397
231
|
## Anti-Patterns
|
|
398
232
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
233
|
+
| Don't | Why |
|
|
234
|
+
|---|---|
|
|
235
|
+
| Skip the brainstorm because the user said "FPS" | Even with the genre named, you need the scope cut list. Otherwise mechanic 4 quietly sneaks in and the game never ships. |
|
|
236
|
+
| Let mechanic 2 start before mechanic 1 is verified clean | Compounding bugs. You'll spend the rest of the session debugging which mechanic broke what. |
|
|
237
|
+
| Stack art direction on top of unfinished mechanics | Art changes are reversible only if the underlying scene structure is stable. Get mechanics done first. |
|
|
238
|
+
| Treat "polish" as required | If the brief says "jam in 2 days", polish is a cut item. Respect the brief. |
|
|
239
|
+
| Run all phases without confirming | The user owns scope. Stop at every checkpoint. |
|
|
240
|
+
| Build a fully featured menu before there's a playable mechanic | Menu work is endless polish; player-loop work is the actual game. Mechanics first. |
|
|
241
|
+
| Fall back to "let me try a few things" mid-pipeline | If you don't know what to do, name the phase and ask the user, don't improvise around the structure. |
|
|
406
242
|
|
|
407
|
-
|
|
243
|
+
## What this skill produces (artifacts on disk)
|
|
408
244
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
| Category | Tool | Purpose |
|
|
412
|
-
|----------|------|---------|
|
|
413
|
-
| Setup | `summer_get_agent_playbook` | Safe workflow guide |
|
|
414
|
-
| Setup | `summer_get_project_context` | Project name, paths, status |
|
|
415
|
-
| Setup | `summer_project_setting` | Set project.godot values |
|
|
416
|
-
| Scene | `summer_create_scene` | New scene file |
|
|
417
|
-
| Scene | `summer_open_scene` | Switch to scene |
|
|
418
|
-
| Scene | `summer_get_scene_tree` | Read scene structure |
|
|
419
|
-
| Scene | `summer_save_scene` | Save to disk |
|
|
420
|
-
| Nodes | `summer_add_node` | Add node |
|
|
421
|
-
| Nodes | `summer_set_prop` | Set property |
|
|
422
|
-
| Nodes | `summer_set_resource_property` | Set sub-resource prop |
|
|
423
|
-
| Nodes | `summer_remove_node` | Delete node |
|
|
424
|
-
| Nodes | `summer_instantiate_scene` | Place .tscn/.glb |
|
|
425
|
-
| Nodes | `summer_batch` | Multi-op, one undo |
|
|
426
|
-
| Nodes | `summer_connect_signal` | Wire signals |
|
|
427
|
-
| Nodes | `summer_inspect_node` | Read node details |
|
|
428
|
-
| Input | `summer_input_map_bind` | Bind keys to actions |
|
|
429
|
-
| Assets | `summer_search_assets` | Search 25k+ library |
|
|
430
|
-
| Assets | `summer_import_asset` | Search + import + place |
|
|
431
|
-
| Assets | `summer_import_from_url` | Import from URL |
|
|
432
|
-
| Generate | `summer_generate_image` | AI image gen |
|
|
433
|
-
| Generate | `summer_generate_audio` | AI audio/SFX/music |
|
|
434
|
-
| Generate | `summer_generate_3d` | AI 3D model gen |
|
|
435
|
-
| Generate | `summer_generate_video` | AI video gen |
|
|
436
|
-
| Generate | `summer_check_job` | Poll async jobs |
|
|
437
|
-
| Debug | `summer_play` | Run game |
|
|
438
|
-
| Debug | `summer_stop` | Stop game |
|
|
439
|
-
| Debug | `summer_get_diagnostics` | Error overview |
|
|
440
|
-
| Debug | `summer_get_console` | Read output |
|
|
441
|
-
| Debug | `summer_get_script_errors` | Check .gd compile |
|
|
442
|
-
| Debug | `summer_clear_console` | Clear output |
|
|
245
|
+
By the end of a successful run, the user has:
|
|
443
246
|
|
|
444
|
-
|
|
247
|
+
- `project.godot` — Summer Engine project
|
|
248
|
+
- `main.tscn` — playable main scene
|
|
249
|
+
- `.summer/GameSoul.md` — the brief
|
|
250
|
+
- `.summer/build-plan.md` — the checklist
|
|
251
|
+
- `.summer/art-bible.md` — visual direction
|
|
252
|
+
- `.summer/audio-bible.md` — sonic direction
|
|
253
|
+
- One `.gd` file per mechanic
|
|
254
|
+
- `summer_get_diagnostics` returns clean
|
|
255
|
+
- `summer_play` runs end-to-end and the win condition is reachable
|
|
256
|
+
|
|
257
|
+
That's a real game. Not a half-finished prototype.
|
|
445
258
|
|
|
446
|
-
##
|
|
259
|
+
## Closing line
|
|
447
260
|
|
|
448
|
-
|
|
261
|
+
When all phases are done:
|
|
449
262
|
|
|
450
|
-
|
|
263
|
+
> "<Game name> is in. <N> mechanics, <playable from main scene to win condition>. <Brief summary of the build>. Want me to package a build (`summer:export-and-ship`) or iterate?"
|
|
451
264
|
|
|
452
|
-
|
|
265
|
+
That's the handoff back to the user.
|