summer-engine 3.3.0 → 3.4.1
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 +4 -2
- package/.codex-plugin/plugin.json +5 -3
- package/.cursor-plugin/plugin.json +4 -2
- package/.factory-plugin/plugin.json +4 -2
- package/.opencode/INSTALL.md +8 -8
- package/.opencode/plugins/summer.js +2 -2
- package/AGENTS.md +7 -7
- package/CHANGELOG.md +50 -0
- package/GEMINI.md +1 -1
- package/NOTICE +1 -1
- package/README.md +32 -35
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/run.sh +2 -2
- package/assets/navigation/web-routes.json +1 -1
- package/commands/gameskill.md +2 -2
- package/commands/summer.md +25 -25
- package/dist/cli/commands/install.d.ts +10 -0
- package/dist/cli/commands/install.js +55 -10
- package/dist/cli/commands/open.d.ts +1 -1
- package/dist/cli/commands/run.d.ts +1 -1
- package/dist/cli/commands/run.js +1 -1
- package/dist/cli/commands/skills.js +2 -2
- package/dist/cli/commands/tool.d.ts +7 -0
- package/dist/cli/commands/tool.js +36 -1
- package/dist/core/api-client.d.ts +5 -6
- package/dist/core/api-client.js +12 -15
- package/dist/core/auth.js +2 -2
- package/dist/core/capabilities/asset-import.d.ts +0 -1
- package/dist/core/capabilities/camera-view.d.ts +1 -1
- package/dist/core/capabilities/camera-view.js +2 -2
- package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
- package/dist/core/capabilities/capture-gameplay.js +283 -0
- package/dist/core/capabilities/connect-signal.d.ts +1 -2
- package/dist/core/capabilities/connect-signal.js +1 -2
- package/dist/core/capabilities/console-read.d.ts +2 -2
- package/dist/core/capabilities/console-read.js +2 -2
- package/dist/core/capabilities/creator.js +1 -1
- package/dist/core/capabilities/doctor.d.ts +9 -1
- package/dist/core/capabilities/doctor.js +47 -4
- package/dist/core/capabilities/engine-receipt.d.ts +5 -7
- package/dist/core/capabilities/engine-receipt.js +7 -9
- package/dist/core/capabilities/engine-run.d.ts +4 -0
- package/dist/core/capabilities/engine-run.js +33 -5
- package/dist/core/capabilities/export-engine-version.d.ts +15 -0
- package/dist/core/capabilities/export-engine-version.js +24 -0
- package/dist/core/capabilities/export-game.d.ts +9 -1
- package/dist/core/capabilities/export-game.js +115 -39
- package/dist/core/capabilities/export-presets.d.ts +1 -1
- package/dist/core/capabilities/export-presets.js +1 -1
- package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
- package/dist/core/capabilities/fabricate-mesh.js +2 -3
- package/dist/core/capabilities/frame-quality.d.ts +4 -4
- package/dist/core/capabilities/frame-quality.js +4 -4
- package/dist/core/capabilities/grep.d.ts +1 -1
- package/dist/core/capabilities/grep.js +1 -1
- package/dist/core/capabilities/image-generation.d.ts +9 -0
- package/dist/core/capabilities/image-generation.js +19 -1
- package/dist/core/capabilities/navigation/open.d.ts +1 -1
- package/dist/core/capabilities/navigation/open.js +1 -1
- package/dist/core/capabilities/navigation/render-product-map.js +1 -1
- package/dist/core/capabilities/navigation/targets.js +2 -2
- package/dist/core/capabilities/placement-batch.d.ts +1 -1
- package/dist/core/capabilities/placement-batch.js +2 -2
- package/dist/core/capabilities/play-determinism.d.ts +1 -1
- package/dist/core/capabilities/play-determinism.js +1 -1
- package/dist/core/capabilities/publish-build.d.ts +15 -2
- package/dist/core/capabilities/publish-build.js +78 -28
- package/dist/core/capabilities/publish-download.d.ts +1 -2
- package/dist/core/capabilities/publish-download.js +2 -3
- package/dist/core/capabilities/replace-node.d.ts +1 -3
- package/dist/core/capabilities/replace-node.js +1 -3
- package/dist/core/capabilities/runtime-control.d.ts +5 -7
- package/dist/core/capabilities/runtime-control.js +7 -9
- package/dist/core/capabilities/scene-batch.d.ts +1 -1
- package/dist/core/capabilities/scene-batch.js +1 -1
- package/dist/core/capabilities/scene-kind.js +1 -1
- package/dist/core/capabilities/scene-readback.d.ts +3 -4
- package/dist/core/capabilities/scene-readback.js +3 -4
- package/dist/core/capabilities/scene-script.d.ts +2 -2
- package/dist/core/capabilities/scene-script.js +2 -2
- package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
- package/dist/core/capabilities/seeing/shot-store.js +1 -1
- package/dist/core/capabilities/summer-bundle.d.ts +2 -3
- package/dist/core/capabilities/summer-bundle.js +2 -3
- package/dist/core/capabilities/surface-snap.d.ts +1 -1
- package/dist/core/capabilities/surface-snap.js +1 -1
- package/dist/core/capabilities/tool-dispatch.js +11 -1
- package/dist/core/capabilities/ui-control.d.ts +1 -2
- package/dist/core/capabilities/ui-control.js +1 -2
- package/dist/core/capabilities/world-snapshot.d.ts +1 -1
- package/dist/core/capabilities/world-snapshot.js +1 -1
- package/dist/core/capability-skew.d.ts +2 -3
- package/dist/core/capability-skew.js +4 -5
- package/dist/core/config.js +2 -2
- package/dist/core/engine-install.d.ts +16 -0
- package/dist/core/engine-install.js +32 -2
- package/dist/core/feedback/client.js +1 -1
- package/dist/core/hosted-mcp.d.ts +115 -0
- package/dist/core/hosted-mcp.js +164 -0
- package/dist/core/launch-posture.d.ts +6 -3
- package/dist/core/launch-posture.js +18 -5
- package/dist/core/library-read.js +1 -2
- package/dist/core/templates.d.ts +1 -2
- package/dist/core/templates.js +1 -2
- package/dist/mcp/hosted-mount.d.ts +13 -59
- package/dist/mcp/hosted-mount.js +24 -30
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.js +5 -4
- package/dist/mcp/tools/creator-tools.js +14 -4
- package/dist/mcp/tools/debug-tools.js +1 -1
- package/dist/mcp/tools/generate-tools.js +19 -9
- package/dist/mcp/tools/navigation-tools.d.ts +1 -1
- package/dist/mcp/tools/navigation-tools.js +1 -1
- package/dist/mcp/tools/spatial-tools.js +1 -1
- package/dist/mcp/tools/visual-tools.js +2 -2
- package/dist/mcp/tools/with-engine.d.ts +1 -2
- package/dist/mcp/tools/with-engine.js +1 -2
- package/gemini-extension.json +3 -1
- package/hooks/session-start.sh +2 -2
- package/integrations/README.md +70 -76
- package/integrations/claude/README.md +0 -3
- package/integrations/codex/README.md +1 -2
- package/integrations/copilot-jetbrains/README.md +1 -1
- package/integrations/cursor/README.md +1 -2
- package/integrations/factory/README.md +15 -11
- package/integrations/mistral-vibe/README.md +1 -1
- package/integrations/opencode/README.md +1 -1
- package/integrations/roo-code/README.md +1 -1
- package/integrations/rovo-dev/README.md +1 -1
- package/integrations/trae/README.md +1 -1
- package/integrations/windsurf/README.md +3 -3
- package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
- package/library/references/gd-style/gd-style.md +4 -6
- package/library/references/godot-version/godot-version.md +3 -3
- package/library/references/headless-routing/headless-routing.md +2 -2
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -16
- package/library/references/product-map/product-map.md +1 -1
- package/library/references/public-surface-language/public-surface-language.md +1 -1
- package/library/references/summer-folder/summer-folder.md +1 -1
- package/library/skills/3d-lighting/SKILL.md +4 -4
- package/library/skills/README.md +11 -9
- package/library/skills/adaptive-music/SKILL.md +7 -7
- package/library/skills/ai-characters-in-games/SKILL.md +1 -1
- package/library/skills/ambient-bed/SKILL.md +12 -14
- package/library/skills/animated-loop/SKILL.md +42 -42
- package/library/skills/animation-tree/SKILL.md +6 -6
- package/library/skills/art-direction/SKILL.md +8 -11
- package/library/skills/asset-strategy/SKILL.md +3 -3
- package/library/skills/audio-direction/SKILL.md +8 -10
- package/library/skills/auto-fire-targeting/SKILL.md +4 -3
- package/library/skills/bounded-engine-runs/SKILL.md +95 -0
- package/library/skills/bounded-engine-runs/resource.yaml +29 -0
- package/library/skills/brainstorm-game/SKILL.md +5 -5
- package/library/skills/brainstorming/SKILL.md +9 -15
- package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
- package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
- package/library/skills/character-animation-wiring/SKILL.md +2 -2
- package/library/skills/character-model/SKILL.md +15 -26
- package/library/skills/character-movement/SKILL.md +1 -1
- package/library/skills/character-movement/references/movement-3d.md +1 -1
- package/library/skills/character-portrait/SKILL.md +4 -4
- package/library/skills/cinematic-cutscene/SKILL.md +38 -38
- package/library/skills/combat-basics/SKILL.md +1 -1
- package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
- package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
- package/library/skills/concept-art/SKILL.md +4 -4
- package/library/skills/create-asset-sheet/SKILL.md +12 -31
- package/library/skills/debug/SKILL.md +5 -4
- package/library/skills/debugging-game-feel/SKILL.md +1 -4
- package/library/skills/debugging-game-feel/resource.yaml +1 -1
- package/library/skills/design-level/SKILL.md +5 -5
- package/library/skills/design-mechanic/SKILL.md +6 -6
- package/library/skills/design-npc/SKILL.md +8 -15
- package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
- package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
- package/library/skills/environment-kit/SKILL.md +5 -5
- package/library/skills/export-and-ship/SKILL.md +25 -24
- package/library/skills/fabricating-assets/SKILL.md +1 -1
- package/library/skills/facial-and-lipsync/SKILL.md +5 -5
- package/library/skills/fps-controller/SKILL.md +17 -16
- package/library/skills/fps-controller/resource.yaml +0 -2
- package/library/skills/game-feel/SKILL.md +6 -7
- package/library/skills/gameskill/SKILL.md +3 -3
- package/library/skills/gdscript-patterns/SKILL.md +3 -3
- package/library/skills/generate-motion/SKILL.md +5 -22
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
- package/library/skills/headless-scripting/SKILL.md +8 -8
- package/library/skills/headless-scripting/resource.yaml +1 -0
- package/library/skills/in-game-purchases/SKILL.md +123 -118
- package/library/skills/in-game-purchases/resource.yaml +2 -2
- package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
- package/library/skills/investigating-bugs/SKILL.md +3 -11
- package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
- package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
- package/library/skills/make-game/SKILL.md +3 -5
- package/library/skills/make-game/references/2d-platformer.md +1 -1
- package/library/skills/multiplayer-project/SKILL.md +1 -1
- package/library/skills/multiplayer-testing/SKILL.md +4 -4
- package/library/skills/music-track/SKILL.md +40 -38
- package/library/skills/new-project/SKILL.md +4 -6
- package/library/skills/organic-model/SKILL.md +9 -9
- package/library/skills/pixel-art/SKILL.md +6 -6
- package/library/skills/play/SKILL.md +3 -4
- package/library/skills/playtesting-a-feature/SKILL.md +4 -6
- package/library/skills/procedural-animation/SKILL.md +10 -11
- package/library/skills/prop-model/SKILL.md +4 -4
- package/library/skills/psx-retro-rendering/SKILL.md +20 -20
- package/library/skills/psx-retro-rendering/resource.yaml +2 -3
- package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
- package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
- package/library/skills/remote-deploy/SKILL.md +20 -21
- package/library/skills/retarget/SKILL.md +19 -23
- package/library/skills/running-in-the-cloud/SKILL.md +5 -5
- package/library/skills/scene-composition/SKILL.md +5 -5
- package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
- package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
- package/library/skills/scene-scripting/SKILL.md +3 -3
- package/library/skills/scene-to-level/SKILL.md +28 -31
- package/library/skills/skill-create/SKILL.md +1 -1
- package/library/skills/skill-improve/SKILL.md +9 -9
- package/library/skills/skill-test/SKILL.md +10 -10
- package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
- package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
- package/library/skills/skybox-panorama/SKILL.md +8 -9
- package/library/skills/sound-effect/SKILL.md +19 -19
- package/library/skills/spatial-placement/SKILL.md +2 -2
- package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
- package/library/skills/sprite-sheet/SKILL.md +10 -10
- package/library/skills/summer-analytics/SKILL.md +3 -3
- package/library/skills/summer-friends/SKILL.md +10 -10
- package/library/skills/summer-leaderboards/SKILL.md +6 -6
- package/library/skills/summer-match-results/SKILL.md +13 -13
- package/library/skills/summer-matchmaking/SKILL.md +11 -11
- package/library/skills/summer-parties/SKILL.md +9 -9
- package/library/skills/summer-player-data/SKILL.md +12 -12
- package/library/skills/summer-store/SKILL.md +6 -6
- package/library/skills/summer-world-chat/SKILL.md +9 -9
- package/library/skills/summer-world-saves/SKILL.md +7 -7
- package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
- package/library/skills/tileable-texture/SKILL.md +1 -1
- package/library/skills/trailer-shot/SKILL.md +36 -36
- package/library/skills/tune-performance/SKILL.md +13 -13
- package/library/skills/tune-performance/resource.yaml +1 -1
- package/library/skills/ui-graphics/SKILL.md +7 -7
- package/library/skills/use-widget-asset/SKILL.md +7 -7
- package/library/skills/using-summer/SKILL.md +5 -7
- package/library/skills/vehicle-model/SKILL.md +6 -7
- package/library/skills/vehicle-model/resource.yaml +2 -2
- package/library/skills/verification-before-completion/SKILL.md +5 -6
- package/library/skills/vfx-dissolve/SKILL.md +4 -4
- package/library/skills/vfx-fire/SKILL.md +6 -6
- package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-hit-spark/SKILL.md +4 -4
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/SKILL.md +5 -5
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-magic-glow/SKILL.md +4 -4
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-smoke/SKILL.md +5 -5
- package/library/skills/vfx-water-ripple/SKILL.md +2 -2
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/voice-line/SKILL.md +9 -9
- package/library/skills/web-compatibility-look/resource.yaml +1 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
- package/library/skills/writing-plans/SKILL.md +4 -4
- package/library/skills/writing-skills/SKILL.md +8 -8
- package/library/tools/capture-gameplay/resource.yaml +73 -0
- package/library/tools/creator-publish/resource.yaml +4 -4
- package/library/tools/creator-releases/resource.yaml +5 -5
- package/library/tools/generate-image/resource.yaml +15 -1
- package/library/tools/publish-build/resource.yaml +6 -2
- package/package.json +1 -1
- package/registry/generated/aliases.json +1 -0
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +3 -1
- package/registry/generated/index.json +248 -135
- package/registry/generated/marketplace.claude.json +2 -2
- package/registry/generated/plugin.claude.json +4 -2
- package/registry/generated/plugin.codex.json +5 -3
- package/registry/generated/plugin.cursor.json +4 -2
- package/registry/generated/plugin.factory.json +4 -2
- package/registry/generated/skills-index.md +11 -9
- package/registry/generated/skills-registry.json +33 -6
- package/registry/schemas/domains.json +1 -1
|
@@ -5,14 +5,14 @@ license: MIT
|
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: character-controllers
|
|
7
7
|
user-invocable: false
|
|
8
|
-
template-id: template-3d-fps
|
|
8
|
+
template-id: template-3d-fps-old-school
|
|
9
9
|
allowed-tools: Read Grep summer_get_scene_tree summer_add_node summer_set_prop summer_set_resource_property summer_input_map_bind summer_save_scene summer_get_script_errors
|
|
10
10
|
paths: ["**/*.gd", "**/*.tscn"]
|
|
11
11
|
---
|
|
12
12
|
|
|
13
13
|
# FPS Controller for Summer Engine
|
|
14
14
|
|
|
15
|
-
The canonical first-person controller
|
|
15
|
+
The canonical first-person controller: coyote time, jump buffering, air control and external velocity. It follows the standard shipping FPS movement model (asymmetric gravity, grace timers, separate ground/air acceleration, an external force accumulator), so the player never says "this feels stiff" or "I jumped right at the edge and died unfairly".
|
|
16
16
|
|
|
17
17
|
## Scene Structure
|
|
18
18
|
|
|
@@ -24,7 +24,7 @@ Player (CharacterBody3D)
|
|
|
24
24
|
└── (optional) RayCast3D # ground / interaction probe
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
The Head/Camera split is the
|
|
27
|
+
The Head/Camera split is the standard: yaw rotates the body, pitch rotates only the head. Don't pitch the body or you get tilted capsules and slope-collision bugs.
|
|
28
28
|
|
|
29
29
|
## Step-by-Step Setup via MCP
|
|
30
30
|
|
|
@@ -48,7 +48,7 @@ summer_set_resource_property(scenePath="res://main.tscn", nodePath="./World/Play
|
|
|
48
48
|
summer_set_resource_property(scenePath="res://main.tscn", nodePath="./World/Player/Collision", resourceProperty="shape", subProperty="height", value="1.8")
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
Two
|
|
51
|
+
Two rules for these calls:
|
|
52
52
|
|
|
53
53
|
- **`scenePath` is required** on `summer_add_node`, `summer_set_prop`,
|
|
54
54
|
`summer_set_resource_property` and `summer_save_scene`. Omit it and the call
|
|
@@ -61,7 +61,7 @@ Two things the older version of this skill got wrong:
|
|
|
61
61
|
and external `.tres` resources take the same path. Structural failures are
|
|
62
62
|
explicit — `node not found`, `property is not a resource`, or `resource is
|
|
63
63
|
null` when the property was never assigned — but a bad value shape is silent
|
|
64
|
-
on current engines: a JSON object instead of
|
|
64
|
+
on current engines: a JSON object instead of an engine variant string, a
|
|
65
65
|
misspelled `key`/`subProperty`, or a wrong-typed value returns `ok:true` yet
|
|
66
66
|
no-ops or coerces destructively. Assign the resource first, pass class names
|
|
67
67
|
and `Vector3(...)`/`Color(...)` strings, and confirm in the saved `.tscn`,
|
|
@@ -234,18 +234,18 @@ func add_external_velocity(impulse: Vector3) -> void:
|
|
|
234
234
|
| `fall_gravity_multiplier` | `1.4` | Snappier descent than ascent (variable-jump-feel staple). |
|
|
235
235
|
| `ground_accel` / `ground_friction` | `80 / 90` | Crisp start, near-instant stop. |
|
|
236
236
|
| `air_accel` / `air_friction` | `25 / 5` | Reduced air control + minimal air drag. |
|
|
237
|
-
| `coyote_time` | `0.1` | Standard 0.08–0.15s grace — invisible to players,
|
|
237
|
+
| `coyote_time` | `0.1` | Standard 0.08–0.15s grace — invisible to players, removes most "unfair death" complaints. |
|
|
238
238
|
| `jump_buffer_time` | `0.1` | Same window the other direction. |
|
|
239
239
|
| `mouse_sensitivity` | `0.002` | Default raw multiplier; expose via settings. |
|
|
240
240
|
| `external_damping` | `8.0` | Knockback decays over ~0.5s. |
|
|
241
241
|
|
|
242
242
|
## Why Each Feature Matters
|
|
243
243
|
|
|
244
|
-
**Coyote time (~0.1s)** — Players judge ledges by what they see, not by frame-perfect collision. A small grace period after walking off a ledge where jump still works fixes the "I jumped right at the edge and died unfairly" complaint
|
|
244
|
+
**Coyote time (~0.1s)** — Players judge ledges by what they see, not by frame-perfect collision. A small grace period after walking off a ledge where jump still works fixes the "I jumped right at the edge and died unfairly" complaint. Cost: 3 lines. The usual window is 0.08–0.15s — short enough to be invisible, long enough to mask the imprecision of human reaction time.
|
|
245
245
|
|
|
246
246
|
**Jump buffering (~0.1s)** — Pressing jump 50ms before landing should not be punished. Buffer the input for ~0.1s and fire on touchdown. Without this, fast-moving players feel like the controller "ate their input" — they pressed jump, they saw nothing happen, they blame the game. With it, every "near-miss" jump becomes a successful one. Cost: 4 lines.
|
|
247
247
|
|
|
248
|
-
**Air control with reduced acceleration (~30% of ground)** — Zero air control feels like ice; the player commits to a direction at jump-takeoff and can't course-correct. Full air control feels
|
|
248
|
+
**Air control with reduced acceleration (~30% of ground)** — Zero air control feels like ice; the player commits to a direction at jump-takeoff and can't course-correct. Full air control feels weightless; momentum is meaningless and a strafe-jump cancels itself. The shipping FPS standard sits around 25–30% of ground accel: enough to course-correct mid-jump, not enough to cancel realistic momentum. The `move_toward` formulation lets designers tune this with one number — `air_accel` — without forking code.
|
|
249
249
|
|
|
250
250
|
**External velocity accumulator** — Knockback, explosions, jump pads, conveyor belts, wind volumes, and grapple-yanks must not fight player input. Storing them in a separate `external_velocity`, applying once per frame, and decaying via `move_toward(0, damping * delta)` means an explosion shoves the player and then control returns smoothly — no "stuck at terminal velocity" or "input cancels the punch" bugs. The subtract-previous-contribution trick (line 1 of `_physics_process`) is the production fix that prevents accumulation when the player is also sprinting; it's the kind of detail you only learn by shipping multiplayer. Public API (`add_external_velocity`) means any system — AOE attack, jump pad scene, grapple ability — can shove the player with one call, no coupling.
|
|
251
251
|
|
|
@@ -255,7 +255,7 @@ func add_external_velocity(impulse: Vector3) -> void:
|
|
|
255
255
|
|
|
256
256
|
Once the skeleton is in, designers tune by feel. Common targets:
|
|
257
257
|
|
|
258
|
-
**Snappy military shooter
|
|
258
|
+
**Snappy military shooter:**
|
|
259
259
|
- `walk_speed = 5.5`, `sprint_speed = 8.0`
|
|
260
260
|
- `ground_accel = 90`, `ground_friction = 100`
|
|
261
261
|
- `air_accel = 20`, `air_friction = 4`
|
|
@@ -284,14 +284,14 @@ The skeleton doesn't change — only the `@export` defaults. That's the point of
|
|
|
284
284
|
- **Pressing jump just before landing does nothing** — `_jump_buffer_timer` is being decremented to zero before the player touches floor. The buffer must NOT be cleared by anything except a successful jump.
|
|
285
285
|
- **Knockback compounds forever** — `_prev_external_applied` isn't being subtracted. Step 1 of `_physics_process` MUST run before gravity, or external impulses pile up frame after frame.
|
|
286
286
|
- **Knockback decays too fast / too slow** — tune `external_damping`. `8.0` decays a 5 m/s impulse to near-zero in ~0.6s. Lower = longer hangtime.
|
|
287
|
-
- **Air control feels like ice OR
|
|
287
|
+
- **Air control feels like ice OR weightless** — `air_accel` is the only knob. The usual range is 20–30% of `ground_accel`. Zero = ice. Equal = arcade-y.
|
|
288
288
|
- **Camera tilts on slopes** — pitch is on the body instead of the Head. Pitch only on `Head`; yaw only on `Player`.
|
|
289
289
|
- **Camera rolls when looking around** — you're calling `rotate_x` on something that's already rotated on Y. Fix: only ever rotate Y on Player and X on Head, never combine.
|
|
290
290
|
- **Mouse look doesn't work** — `Input.mouse_mode` isn't set to `MOUSE_MODE_CAPTURED`, or another node is consuming `_input` before this script. Use `_unhandled_input` to be a good citizen.
|
|
291
291
|
- **Mouse look feels laggy at low FPS** — sensitivity is being applied in `_physics_process`. Mouse-motion handling MUST stay in `_input` or `_unhandled_input` — those fire per-event, not per-physics-tick.
|
|
292
292
|
- **Falling through floor** — floor needs a StaticBody3D + CollisionShape3D on the same physics layer as the player.
|
|
293
293
|
- **Camera clipping geometry** — push `Camera.near` to ~0.05 or shrink the capsule radius slightly.
|
|
294
|
-
- **Player jitters on slopes / stairs** — enable `floor_snap_length = 0.5` and `floor_max_angle = 0.785` (~45°) on the CharacterBody3D. Out of scope for this skeleton
|
|
294
|
+
- **Player jitters on slopes / stairs** — enable `floor_snap_length = 0.5` and `floor_max_angle = 0.785` (~45°) on the CharacterBody3D. Out of scope for this skeleton.
|
|
295
295
|
|
|
296
296
|
## Networking Note
|
|
297
297
|
|
|
@@ -312,8 +312,8 @@ The skeleton is intentionally ~90 lines. When you outgrow it, add features by *l
|
|
|
312
312
|
- **Crouch.** Lerp the capsule height (e.g., 1.8 → 1.0) and the Head Y (1.6 → 0.9) over ~0.15s. Halve `walk_speed` while crouched. Block standing if a short upward shapecast hits ceiling.
|
|
313
313
|
- **Sprint FOV punch.** Tween `Camera.fov` from 75 → 82 over 0.2s when sprint starts, back when it ends. The single cheapest "feel of speed" effect available.
|
|
314
314
|
- **Slide.** When sprint + crouch are pressed together with horizontal speed above a threshold, lock direction to current velocity, set a `slide_timer`, and skip the wish-direction step. Apply slide-specific friction. Restore on timer expiry, ceiling clearance, or speed-below-threshold.
|
|
315
|
-
- **Wallrun, dash, double-jump.** Each is its own override state. Build a state machine (see `
|
|
316
|
-
- **Camera shake.** Add a `trauma` float on the camera, accumulate via `add_trauma(amount)`, decay each frame, apply a randomized rotation offset proportional to `trauma * trauma`. Subtract the previous frame's shake offset before applying the new one to prevent drift. See
|
|
315
|
+
- **Wallrun, dash, double-jump.** Each is its own override state. Build a state machine (see `gdscript-patterns`) and let each state run its own `_physics_process` branch with an early `move_and_slide()` return. Don't pile them as `if/elif` in a single function.
|
|
316
|
+
- **Camera shake.** Add a `trauma` float on the camera, accumulate via `add_trauma(amount)`, decay each frame, apply a randomized rotation offset proportional to `trauma * trauma`. Subtract the previous frame's shake offset before applying the new one to prevent drift. See `game-feel`.
|
|
317
317
|
|
|
318
318
|
Each of these is a separate skill or a separate function, not a fork of this script.
|
|
319
319
|
|
|
@@ -349,9 +349,10 @@ Then patch `project.godot` with the InputMap actions (`input/move_forward = { ..
|
|
|
349
349
|
|
|
350
350
|
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`?"
|
|
351
351
|
|
|
352
|
-
If the user asks for a "third-person FPS", flag the contradiction: FPS = first-person. Either clarify, or hand off to
|
|
352
|
+
If the user asks for a "third-person FPS", flag the contradiction: FPS = first-person. Either clarify, or hand off to `character-movement`, which has the third-person controller.
|
|
353
353
|
|
|
354
354
|
## See Also
|
|
355
355
|
|
|
356
|
-
- `
|
|
357
|
-
- `
|
|
356
|
+
- `gdscript-patterns` — once movement grows past this skeleton (slide, grapple, hover), refactor into a state machine instead of stuffing more branches into `_physics_process`.
|
|
357
|
+
- `character-movement` — 2D and third-person controllers.
|
|
358
|
+
- `game-feel` — camera shake and hit feedback.
|
|
@@ -20,8 +20,6 @@ related:
|
|
|
20
20
|
skills:
|
|
21
21
|
- skill/character-movement
|
|
22
22
|
- skill/camera-rigs
|
|
23
|
-
# Legacy frontmatter declared template-id: template-3d-fps (no such repo exists);
|
|
24
|
-
# mapped to the real repo template-3d-fps-old-school.
|
|
25
23
|
templates:
|
|
26
24
|
- template/3d-fps-old-school
|
|
27
25
|
source: official
|
|
@@ -9,7 +9,7 @@ allowed-tools: Read Grep Edit Write summer_write_file summer_read_file summer_ge
|
|
|
9
9
|
paths: ["**/*.gd", "**/*.tscn", "**/*.tres"]
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
# Game Feel — The Trio That Makes Hits Land
|
|
13
13
|
|
|
14
14
|
Particles do not make a game feel good. Screen shake alone does not either.
|
|
15
15
|
What makes a hit land is three systems firing on the same frame: a sub-frame
|
|
@@ -327,7 +327,7 @@ summer_connect_signal(scenePath="res://levels/world.tscn", emitter="./World/Enem
|
|
|
327
327
|
|
|
328
328
|
## Step 8 — Scaling intensity per hit weight
|
|
329
329
|
|
|
330
|
-
The
|
|
330
|
+
The same code makes a glancing parry feel different from a critical hit. Calibrate the curve once:
|
|
331
331
|
|
|
332
332
|
| Hit type | `damage` (HP) | trauma | duck amount |
|
|
333
333
|
|---|---|---|---|
|
|
@@ -343,7 +343,7 @@ Because trauma is squared inside the camera, the *felt* difference between 0.35
|
|
|
343
343
|
|
|
344
344
|
```
|
|
345
345
|
summer_save_scene(scenePath="res://levels/world.tscn")
|
|
346
|
-
summer_get_script_errors
|
|
346
|
+
summer_get_script_errors(path="res://scripts/vfx/hit_flash.gd") # repeat for each of the three scripts
|
|
347
347
|
summer_play
|
|
348
348
|
# user reproduces a hit
|
|
349
349
|
summer_get_debugger_errors # runtime errors from the tweens / bus lookups
|
|
@@ -391,7 +391,6 @@ This skill writes 3 GDScript files and adds 1 node + 1 autoload entry. Always as
|
|
|
391
391
|
version-sensitive API notes
|
|
392
392
|
- `../../references/collaborative-protocol/collaborative-protocol.md` — "May I write" pattern
|
|
393
393
|
- `../../references/gd-style/gd-style.md` — typed GDScript conventions
|
|
394
|
-
- `audio
|
|
395
|
-
- `
|
|
396
|
-
- `
|
|
397
|
-
- `visual-effects/hit-impact-flashes/SKILL.md` — flash material variations beyond white pulse
|
|
394
|
+
- `audio-direction` — bus layout setup (prerequisite for ducking)
|
|
395
|
+
- `vfx-hit-spark` — particles to layer on top of the trio
|
|
396
|
+
- `debugging-game-feel` — when the trio is installed and it still feels wrong
|
|
@@ -15,9 +15,9 @@ You are being invoked at the end (or middle) of a game-development session. Turn
|
|
|
15
15
|
|
|
16
16
|
Summer resolves skills in this order: the game project, then the user's agent skills directory, then the skills bundled with the Summer package. Pick the narrowest home that fits:
|
|
17
17
|
|
|
18
|
-
1. **The game project** (default). Write `SKILL.md` into the project-scoped skills directory of the agent you are running in: `.claude/skills/<slug>/` for Claude Code, `.agents/skills/<slug>/` for Codex,
|
|
18
|
+
1. **The game project** (default). Write `SKILL.md` into the project-scoped skills directory of the agent you are running in: `.claude/skills/<slug>/` for Claude Code, `.agents/skills/<slug>/` for Codex, Cursor, Devin Desktop and the other agents that read the shared folder. `summer skills install --scope project` shows the exact path for the current agent. Commit it with the game.
|
|
19
19
|
2. **The user's agent skills directory** when the lesson applies to every project on this machine (`~/.claude/skills/<slug>/`, `~/.agents/skills/<slug>/`). Do not edit skills that Summer installed there; they are overwritten on the next `summer setup`.
|
|
20
|
-
3. **The Summer library** when the lesson is general enough for every Summer user. Only possible inside a checkout of the summer
|
|
20
|
+
3. **The Summer library** when the lesson is general enough for every Summer user. Only possible inside a checkout of the `summerengine/summer` repository: add `library/skills/<slug>/resource.yaml` and `library/skills/<slug>/SKILL.md` (flat slugs, no category folders), then run `npm run generate:registry` and `npm run validate:library`. Everything under `registry/generated/` and every plugin manifest is generated from `library/`; never hand-edit them. Outside that checkout, send the lesson through `summer_library_feedback` (or `summer tool library-feedback`) with the id of the closest existing skill so the maintainers can fold it in.
|
|
21
21
|
|
|
22
22
|
Read the current project as ground truth. Working code from the real project beats invented examples.
|
|
23
23
|
|
|
@@ -32,7 +32,7 @@ Read the current project as ground truth. Working code from the real project bea
|
|
|
32
32
|
- A GDScript idiom that beat the obvious approach
|
|
33
33
|
- A UI layout that survived the design pass
|
|
34
34
|
- A bug, its root cause and the fix that was not in any docs
|
|
35
|
-
-
|
|
35
|
+
- An engine quirk (type inference, signal gotchas, plugin configuration)
|
|
36
36
|
- A spawning, AI or enemy pattern that worked
|
|
37
37
|
- A performance fix with measured before and after
|
|
38
38
|
- An asset workflow that beat the alternatives
|
|
@@ -11,7 +11,7 @@ paths: ["**/*.gd"]
|
|
|
11
11
|
|
|
12
12
|
# GDScript Patterns for Summer Engine
|
|
13
13
|
|
|
14
|
-
When writing GDScript for Summer Engine projects, follow these patterns. They
|
|
14
|
+
When writing GDScript for Summer Engine projects, follow these patterns. They match the engine's GDScript 4 conventions and work well with MCP scene operations.
|
|
15
15
|
|
|
16
16
|
## Type Hints
|
|
17
17
|
|
|
@@ -92,7 +92,7 @@ For health systems, input handling, and state machines, see [reference.md](refer
|
|
|
92
92
|
|
|
93
93
|
## Anti-patterns — introspection traps
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
The engine's introspection API has Object-instance methods that look like they should work on script-class references. They don't. Calling them on a `const ScriptName = preload(...)` reference is a parse error, not a runtime no-op.
|
|
96
96
|
|
|
97
97
|
| Wrong | Right | Why |
|
|
98
98
|
|---|---|---|
|
|
@@ -106,7 +106,7 @@ Godot's introspection API has Object-instance methods that look like they should
|
|
|
106
106
|
|
|
107
107
|
## Anti-pattern — `@onready var = $Path` on nodes that don't exist on every variant
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
The engine resolves `$Path` (the `get_node` shorthand) at `@implicit_ready` time. If the node is missing from the current scene, you get `Node not found: "X" (relative to "Y")` errors before any of your `_ready()` runtime guards can run.
|
|
110
110
|
|
|
111
111
|
Common case: a script is shared by multiple scene variants where some variants have an optional child. Even if every code path that touches the variable has a `if inventory_ui:` guard, the `@onready` line itself errors at scene load.
|
|
112
112
|
|
|
@@ -11,7 +11,7 @@ paths: ["**/*.tscn", "**/*.tres", "**/*.gd"]
|
|
|
11
11
|
|
|
12
12
|
# Generate Motion — Curated Meshy Library
|
|
13
13
|
|
|
14
|
-
Picks a clip from a **curated mocap library** by name and wires it onto a Meshy-rigged humanoid. Fast (~30s) and
|
|
14
|
+
Picks a clip from a **curated mocap library** by name and wires it onto a Meshy-rigged humanoid. Fast (~30s), and it looks good because it is real mocap. The five short aliases that always work are `idle`, `walk`, `run`, `jump`, `attack`; anything else must be an exact library name — see the Reference card before you invent one.
|
|
15
15
|
|
|
16
16
|
The target must be a **Meshy-rigged humanoid** — a `rigAssetId` from a prior `summer_generate_3d({ kind: "image-to-3d", imageUrl: "...", options: { rig: true } })` call. The result job includes `rigAssetId`. If the user points at a non-rigged mesh, stop and route to `asset-strategy` (or directly call `summer_generate_3d` with `options.rig: true`) before generating motion.
|
|
17
17
|
|
|
@@ -20,22 +20,6 @@ The target must be a **Meshy-rigged humanoid** — a `rigAssetId` from a prior `
|
|
|
20
20
|
> (`backend: "text-to-motion"`) when the server has it enabled; otherwise fall
|
|
21
21
|
> back to hand-authoring in Summer Engine or importing from Mixamo.
|
|
22
22
|
|
|
23
|
-
## Web Chat / Public Orchestrator Equivalent
|
|
24
|
-
|
|
25
|
-
In PublicSummerEngine chat, the equivalent direct tools are:
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
rigModel({ modelAssetId })
|
|
29
|
-
generateAnimation({ rigAssetId, animationName })
|
|
30
|
-
meshyJobStatus({ jobId })
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
If the character came from `createCharacter`, it may already be rigged and have `metadata.meshyRigTaskId`; generate animations directly against that rig asset. Verified animation names from the recovered production flow are `idle`, `walk`, `run`, `jump`, and `attack`. `fall` returned `invalid_animation`, so do not present it as a default.
|
|
34
|
-
|
|
35
|
-
Before generating clips in PublicSummerEngine chat, confirm the rig asset listing/status exposes `hasMeshyRigTask` or `animationsReady:true`. If `generateAnimation` returns `animations_preparing`, wait, poll/list the rig again, and retry; this is the post-rig setup catching up, not a reason to send the user to Studio.
|
|
36
|
-
|
|
37
|
-
After animation jobs complete, import the rig plus child animation assets together and wire them through `import-character`. Do not hand off to Studio unless the user asked for Studio/manual control or the direct chat tools fail.
|
|
38
|
-
|
|
39
23
|
## When to use this skill
|
|
40
24
|
|
|
41
25
|
- "Add a walk animation to the goblin."
|
|
@@ -64,7 +48,7 @@ The result must include `rigAssetId: <id>` on a Meshy rig. If it shows `rigAsset
|
|
|
64
48
|
|
|
65
49
|
### 2. Confirm with the user before spending
|
|
66
50
|
|
|
67
|
-
> I'm about to generate a "run" animation on `goblin_rigged` via meshy-library — about 30s,
|
|
51
|
+
> I'm about to generate a "run" animation on `goblin_rigged` via meshy-library — about 30s, and it uses credits. OK?
|
|
68
52
|
|
|
69
53
|
### 3. Call the tool
|
|
70
54
|
|
|
@@ -107,7 +91,7 @@ If the character will use multiple clips, leave the AnimationPlayer in place —
|
|
|
107
91
|
|
|
108
92
|
## Confirmation gates
|
|
109
93
|
|
|
110
|
-
- **Before generation:** state the motion name and
|
|
94
|
+
- **Before generation:** state the motion name and that it uses credits. Wait for OK.
|
|
111
95
|
- **Before attaching:** state which AnimationPlayer and which library slot. Wait for OK.
|
|
112
96
|
- **After generation:** if the user hasn't seen the preview, link `previewUrl` and ask "land or regenerate?" before wiring it into the scene.
|
|
113
97
|
|
|
@@ -129,9 +113,8 @@ nothing like a tidy snake_case scheme — real names look like `Walking_Woman`,
|
|
|
129
113
|
Plausible-looking names that do **not** resolve, verified against the resolver:
|
|
130
114
|
`attack_sword`, `hit_react`, `death`, `sprint`, `block`, `dodge_left`,
|
|
131
115
|
`crouch_idle`, `walk_back`, `run_strafe_left`, `jump_land`, `idle_combat`,
|
|
132
|
-
`wave`, `dance`, `sit_idle`. They return `null` and the call errors.
|
|
133
|
-
|
|
134
|
-
`attack`.
|
|
116
|
+
`wave`, `dance`, `sit_idle`. They return `null` and the call errors. For a sword
|
|
117
|
+
attack, use `attack`.
|
|
135
118
|
|
|
136
119
|
So: if the user asks for something outside the five aliases, do not guess a
|
|
137
120
|
snake_case name. Either use one of the five, quote an exact raw library name you
|
|
@@ -13,68 +13,61 @@ tags:
|
|
|
13
13
|
confidence: extracted
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
# Godogen-Style Autonomous Game Generation + Visual Proof QC in SummerEngine
|
|
17
16
|
|
|
18
|
-
|
|
17
|
+
# Godogen-Style Game Generation with Visual Proof QC in Summer Engine
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
## Outcome
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
Take a **short game description** and produce a **runnable, visually verified game**. The method comes from the open-source Godogen project: *judge the result from the running game, never from a clean compile*. Every iteration ends with a screenshot or short proof clip from the running game, and the host coding agent reviews those frames against the brief itself. There is no separate verifier model.
|
|
23
22
|
|
|
24
23
|
## When to Use
|
|
25
24
|
|
|
26
|
-
- Building complete small
|
|
27
|
-
-
|
|
28
|
-
- Unattended generation runs where the deliverable must include proof (15–20s recording) instead of "it compiled, trust me."
|
|
25
|
+
- Building a complete small game or prototype from a natural-language brief (mechanics, art style, camera and HUD in one prompt).
|
|
26
|
+
- The agent says the game works but never looked at it running. You need an agent that *sees* the running game and reports concrete visual defects.
|
|
27
|
+
- Unattended generation runs where the deliverable must include proof (a 15–20s recording) instead of "it compiled, trust me."
|
|
29
28
|
- Asset generation for the game (references, textures, 3D models, animated sprites) as part of the same pipeline.
|
|
30
29
|
|
|
31
30
|
## When NOT to Use
|
|
32
31
|
|
|
33
|
-
- Hand-authored, large-scope production work
|
|
34
|
-
-
|
|
35
|
-
- Quick
|
|
36
|
-
|
|
37
|
-
## Core Principles (extracted)
|
|
38
|
-
|
|
39
|
-
1. **godogen → game repo → game.** The generator itself is not a game. You publish a thin scaffold into a fresh game repo; the agent then builds the actual game *inside* that repo from a short engine guide.
|
|
40
|
-
|
|
41
|
-
2. **Thin runtime, smart agent.** The published repo is intentionally minimal: one engine-agnostic runtime manifest (`prompts/runtime.md`), a one-page per-engine guide (`engines/godot.md`), and a single cross-engine asset-generation skill (`asset-gen/`). The model plans, scaffolds, and decomposes the work itself — there are no planner/decomposer/architecture skill files anymore (dropped 2026-07-02).
|
|
42
|
-
|
|
43
|
-
3. **Proof over claims.** "The agent judges results from the running game (a live URL or a recorded clip), not from a clean compile, so visible defects drive the next iteration."
|
|
32
|
+
- Hand-authored, large-scope production work. This is a generator loop, not a replacement for deliberate design iteration.
|
|
33
|
+
- No GPU capture path. The QC loop is worthless if frames come from a software renderer (see Failure Modes).
|
|
34
|
+
- Quick logic fixes with no visual component. Running and capturing is overhead there.
|
|
44
35
|
|
|
45
|
-
|
|
36
|
+
## Core Principles (from Godogen)
|
|
46
37
|
|
|
47
|
-
|
|
38
|
+
1. **Generator repo → game repo → game.** The generator itself is not a game. It publishes a thin scaffold into a fresh game repo; the agent then builds the actual game *inside* that repo from a short engine guide.
|
|
39
|
+
2. **Thin runtime, smart agent.** The published repo is minimal: one runtime manifest (`prompts/runtime.md`), a one-page engine guide, and one asset-generation skill (`asset-gen/`). The model plans, scaffolds and decomposes the work itself; there are no planner or architecture skill files.
|
|
40
|
+
3. **Proof over claims.** The agent judges results from the running game (a live build or a recorded clip), not from a clean compile, so visible defects drive the next iteration.
|
|
41
|
+
4. **The host agent verifies from captured frames.** Godogen dropped a separate verification model because it added no signal. One strong coding agent looking at real screenshots is enough.
|
|
42
|
+
5. **Two involvement modes, chosen by how the task is framed.** Watch the live game and steer at decision points, or run unattended and receive a 15–20s proof recording at the end, watched back before done.
|
|
43
|
+
6. **Engine-specific runtime traps live in the engine guide.** Defects that survive a compile but fail at runtime are written down where the agent reads them during the run.
|
|
48
44
|
|
|
49
|
-
|
|
45
|
+
## Mapping to Summer Engine
|
|
50
46
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
| Godogen concept | SummerEngine adaptation |
|
|
47
|
+
| Godogen concept | Summer Engine equivalent |
|
|
54
48
|
|---|---|
|
|
55
|
-
|
|
|
56
|
-
| `prompts/runtime.md` manifest |
|
|
57
|
-
|
|
|
58
|
-
| `asset-gen/` skill |
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
62
|
-
**Language note:** Godogen generates Godot games in **C#/.NET** (migrated from GDScript on 2026-04-06) because `dotnet build` gives a cheap, reliable compile gate. If SummerEngine stays GDScript, you need an equivalent cheap gate — e.g. `godot --headless --check-only` script parsing — before the visual stage, since the whole point is: compile gate first, *then* visual proof, never one instead of the other.
|
|
49
|
+
| Publish step that renders the agent files into a game repo | `summer create <template>` plus the installed Summer skills; `.summer/` holds the brief (`GameSoul.md`) and build plan |
|
|
50
|
+
| `prompts/runtime.md` manifest | `.summer/build-plan.md`: delivery contract and involvement mode |
|
|
51
|
+
| One-page engine guide | A project skill with capture recipes, runtime traps and scene conventions (`gameskill` captures new traps) |
|
|
52
|
+
| `asset-gen/` skill | `asset-strategy` and the Summer generation tools |
|
|
53
|
+
| Compile gate (`dotnet build` for C#) | `summer_get_script_errors` per file, then `summer_get_diagnostics` |
|
|
54
|
+
| Proof recording (ffmpeg + xvfb) | `summer_play`, `summer_screenshot target:"game"`, `summer_game_probe`; frame sequences from a `RunVerification` probe's `save_frame`; optional ffmpeg clip |
|
|
63
55
|
|
|
64
|
-
|
|
56
|
+
**Language note:** Godogen generates C# games because `dotnet build` is a cheap, reliable compile gate. Summer games use GDScript, so the gate is `summer_get_script_errors` on each changed file. The order is the point: compile gate first, *then* visual proof, never one instead of the other.
|
|
65
57
|
|
|
66
|
-
|
|
58
|
+
## Repo Shape
|
|
67
59
|
|
|
68
60
|
```
|
|
69
61
|
my-summer-game/
|
|
70
|
-
├── AGENTS.md # host-agent entry
|
|
71
|
-
├──
|
|
72
|
-
├──
|
|
62
|
+
├── AGENTS.md # host-agent entry
|
|
63
|
+
├── .summer/
|
|
64
|
+
│ ├── GameSoul.md # the brief
|
|
65
|
+
│ └── build-plan.md # delivery contract + involvement mode
|
|
73
66
|
└── .agents/skills/
|
|
74
|
-
└──
|
|
67
|
+
└── <project-guide>/ # capture recipes, runtime traps, conventions
|
|
75
68
|
```
|
|
76
69
|
|
|
77
|
-
In-
|
|
70
|
+
In-game capture harness, for runs outside the editor:
|
|
78
71
|
|
|
79
72
|
```
|
|
80
73
|
Main (Node)
|
|
@@ -85,9 +78,9 @@ Main (Node)
|
|
|
85
78
|
# saves PNGs to user://proof/ on trigger
|
|
86
79
|
```
|
|
87
80
|
|
|
88
|
-
## Capture Harness (GDScript
|
|
81
|
+
## Capture Harness (GDScript)
|
|
89
82
|
|
|
90
|
-
|
|
83
|
+
Godogen's own capture code is not public; this is an adaptation. Inside a Summer session, prefer `summer_screenshot target:"game"` and `RunVerification` frames, and use this autoload for unattended runs outside the editor.
|
|
91
84
|
|
|
92
85
|
```gdscript
|
|
93
86
|
extends Node
|
|
@@ -135,89 +128,78 @@ func _on_frame_post_draw() -> void:
|
|
|
135
128
|
pass # hook if you need exact-frame capture timing
|
|
136
129
|
```
|
|
137
130
|
|
|
138
|
-
|
|
131
|
+
Encode the PNG sequence (resolve `user://` to its absolute path first):
|
|
139
132
|
|
|
140
133
|
```bash
|
|
141
|
-
ffmpeg -framerate 2 -i
|
|
134
|
+
ffmpeg -framerate 2 -i <user_dir>/proof/%03d_rec.png -c:v libx264 -pix_fmt yuv420p proof.mp4
|
|
142
135
|
```
|
|
143
136
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
## The Visual QC Loop (the core deliverable)
|
|
137
|
+
Unattended Linux runs need a real display for real rendering: run the engine under `xvfb-run -a`.
|
|
147
138
|
|
|
148
|
-
|
|
139
|
+
## The Visual QC Loop
|
|
149
140
|
|
|
150
141
|
```
|
|
151
142
|
1. BUILD/EDIT agent applies a change to the game
|
|
152
|
-
2. COMPILE GATE
|
|
153
|
-
3. RUN + CAPTURE
|
|
143
|
+
2. COMPILE GATE summer_get_script_errors on changed files, then summer_get_diagnostics
|
|
144
|
+
3. RUN + CAPTURE summer_play, then capture frames at defined triggers
|
|
154
145
|
4. SELF-REVIEW host agent inspects captured frames against the brief
|
|
155
146
|
5. DEFECT LIST structured findings: {location, expected, observed, severity}
|
|
156
147
|
6. DECIDE no blocking defects → go to 7; else → back to 1 with the list
|
|
157
|
-
7. PROOF 15–20s recording,
|
|
148
|
+
7. PROOF 15–20s recording, watched back before done
|
|
158
149
|
```
|
|
159
150
|
|
|
160
151
|
Rules that make it work:
|
|
161
152
|
|
|
162
|
-
- **Bounded.** Hard cap on rounds (see Tunables).
|
|
163
|
-
- **Same agent verifies.** Do not add a separate verifier model
|
|
164
|
-
- **Defects must be visible.** The review
|
|
165
|
-
- **Engine traps belong in the guide.** Recurring "survives compile, fails at runtime" defects
|
|
153
|
+
- **Bounded.** Hard cap on rounds (see Tunables). The run closes with a proof recording; it does not iterate forever.
|
|
154
|
+
- **Same agent verifies.** Do not add a separate verifier model. Godogen tried it and dropped it.
|
|
155
|
+
- **Defects must be visible.** The review asks for concrete visual observations tied to the brief ("character sprite missing; brief asks for chunky iconic sprites"), not "looks wrong".
|
|
156
|
+
- **Engine traps belong in the guide.** Recurring "survives compile, fails at runtime" defects go into the project guide so the agent reads them before they happen again.
|
|
166
157
|
|
|
167
|
-
## Asset Generation
|
|
168
|
-
|
|
169
|
-
| Need | Tool | Notes |
|
|
170
|
-
|---|---|---|
|
|
171
|
-
| Precise references & characters | Gemini (`GOOGLE_API_KEY`, google-genai) | high-fidelity image generation |
|
|
172
|
-
| Textures & simple objects | xAI Grok (`XAI_API_KEY`) | image/video generation |
|
|
173
|
-
| Image-to-3D, rigged biped animation | Tripo3D (`TRIPO3D_API_KEY`) | 3D conversion |
|
|
174
|
-
| Animated sprites | Grok video → frame extraction (ffmpeg) → loop detection → background removal | BiRefNet multi-signal matting (since 2026-03-25); imagemagick for resize/flip/crop |
|
|
158
|
+
## Asset Generation
|
|
175
159
|
|
|
176
|
-
|
|
160
|
+
Godogen calls external image, video and image-to-3D providers with their own API keys, then cuts animated sprites from generated video (frame extraction, loop detection, background removal, imagemagick for resize and crop). In Summer, route asset work through `asset-strategy` and the Summer generation tools (`summer_generate_image`, `summer_generate_3d`, `summer_generate_video`) instead of wiring provider keys into the project.
|
|
177
161
|
|
|
178
162
|
## Implementation Steps
|
|
179
163
|
|
|
180
|
-
1. **Write the thin runtime
|
|
181
|
-
2. **Set up
|
|
182
|
-
3. **
|
|
183
|
-
4. **
|
|
184
|
-
5. **
|
|
185
|
-
6. **
|
|
186
|
-
7. **Support both involvement modes**:
|
|
187
|
-
8. **Optionally move runs to a server**: tmux/screen for long sessions, GPU instance for faster render+capture, remote-control interface to steer mid-run.
|
|
164
|
+
1. **Write the thin runtime**: the brief in `.summer/GameSoul.md`, the delivery contract and involvement mode in `.summer/build-plan.md`, and a one-page project guide (how to run, how to capture, known runtime traps). Grow the guide every time a defect survives the compile gate.
|
|
165
|
+
2. **Set up capture**: inside a Summer session, `summer_play` plus `summer_screenshot target:"game"`. For unattended Linux runs, add xvfb, ffmpeg and vulkan-tools, and check the GPU path with `vulkaninfo --summary`. A software-renderer fallback on a GPU host is a misconfiguration to fix before trusting any QC frame.
|
|
166
|
+
3. **Add `ProofCapture`** (GDScript above) as an autoload when capturing outside the editor; wire triggers to scene-loaded, state-changed and recording mode.
|
|
167
|
+
4. **Run the compile gate** before every capture round.
|
|
168
|
+
5. **Run the QC loop**: capture → self-review → structured defect list → fix → re-capture, capped at `max_qc_rounds`. The review receives the original brief plus the latest frames and outputs findings in a fixed JSON shape.
|
|
169
|
+
6. **Close with proof**: after the loop passes, record 15–20s, encode with ffmpeg, and have the agent watch the clip back before declaring done.
|
|
170
|
+
7. **Support both involvement modes**: for an open-ended task, show the live game early and checkpoint at taste, scope and cost decisions; for a finished brief, run unattended and close with proof.
|
|
188
171
|
|
|
189
172
|
## Tunables
|
|
190
173
|
|
|
191
|
-
| Parameter | Meaning |
|
|
174
|
+
| Parameter | Meaning | Reference value |
|
|
192
175
|
|---|---|---|
|
|
193
|
-
| `max_qc_rounds` | hard cap on capture→fix iterations | bounded
|
|
176
|
+
| `max_qc_rounds` | hard cap on capture→fix iterations | bounded, never open-ended |
|
|
194
177
|
| Proof clip length | recording at the end of a run | 15–20 s |
|
|
195
|
-
| Capture triggers | when screenshots fire (scene load / state change / timer) |
|
|
196
|
-
| Record fps | frame rate of the QC strip | 2 fps is enough for review
|
|
197
|
-
| Verification model | which agent reviews frames | host agent itself
|
|
178
|
+
| Capture triggers | when screenshots fire (scene load / state change / timer) | defined in the project guide |
|
|
179
|
+
| Record fps | frame rate of the QC strip | 2 fps is enough for review |
|
|
180
|
+
| Verification model | which agent reviews frames | the host agent itself; no separate verifier |
|
|
198
181
|
| Involvement mode | live-steered vs unattended | chosen by task framing |
|
|
199
182
|
|
|
200
183
|
## Failure Modes & Gotchas
|
|
201
184
|
|
|
202
|
-
- **Trusting a clean compile.** The
|
|
203
|
-
- **Software-renderer frames.** SwiftShader
|
|
204
|
-
- **Unbounded verification loops.** Without `max_qc_rounds` the agent iterates forever on taste-level nitpicks. Close with proof
|
|
205
|
-
- **Adding a separate verifier model.** Godogen tried
|
|
206
|
-
- **Capturing before the frame settles.** Grab the viewport after `frame_post_draw
|
|
207
|
-
- **
|
|
208
|
-
- **
|
|
209
|
-
- **Stale claims.** The X post mentions "850+ GDScript classes" language reference, but the project migrated to C# in April 2026 — verify current repo state before copying specifics.
|
|
185
|
+
- **Trusting a clean compile.** The compile gate is necessary, never sufficient.
|
|
186
|
+
- **Software-renderer frames.** SwiftShader, llvmpipe and lavapipe output looks wrong and misleads the QC loop. On a GPU host it means the capture path is misconfigured.
|
|
187
|
+
- **Unbounded verification loops.** Without `max_qc_rounds` the agent iterates forever on taste-level nitpicks. Close with proof.
|
|
188
|
+
- **Adding a separate verifier model.** Godogen tried it and found no extra signal.
|
|
189
|
+
- **Capturing before the frame settles.** Grab the viewport after `frame_post_draw` or a short delay, or screenshots show half-rendered scenes and produce false defects.
|
|
190
|
+
- **Headless noise.** Headless runs can print harmless RID warnings on quit. Do not let the QC loop treat engine noise as defects.
|
|
191
|
+
- **An all-black screenshot** usually means the viewport had not redrawn. Recapture before calling it a defect.
|
|
210
192
|
|
|
211
193
|
## Verification
|
|
212
194
|
|
|
213
|
-
Not
|
|
195
|
+
Not yet verified in Summer Engine. To validate an implementation:
|
|
214
196
|
|
|
215
|
-
1.
|
|
216
|
-
2. Run a small
|
|
217
|
-
3.
|
|
197
|
+
1. Scaffold a project and confirm the agent builds a runnable game from the brief and the one-page guide alone.
|
|
198
|
+
2. Run a small brief end to end; confirm the pipeline produces a running build, not just code.
|
|
199
|
+
3. Introduce a visible defect (a broken sprite, a missing material); confirm the self-review finds it from captured frames and fixes it within the round cap.
|
|
218
200
|
4. Confirm the run closes with a 15–20s proof clip that the agent reviews before marking done.
|
|
219
|
-
5. Confirm the compile gate runs before every capture round and that frames come from hardware rendering
|
|
201
|
+
5. Confirm the compile gate runs before every capture round and that frames come from hardware rendering.
|
|
220
202
|
|
|
221
203
|
## Confidence
|
|
222
204
|
|
|
223
|
-
`extracted
|
|
205
|
+
`extracted`. The architecture (thin runtime, manifest, engine guide, asset-gen), proof over claims, self-verification from captured frames, the dropped verifier model, the C# rationale, the capture tooling and the two involvement modes come from Godogen's public README, CHANGELOG and setup notes. The `ProofCapture` script, the QC-loop JSON protocol and the Summer mapping are adaptations; Godogen's internal prompt and guide files are not public.
|
|
@@ -9,7 +9,6 @@ use_when:
|
|
|
9
9
|
- "set up headless capture so an unattended generation run ends with a 15-20 second proof clip"
|
|
10
10
|
do_not_use_when:
|
|
11
11
|
- "large hand-authored production work, purely logical code fixes with no visual component, or hosts with no GPU or headless capture path"
|
|
12
|
-
- "intake from the gamedev-knowledge pipeline (source-cited, pipeline-validated, not yet exercised in-engine by the Summer team) — verify results in the engine as you would any technique"
|
|
13
12
|
facets:
|
|
14
13
|
lifecycle:
|
|
15
14
|
- build
|