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
|
@@ -22,21 +22,19 @@ Every project goes through this process. A todo list, a single-function utility,
|
|
|
22
22
|
You MUST create a task for each of these items and complete them in order:
|
|
23
23
|
|
|
24
24
|
1. **Explore project context** — check files, docs, recent commits
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
2. **Ask clarifying questions** — one at a time, understand purpose/constraints/success criteria
|
|
26
|
+
3. **Propose 2-3 approaches** — with trade-offs and your recommendation
|
|
27
|
+
4. **Present design** — in sections scaled to their complexity, get user approval after each section
|
|
28
|
+
5. **Write design doc** — save to `.summer/specs/YYYY-MM-DD-<topic>-design.md` in the game project and commit
|
|
29
|
+
6. **Spec self-review** — quick inline check for placeholders, contradictions, ambiguity, scope (see below)
|
|
30
|
+
7. **User reviews written spec** — ask user to review the spec file before proceeding
|
|
31
|
+
8. **Transition to implementation** — invoke writing-plans skill to create implementation plan
|
|
32
32
|
|
|
33
33
|
## Process Flow
|
|
34
34
|
|
|
35
35
|
```dot
|
|
36
36
|
digraph brainstorming {
|
|
37
37
|
"Explore project context" [shape=box];
|
|
38
|
-
"Visual questions ahead?" [shape=diamond];
|
|
39
|
-
"Offer Visual Companion\n(own message, no other content)" [shape=box];
|
|
40
38
|
"Ask clarifying questions" [shape=box];
|
|
41
39
|
"Propose 2-3 approaches" [shape=box];
|
|
42
40
|
"Present design sections" [shape=box];
|
|
@@ -46,10 +44,7 @@ digraph brainstorming {
|
|
|
46
44
|
"User reviews spec?" [shape=diamond];
|
|
47
45
|
"Invoke writing-plans skill" [shape=doublecircle];
|
|
48
46
|
|
|
49
|
-
"Explore project context" -> "
|
|
50
|
-
"Visual questions ahead?" -> "Offer Visual Companion\n(own message, no other content)" [label="yes"];
|
|
51
|
-
"Visual questions ahead?" -> "Ask clarifying questions" [label="no"];
|
|
52
|
-
"Offer Visual Companion\n(own message, no other content)" -> "Ask clarifying questions";
|
|
47
|
+
"Explore project context" -> "Ask clarifying questions";
|
|
53
48
|
"Ask clarifying questions" -> "Propose 2-3 approaches";
|
|
54
49
|
"Propose 2-3 approaches" -> "Present design sections";
|
|
55
50
|
"Present design sections" -> "User approves design?";
|
|
@@ -62,7 +57,7 @@ digraph brainstorming {
|
|
|
62
57
|
}
|
|
63
58
|
```
|
|
64
59
|
|
|
65
|
-
**The terminal state is invoking writing-plans.** Do NOT invoke
|
|
60
|
+
**The terminal state is invoking writing-plans.** Do NOT invoke any implementation skill. The ONLY skill you invoke after brainstorming is writing-plans.
|
|
66
61
|
|
|
67
62
|
## The Process
|
|
68
63
|
|
|
@@ -109,7 +104,6 @@ digraph brainstorming {
|
|
|
109
104
|
|
|
110
105
|
- Write the validated design (spec) to `.summer/specs/YYYY-MM-DD-<topic>-design.md` in the game project
|
|
111
106
|
- (User preferences for spec location override this default)
|
|
112
|
-
- Use elements-of-style:writing-clearly-and-concisely skill if available
|
|
113
107
|
- Commit the design document to git
|
|
114
108
|
|
|
115
109
|
**Spec Self-Review:**
|
|
@@ -16,11 +16,11 @@ confidence: extracted
|
|
|
16
16
|
|
|
17
17
|
## Outcome
|
|
18
18
|
|
|
19
|
-
A 2D character controller for
|
|
19
|
+
A 2D character controller for Summer Engine that reproduces the tuning architecture and forgiveness mechanics of Celeste's player movement: momentum-based running with distinct ground/air acceleration, variable-height jumping with coyote time, a multi-directional dash with cooldown and residual speed, wall interaction (jump, slide, climb with stamina), and pixel-scale corner corrections that make near-miss inputs succeed instead of fail.
|
|
20
20
|
|
|
21
21
|
## When to Use
|
|
22
22
|
|
|
23
|
-
- Building a precision 2D platformer in
|
|
23
|
+
- Building a precision 2D platformer in Summer Engine where movement feel is the core gameplay.
|
|
24
24
|
- Porting or prototyping Celeste-style mechanics (dash, wall jump, climb stamina).
|
|
25
25
|
- Tuning an existing platformer controller that feels "unfair" or unresponsive — the forgiveness systems below are the primary fix.
|
|
26
26
|
|
|
@@ -28,9 +28,9 @@ Do not use for: 3D character controllers, physics-driven (RigidBody) movement, o
|
|
|
28
28
|
|
|
29
29
|
## Core Principle
|
|
30
30
|
|
|
31
|
-
Celeste's movement is a **single controller class driven by an explicit integer state machine**, with all feel-critical numbers as a **flat compile-time constants table** at the top of the class. The
|
|
31
|
+
Celeste's movement is a **single controller class driven by an explicit integer state machine**, with all feel-critical numbers as a **flat compile-time constants table** at the top of the class. The released source (`Player.cs`, 5,471 lines) defines states `Normal=0, Climb=1, Dash=2, Swim=3, Boost=4, RedDash=5, HitSquash=6, Launch=7, Pickup=8, DreamDash=9` (+ a Summit state), each with Begin/Update/End callbacks. State transitions are direct integer assignments.
|
|
32
32
|
|
|
33
|
-
The second principle: **forgiveness at the pixel and millisecond scale**. The code repeatedly nudges the player 2–6 pixels or grants 50–200 ms windows so that inputs which are *almost* correct still succeed.
|
|
33
|
+
The second principle: **forgiveness at the pixel and millisecond scale**. The code repeatedly nudges the player 2–6 pixels or grants 50–200 ms windows so that inputs which are *almost* correct still succeed. Most of the "tight" feel comes from these windows.
|
|
34
34
|
|
|
35
35
|
## Tuning Constants (verbatim from Player.cs)
|
|
36
36
|
|
|
@@ -133,7 +133,7 @@ Celeste's units are pixels/second for speeds and pixels/second² for acceleratio
|
|
|
133
133
|
| DuckWindMult | 0 (ducking negates wind) |
|
|
134
134
|
| SpacePhysicsMult | 0.6 (low-gravity zones) |
|
|
135
135
|
|
|
136
|
-
## Scene / Node Shape
|
|
136
|
+
## Scene / Node Shape
|
|
137
137
|
|
|
138
138
|
```
|
|
139
139
|
Player (CharacterBody2D)
|
|
@@ -300,7 +300,7 @@ func _probe_wall() -> int:
|
|
|
300
300
|
return 0
|
|
301
301
|
```
|
|
302
302
|
|
|
303
|
-
The skeleton above is a structural translation
|
|
303
|
+
The skeleton above is a structural translation to GDScript, not a line-by-line port of the per-frame update bodies in `Player.cs`. The constants, state IDs, and confirmed behaviors (corner correction loops, variable-jump window logic, forced wall-jump timers, stamina costs, squish safety) are extracted directly from the source.
|
|
304
304
|
|
|
305
305
|
## Confirmed Behavioral Patterns to Replicate
|
|
306
306
|
|
|
@@ -322,7 +322,7 @@ The skeleton above is a structural translation for Godot; the exact per-frame up
|
|
|
322
322
|
6. Implement dash with 8-way aim, cooldown, residual EndDashSpeed, and corner correction.
|
|
323
323
|
7. Implement climb stamina with the three cost rates and tired threshold.
|
|
324
324
|
8. Add forgiveness pass: upward corner correction on jump, dash nudges, jump-through assist, wall speed retention, squish-safety cascade.
|
|
325
|
-
9. Rescale units if
|
|
325
|
+
9. Rescale units if your game's pixels-per-meter differs from Celeste's native resolution: preserve ratios (e.g., DashSpeed ≈ 2.67× MaxRun; RunAccel ≈ 11× MaxRun).
|
|
326
326
|
|
|
327
327
|
## Tunables
|
|
328
328
|
|
|
@@ -358,9 +358,4 @@ After implementing, test each forgiveness system explicitly:
|
|
|
358
358
|
|
|
359
359
|
## Confidence
|
|
360
360
|
|
|
361
|
-
`extracted` — All tuning values, state IDs, and confirmed behavioral patterns
|
|
362
|
-
|
|
363
|
-
## Evidence
|
|
364
|
-
|
|
365
|
-
- sources/web/celeste-player-cs/source.md — primary source record: constants tables, state machine, confirmed behavioral snippets, retrieval limitations.
|
|
366
|
-
- sources/x/valigo-celeste-movement/source.md — originating post and primary-source identification.
|
|
361
|
+
`extracted` — All tuning values, state IDs, and confirmed behavioral patterns come from Celeste's publicly released `Player.cs`. Where the skeleton fills in standard platformer patterns (for example jump-cut-on-release), it is a structural translation, not extracted code. Not yet verified inside Summer Engine.
|
|
@@ -9,7 +9,7 @@ use_when:
|
|
|
9
9
|
- "my 2D platformer controller feels unfair or unresponsive"
|
|
10
10
|
do_not_use_when:
|
|
11
11
|
- "3D character controllers, physics-driven RigidBody movement, or games that want floaty arcade jump physics over momentum precision"
|
|
12
|
-
- "
|
|
12
|
+
- "you need an in-engine verified controller — this one is source-cited but not yet exercised in Summer Engine; verify results in the engine before relying on it"
|
|
13
13
|
facets:
|
|
14
14
|
lifecycle:
|
|
15
15
|
- build
|
|
@@ -172,7 +172,7 @@ func run(ctx):
|
|
|
172
172
|
|
|
173
173
|
That is the mechanism; a full audio-synced viseme timeline is `facial-and-lipsync`. Bone-track keyframes work the same way through `animate()` v2 — `ctx.animate(character, "Skeleton3D:Head/rotation", keys, "nod")` creates a proper bone rotation track (the helper owns the quaternion conversion; never hand-build quaternion tracks).
|
|
174
174
|
|
|
175
|
-
## Step 6 — Root motion
|
|
175
|
+
## Step 6 — Root motion
|
|
176
176
|
|
|
177
177
|
Meshy/mocap locomotion clips translate the root bone forward (Meshy `run` moves ~5m per cycle). Two valid setups — **pick one, never both**:
|
|
178
178
|
|
|
@@ -185,7 +185,7 @@ Root motion CANNOT be judged from the editor state. Playtest it: `summer_play`,
|
|
|
185
185
|
|
|
186
186
|
## Raw lane — the same wiring on older engines
|
|
187
187
|
|
|
188
|
-
Every class above is script-bound; `ctx.anim_state_machine` is convenience, not capability. The raw locomotion wiring
|
|
188
|
+
Every class above is script-bound; `ctx.anim_state_machine` is convenience, not capability. The raw locomotion wiring:
|
|
189
189
|
|
|
190
190
|
```gdscript
|
|
191
191
|
func run(ctx):
|
|
@@ -11,31 +11,21 @@ paths: ["assets/characters/**", "assets/models/**", "**/*.tscn", "**/*.gd"]
|
|
|
11
11
|
|
|
12
12
|
# Character Model — T-Pose to Rigged Humanoid, Gated
|
|
13
13
|
|
|
14
|
-
This is the
|
|
14
|
+
This is the canonical auto-rig pipeline. It produces a humanoid `.glb` with a skeleton that `generate-motion` can drive directly. The work is two paid passes with a **mandatory user-review gate between them**: the rig pass costs more credits and locks the topology, so the user must see the un-rigged preview and approve it first.
|
|
15
15
|
|
|
16
16
|
The whole flow:
|
|
17
17
|
|
|
18
18
|
```
|
|
19
|
-
1. T-pose reference image → summer_generate_image (
|
|
20
|
-
2. Un-rigged 3D mesh → summer_generate_3d(image-to-3d) (
|
|
19
|
+
1. T-pose reference image → summer_generate_image (~10s)
|
|
20
|
+
2. Un-rigged 3D mesh → summer_generate_3d(image-to-3d) (~60s)
|
|
21
21
|
3. ── USER REVIEW GATE ──
|
|
22
|
-
4. Rigged .glb → summer_generate_3d(image-to-3d, rig=true) (
|
|
22
|
+
4. Rigged .glb → summer_generate_3d(image-to-3d, rig=true) (~90s)
|
|
23
23
|
5. Import → editor RESTART → wire as CharacterBody3D / Node3D
|
|
24
24
|
6. Hand off to generate-motion for clips
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
The animation skill (`generate-motion`) requires a rigged humanoid; a static `.glb` won't drive motion.
|
|
28
28
|
|
|
29
|
-
## Web Chat / Public Orchestrator Equivalent
|
|
30
|
-
|
|
31
|
-
When this skill is running inside the PublicSummerEngine chat orchestrator, use the chat-native tools directly instead of sending the user to Studio:
|
|
32
|
-
|
|
33
|
-
```
|
|
34
|
-
generateImage -> createCharacter -> checkGenerationStatus/meshyJobStatus -> listUserAssets readiness -> rigModel if needed -> generateAnimation -> meshyJobStatus -> importAssets -> import-character
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Use Studio only when the user explicitly asks for visual/manual picking or when chat-side generation fails. The recovered working flow used `createCharacter`, confirmed the rig had `hasMeshyRigTask` or `animationsReady:true`, then generated `idle`, `walk`, `run`, `jump`, and `attack`, imported the rig plus child animation GLBs into `res://characters/<slug>/`, then wired playback from the imported GLB AnimationPlayers/libraries. If `generateAnimation` returns `animations_preparing`, wait, poll/list the rig asset again, and retry instead of routing to Studio. Keep this path repeatable for "animated character", "3D character with animations", "walking enemy", and similar prompts.
|
|
38
|
-
|
|
39
29
|
## When to use
|
|
40
30
|
|
|
41
31
|
- "Make a knight character for the player to control."
|
|
@@ -121,11 +111,11 @@ Before paying for the rig pass, surface the un-rigged mesh:
|
|
|
121
111
|
|
|
122
112
|
> Un-rigged knight mesh ready: `res://assets/characters/knight_unrigged.glb` (~12k tris, [preview link]).
|
|
123
113
|
>
|
|
124
|
-
> Next step is the **rig pass** (
|
|
114
|
+
> Next step is the **rig pass** (uses credits, ~90s). It locks the topology and adds a skeleton compatible with `generate-motion`. Once you approve I'll run it.
|
|
125
115
|
>
|
|
126
116
|
> **Approve the mesh and proceed to rig?** Or regenerate the mesh first (different prompt, different polycount, different model)?
|
|
127
117
|
|
|
128
|
-
If the user wants changes, loop back to step 1 or 2. Do NOT silently run the rig pass — it
|
|
118
|
+
If the user wants changes, loop back to step 1 or 2. Do NOT silently run the rig pass — it spends more credits and locks the design.
|
|
129
119
|
|
|
130
120
|
### 4. Run the rig pass
|
|
131
121
|
|
|
@@ -205,17 +195,16 @@ The imported `.glb` includes its own `Skeleton3D` and `AnimationPlayer` (empty l
|
|
|
205
195
|
|
|
206
196
|
### 7. Hand off to animation
|
|
207
197
|
|
|
208
|
-
> Knight is wired at `./World/Knight` with
|
|
198
|
+
> Knight is wired at `./World/Knight` with an auto-rigged skeleton. `rigAssetId` saved.
|
|
209
199
|
>
|
|
210
200
|
> Next: `generate-motion` to add idle / walk / run / attack
|
|
211
201
|
> clips. Example call: `summer_generate_motion(rigAssetId: "<saved id>",
|
|
212
|
-
> backend: "meshy-library", motionName: "walk")`.
|
|
213
|
-
>
|
|
214
|
-
> licensed clip.
|
|
202
|
+
> backend: "meshy-library", motionName: "walk")`. For custom actions, use
|
|
203
|
+
> `text-to-motion` (`backend: "text-to-motion"`).
|
|
215
204
|
|
|
216
205
|
## Anti-patterns
|
|
217
206
|
|
|
218
|
-
- **Skipping the user-review gate.**
|
|
207
|
+
- **Skipping the user-review gate.** Spends the rig credits, locks the design, and removes the user's chance to course-correct cheaply.
|
|
219
208
|
- **Generating the mesh from a non-T-pose image.** Locomotion will look broken (inverted knees, snapped elbows). Always re-pose first.
|
|
220
209
|
- **Forgetting the editor restart.** Animations will appear to bind successfully but play to a stale skeleton — the character T-poses motionless. The fix is always restart, never code.
|
|
221
210
|
- **Wrapping a cinematic NPC in CharacterBody3D.** Wastes physics ticks; use Node3D.
|
|
@@ -225,7 +214,7 @@ The imported `.glb` includes its own `Skeleton3D` and `AnimationPlayer` (empty l
|
|
|
225
214
|
|
|
226
215
|
## Edge cases
|
|
227
216
|
|
|
228
|
-
- **Multiple characters share a silhouette.** Generate the rig once, then re-skin via texture swap (cheaper than re-rigging)
|
|
217
|
+
- **Multiple characters share a silhouette.** Generate the rig once, then re-skin via texture swap (cheaper than re-rigging): generate a new albedo and assign it as a material override.
|
|
229
218
|
- **Character has wings, tail, extra limbs.** Meshy's humanoid rig only weights the standard skeleton — extras sag. Either prompt them as static (e.g. cape held by physics in-engine) or hand-rig in Blender post-export.
|
|
230
219
|
- **Child / dwarf / giant.** Generate at correct proportions in the T-pose; the rig retargets cleanly. Locomotion clips from `generate-motion` will retarget but stride length needs `playback_speed` tuning on the AnimationPlayer.
|
|
231
220
|
- **First-person hands-only character.** Generate just hands + forearms in T-pose; rig pass still works. See `fps-controller` for first-person wiring.
|
|
@@ -233,20 +222,20 @@ The imported `.glb` includes its own `Skeleton3D` and `AnimationPlayer` (empty l
|
|
|
233
222
|
|
|
234
223
|
## Fallback (no MCP)
|
|
235
224
|
|
|
236
|
-
1. Generate the T-pose reference
|
|
237
|
-
2.
|
|
225
|
+
1. Generate the T-pose reference in the Summer dashboard.
|
|
226
|
+
2. Run image-to-3D with rigging enabled in the Summer dashboard.
|
|
238
227
|
3. Download the `.glb`.
|
|
239
228
|
4. Drop into `res://assets/characters/`; Summer Engine's Import dock picks it up.
|
|
240
229
|
5. Restart the editor.
|
|
241
230
|
6. Wire as CharacterBody3D / Node3D in Summer Engine manually.
|
|
242
231
|
|
|
243
|
-
The output
|
|
232
|
+
The output matches the MCP path — same skeleton, same compatibility with `generate-motion` (which has its own dashboard fallback).
|
|
244
233
|
|
|
245
234
|
## Handoff
|
|
246
235
|
|
|
247
236
|
After the rigged character is wired:
|
|
248
237
|
|
|
249
|
-
> `Knight` is at `./World/Knight` with
|
|
238
|
+
> `Knight` is at `./World/Knight` with an auto-rigged skeleton. Next:
|
|
250
239
|
> - **Animations:** `generate-motion` for idle / walk / run / attack. Pass the `rigAssetId` returned in step 4.
|
|
251
240
|
> - **State machine:** after a few clips exist, `animation-tree` for idle → walk → run blends.
|
|
252
241
|
> - **Player input:** if this is the player, wire WASD + mouse via `fps-controller` or a third-person controller skill.
|
|
@@ -207,7 +207,7 @@ integration handed off for a playtest, not an incomplete one.
|
|
|
207
207
|
Referencing an unbound action is a silent no-op that reads as "controls dead".
|
|
208
208
|
5. Compile-check, then run and watch it move. Feel is a user call, not a still frame.
|
|
209
209
|
|
|
210
|
-
## 2D side-scroller controller
|
|
210
|
+
## 2D side-scroller controller
|
|
211
211
|
|
|
212
212
|
```gdscript
|
|
213
213
|
extends CharacterBody2D
|
|
@@ -84,7 +84,7 @@ Set its `collision_mask` to your Level layer only (not the player).
|
|
|
84
84
|
Third-person differences from FPS:
|
|
85
85
|
- Mouse motion rotates the `CameraController` (orbit), not the body.
|
|
86
86
|
- The visual wrapper rotates to face the MOVEMENT direction, decoupled from the camera.
|
|
87
|
-
Because imported characters face
|
|
87
|
+
Because imported characters face the engine forward `-Z`, lerp
|
|
88
88
|
`CharacterRotationRoot.rotation.y` toward `atan2(-direction.x, -direction.z)`.
|
|
89
89
|
- Rotate only `CharacterRotationRoot.rotation.y`. Do not yaw the CharacterBody3D or add a
|
|
90
90
|
compensating 180-degree model rotation. The package already normalizes forward to `-Z`.
|
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 2d-assets
|
|
7
7
|
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url summer_set_resource_property
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url summer_set_prop summer_set_resource_property
|
|
9
9
|
paths: ["assets/**", "art/portraits/**", "ui/portraits/**"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -62,7 +62,7 @@ background: muted painterly gradient, dark teal to deep brown, no scene detail
|
|
|
62
62
|
style: semi-realistic painterly, soft edges, oil-painting feel
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
Note there is no aspect line. `summer_generate_image` has no size or aspect argument — every MCP image comes back at the server's 1:1 default. Bust framing reads fine square
|
|
65
|
+
Note there is no aspect line. `summer_generate_image` has no size or aspect argument — every MCP image comes back at the server's 1:1 default. Bust framing reads fine square; if the cast needs true portrait framing, generate in the Summer dashboard (which exposes aspect ratio) and bring the results back with `summer_import_from_url`, or crop after. Whichever you pick, do it for the *whole* cast — mixed aspect is as visible as mixed lighting.
|
|
66
66
|
|
|
67
67
|
Every subsequent portrait in this cast appends the anchor to the prompt verbatim. **Do not edit the anchor mid-cast** unless the user explicitly says "I want the new ones to look different."
|
|
68
68
|
|
|
@@ -86,7 +86,7 @@ The character description should include: identity (age, build, hair, distinctiv
|
|
|
86
86
|
|
|
87
87
|
### 4. Confirm and call
|
|
88
88
|
|
|
89
|
-
> Generating Aria the witch portrait — 1 image
|
|
89
|
+
> Generating Aria the witch portrait — 1 image (uses credits), model nano-banana-2, anchor locked from `.summer/portrait-anchor.md`. OK?
|
|
90
90
|
|
|
91
91
|
```
|
|
92
92
|
summer_generate_image(
|
|
@@ -96,7 +96,7 @@ summer_generate_image(
|
|
|
96
96
|
)
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
`style: "none"` because the anchor's "semi-realistic painterly" already specifies style.
|
|
99
|
+
`style: "none"` because the anchor's "semi-realistic painterly" already specifies style. Only `cartoon` and `anime` append anything to the prompt, and `realistic` / `none` append nothing — any other value is coerced to `none`. So the preset cannot "fight" a painterly anchor; it just does nothing either way, and every bit of the look has to be in the prompt.
|
|
100
100
|
|
|
101
101
|
`options={ image_size: ... }` is dropped without an error — see the anchor note above.
|
|
102
102
|
|
|
@@ -13,7 +13,7 @@ paths: ["assets/video/**", "cinematics/**", "trailers/**"]
|
|
|
13
13
|
|
|
14
14
|
A cutscene is a non-interactive video clip the game plays back at a fixed moment — opening, story beat, character intro, ending. Quality is dominated by **two things**: continuity (the character on screen looks like the character in the game) and shot length (every clip past 10s drifts in identity, hands, and physics). This skill enforces both — generate a reference image first to lock the look, then image-to-video each shot, then chain shots in sequence rather than asking the model for one long take.
|
|
15
15
|
|
|
16
|
-
If the user wants 5 seconds of marketing footage, that's `
|
|
16
|
+
If the user wants 5 seconds of marketing footage, that's `trailer-shot`. If they want a seamless background loop, that's `animated-loop`. This skill is for narrative beats with a defined start, middle, and end — usually with dialogue or VO.
|
|
17
17
|
|
|
18
18
|
## When to use
|
|
19
19
|
|
|
@@ -26,10 +26,10 @@ If the user wants 5 seconds of marketing footage, that's `video/trailer-shot`. I
|
|
|
26
26
|
|
|
27
27
|
## When NOT to use
|
|
28
28
|
|
|
29
|
-
- "5-second slow-mo combat shot for the trailer" — `
|
|
30
|
-
- "Looping splash screen background" — `
|
|
31
|
-
- "Animated logo backdrop on the title screen" — `
|
|
32
|
-
- Real-time in-engine cinematic with the actual gameplay characters and camera — that's
|
|
29
|
+
- "5-second slow-mo combat shot for the trailer" — `trailer-shot`.
|
|
30
|
+
- "Looping splash screen background" — `animated-loop`.
|
|
31
|
+
- "Animated logo backdrop on the title screen" — `animated-loop`.
|
|
32
|
+
- Real-time in-engine cinematic with the actual gameplay characters and camera — that's an AnimationPlayer job, not generated video. Route to `scene-composition`.
|
|
33
33
|
- Voice-only narration over a static image — generate the dialogue with `summer_generate_audio` and use a static `TextureRect`, no video needed.
|
|
34
34
|
|
|
35
35
|
## Steps
|
|
@@ -51,7 +51,7 @@ Cutscenes longer than 10 seconds are **multiple shots**, not one take. Ask the u
|
|
|
51
51
|
|
|
52
52
|
> Want this as one 10s shot, or three shots (e.g. wide → close on face → reaction)? Each shot is 5-10s. I'll generate a reference image once, then image-to-video each shot off of it.
|
|
53
53
|
|
|
54
|
-
Default if the user is vague: **3 shots, 5s each,
|
|
54
|
+
Default if the user is vague: **3 shots, 5s each, on kling**. Confirm before spending credits.
|
|
55
55
|
|
|
56
56
|
### 3. Lock the look — generate a reference image first
|
|
57
57
|
|
|
@@ -66,19 +66,19 @@ summer_generate_image(
|
|
|
66
66
|
|
|
67
67
|
`summer_generate_image` has no size or aspect argument — `options.image_size` is dropped without an error and every MCP image comes back at the server's 1:1 default. Ask for the framing in the prompt, or generate the reference in the Summer dashboard (which exposes aspect ratio) and pass its URL. For image-to-video this matters more than usual: the clip's framing is inherited from the reference, so a square reference gives you a square cutscene.
|
|
68
68
|
|
|
69
|
-
Show the user the still and confirm it's the right look before video-ing it. Regenerating a
|
|
69
|
+
Show the user the still and confirm it's the right look before video-ing it. Regenerating a still costs far less than regenerating a video.
|
|
70
70
|
|
|
71
71
|
### 4. Pick the model
|
|
72
72
|
|
|
73
73
|
**This skill always passes `imageUrl`, which puts every call on the image-to-video route — and that route only accepts three models.** `kling-turbo` and `veo3` are text-to-video only; asking for either with an `imageUrl` set is a 400 `invalid_model`, not a silent downgrade.
|
|
74
74
|
|
|
75
|
-
| Model | i2v? |
|
|
76
|
-
|
|
77
|
-
| `ltx` | yes |
|
|
78
|
-
| `kling` | yes |
|
|
79
|
-
| `minimax` | yes |
|
|
80
|
-
| `kling-turbo` | **no** |
|
|
81
|
-
| `veo3` | **no** |
|
|
75
|
+
| Model | i2v? | Speed | When |
|
|
76
|
+
|---|---|---|---|
|
|
77
|
+
| `ltx` | yes | ~30s | Iteration, blocking shots, B-roll, throwaway tests |
|
|
78
|
+
| `kling` | yes | 2-4 min | Hero shots, character cutscenes, anything the player will sit and watch |
|
|
79
|
+
| `minimax` | yes | 2-3 min | Stylized / anime-leaning content; better at non-photoreal looks than kling |
|
|
80
|
+
| `kling-turbo` | **no** | 1-2 min | Text-to-video only — usable only if you drop the reference image |
|
|
81
|
+
| `veo3` | **no** | 3-5 min | Text-to-video only — usable only if you drop the reference image |
|
|
82
82
|
|
|
83
83
|
Default policy: **`ltx` first** to validate the prompt and shot framing. If it lands the composition but quality is rough, escalate to `kling`. `veo3` is a real tradeoff, not an upgrade: reaching for it means giving up `imageUrl`, which is the one thing that holds character identity across shots. Take that trade only when on-camera lip-sync matters more than continuity, and only with the user's approval on cost.
|
|
84
84
|
|
|
@@ -112,13 +112,13 @@ When the job completes, show the user the URL and ask:
|
|
|
112
112
|
|
|
113
113
|
### 6. Generate dialogue audio (if the scene has dialogue)
|
|
114
114
|
|
|
115
|
-
Cutscene dialogue is TTS, not in the video model. The video model can render mouth motion that *looks* like talking, but the audio comes from `summer_generate_audio`. Generate it separately and
|
|
115
|
+
Cutscene dialogue is TTS, not in the video model. The video model can render mouth motion that *looks* like talking, but the audio comes from `summer_generate_audio`. Generate it separately and an AnimationPlayer or your `cinematics/` controller scene syncs them.
|
|
116
116
|
|
|
117
117
|
```
|
|
118
118
|
summer_generate_audio(
|
|
119
119
|
capability="text_to_speech",
|
|
120
120
|
text="They'll come for you at dawn. Run while you can.",
|
|
121
|
-
voiceId="<from audio bible — see
|
|
121
|
+
voiceId="<from audio bible — see voice-line>"
|
|
122
122
|
)
|
|
123
123
|
```
|
|
124
124
|
|
|
@@ -134,7 +134,7 @@ VideoStream exts: ["ogv", "tres", "res"]
|
|
|
134
134
|
ERROR: No loader found for resource: res://clip.mp4 (expected type: unknown)
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
Nothing transcodes for you — `summer_import_from_url` downloads the bytes, runs
|
|
137
|
+
Nothing transcodes for you — `summer_import_from_url` downloads the bytes, runs the engine's import pipeline, and *fails the import* if the file never becomes a loadable resource. Convert with ffmpeg or DaVinci before importing:
|
|
138
138
|
|
|
139
139
|
```
|
|
140
140
|
ffmpeg -i intro_shot_01.mp4 -c:v libtheora -q:v 8 -an intro_shot_01.ogv
|
|
@@ -167,16 +167,16 @@ For dialogue, add an `AudioStreamPlayer` sibling with the TTS clip and call `pla
|
|
|
167
167
|
|
|
168
168
|
Pattern: `<subject> + <action> + <camera move> + <lighting> + <stylistic anchor>`. Keep prompts under 50 words; over-prompting confuses the model. Always pair with `imageUrl` to lock the character.
|
|
169
169
|
|
|
170
|
-
| Goal | Model | Prompt |
|
|
171
|
-
|
|
172
|
-
| Opening establishing shot | `kling` | `wide shot of a fog-shrouded medieval village at dawn, slow dolly-in toward the church spire, warm low sun, cinematic, anamorphic lens flare` |
|
|
173
|
-
| Character intro (hero turns to camera) | `kling` | `young witch with raven on shoulder turns slowly toward camera, candlelit interior, shallow depth of field, cinematic film still` |
|
|
174
|
-
| Dialogue close-up (no synced lips) | `kling` | `close-up of a grizzled knight, eyes downcast then looking up, firelight on his face, dust motes, 16mm film grain` |
|
|
175
|
-
| Dialogue close-up (synced lips) | `veo3` — text-to-video only, drop `imageUrl` | `close-up of the witch saying "they will come for you at dawn", candlelight, cinematic, shallow DOF` |
|
|
176
|
-
| Action beat (village burns) | `kling` | `medium wide of a thatched village engulfed in flames at night, embers rising, silhouettes running through smoke, hand-held camera, cinematic` |
|
|
177
|
-
| Ending shot (hero walks away) | `kling` | `low wide shot of a cloaked figure walking away across a blasted plain at sunset, slow truck-back, golden hour, dust on the wind` |
|
|
178
|
-
| Throwaway iteration / blocking | `ltx` | same prompt as above |
|
|
179
|
-
| Anime / stylized cutscene | `minimax` | `anime-style young swordsman draws blade and steps forward, sakura petals, dramatic wind, Studio Ghibli soft painterly` |
|
|
170
|
+
| Goal | Model | Prompt | Duration |
|
|
171
|
+
|---|---|---|---|
|
|
172
|
+
| Opening establishing shot | `kling` | `wide shot of a fog-shrouded medieval village at dawn, slow dolly-in toward the church spire, warm low sun, cinematic, anamorphic lens flare` | 5s |
|
|
173
|
+
| Character intro (hero turns to camera) | `kling` | `young witch with raven on shoulder turns slowly toward camera, candlelit interior, shallow depth of field, cinematic film still` | 5s |
|
|
174
|
+
| Dialogue close-up (no synced lips) | `kling` | `close-up of a grizzled knight, eyes downcast then looking up, firelight on his face, dust motes, 16mm film grain` | 5s |
|
|
175
|
+
| Dialogue close-up (synced lips) | `veo3` — text-to-video only, drop `imageUrl` | `close-up of the witch saying "they will come for you at dawn", candlelight, cinematic, shallow DOF` | 5s |
|
|
176
|
+
| Action beat (village burns) | `kling` | `medium wide of a thatched village engulfed in flames at night, embers rising, silhouettes running through smoke, hand-held camera, cinematic` | 5s |
|
|
177
|
+
| Ending shot (hero walks away) | `kling` | `low wide shot of a cloaked figure walking away across a blasted plain at sunset, slow truck-back, golden hour, dust on the wind` | 5s |
|
|
178
|
+
| Throwaway iteration / blocking | `ltx` | same prompt as above | 5s |
|
|
179
|
+
| Anime / stylized cutscene | `minimax` | `anime-style young swordsman draws blade and steps forward, sakura petals, dramatic wind, Studio Ghibli soft painterly` | 5s |
|
|
180
180
|
|
|
181
181
|
### Bad prompts and why
|
|
182
182
|
|
|
@@ -193,7 +193,7 @@ Pattern: `<subject> + <action> + <camera move> + <lighting> + <stylistic anchor>
|
|
|
193
193
|
- **Generating a 10s shot when you should chain two 5s shots.** Identity, hand consistency, and physics drift every additional second past ~6s. Two 5s shots cut together look better and cost the same.
|
|
194
194
|
- **Skipping the reference image.** Generating four character cutscenes from text prompts alone produces four different-looking people. Always lock the look with `summer_generate_image` first, then `imageUrl` every subsequent video call.
|
|
195
195
|
- **Asking the video model to render dialogue without `veo3`.** `kling` and `ltx` will animate mouths but the motion does not match any audio. Use `veo3` if dialogue is on-camera, or keep the camera off the speaker.
|
|
196
|
-
- **Using `kling` for blocking iterations.**
|
|
196
|
+
- **Using `kling` for blocking iterations.** Validate framing and prompt on the cheaper `ltx` first; move to `kling` once the composition lands.
|
|
197
197
|
- **Putting the cutscene on a `VideoStreamPlayer` without a fade.** Cuts straight from gameplay to video are jarring. Always wrap in a `ColorRect` fade in/out.
|
|
198
198
|
- **Treating `summer_generate_video` as synchronous.** It returns `{ queued: true, jobId }` and no URL. You must poll `summer_check_job` before there is anything to show or import.
|
|
199
199
|
- **Importing the `.mp4` as-is.** The engine has no MP4 or WebM loader — only Ogg Theora (`.ogv`). Transcode first; an un-transcoded import fails and is rolled back.
|
|
@@ -210,7 +210,7 @@ Pattern: `<subject> + <action> + <camera move> + <lighting> + <stylistic anchor>
|
|
|
210
210
|
|
|
211
211
|
## Fallback (no MCP)
|
|
212
212
|
|
|
213
|
-
If the
|
|
213
|
+
If the MCP server isn't running, the user can do all of this in the Summer dashboard:
|
|
214
214
|
|
|
215
215
|
1. Generate a reference image in the Image tab.
|
|
216
216
|
2. Open the Video tab, paste the reference URL into the image-to-video field.
|
|
@@ -224,17 +224,17 @@ Print the exact prompt + model + duration + aspect ratio so the user can paste i
|
|
|
224
224
|
Once the cutscene is generated and wired:
|
|
225
225
|
|
|
226
226
|
> Cutscene `intro` wired at `cinematics/Intro.tscn` with fade in/out and `Video.finished` chained to scene change. Next:
|
|
227
|
-
> - Add the dialogue track with `
|
|
228
|
-
> - Score the moment with `
|
|
227
|
+
> - Add the dialogue track with `voice-line` if you haven't yet.
|
|
228
|
+
> - Score the moment with `music-track` — a cutscene without music feels like a placeholder.
|
|
229
229
|
> - For the boss reveal cutscene, run this skill again with the same reference image to keep the witch identity stable.
|
|
230
|
-
> - If you want a 5s "money shot" version for marketing, run `
|
|
230
|
+
> - If you want a 5s "money shot" version for marketing, run `trailer-shot` against the same reference.
|
|
231
231
|
|
|
232
232
|
## See also
|
|
233
233
|
|
|
234
|
-
- `
|
|
235
|
-
- `
|
|
236
|
-
- `
|
|
237
|
-
- `
|
|
238
|
-
- `
|
|
239
|
-
- `
|
|
234
|
+
- `trailer-shot` — marketing footage, 5-10s, maximum visual punch.
|
|
235
|
+
- `animated-loop` — seamless looping background clips.
|
|
236
|
+
- `voice-line` — TTS dialogue used inside cutscenes.
|
|
237
|
+
- `music-track` — score the cutscene.
|
|
238
|
+
- `concept-art` — generate the reference image axis if no character reference exists yet.
|
|
239
|
+
- `character-portrait` — produce a high-fidelity locked character portrait for use as `imageUrl`.
|
|
240
240
|
- `../../references/mcp-tools-reference/mcp-tools-reference.md` — `summer_generate_video` parameter schema and error codes.
|
|
@@ -11,7 +11,7 @@ paths: ["**/*.gd", "**/*.tscn"]
|
|
|
11
11
|
|
|
12
12
|
# Combat Basics
|
|
13
13
|
|
|
14
|
-
The
|
|
14
|
+
The standard combat pattern is hitbox + hurtbox + health, wired by signals. Build it
|
|
15
15
|
component-first: the same three pieces work for player, enemies, and destructibles.
|
|
16
16
|
|
|
17
17
|
## The layer model (set this up first)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: compatibility-renderer-traps
|
|
3
|
+
description: "Make a Forward+ Summer game also look right on the Compatibility renderer: instance-uniform budget, black MultiMesh colors, sRGB vertex colors."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: rendering-and-lighting
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Edit Write summer_project_setting summer_get_script_errors
|
|
9
|
+
paths: ["**/*.gdshader", "**/*.gdshaderinc", "**/*.gd", "project.godot"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Forward+ and Compatibility without surprises
|
|
13
|
+
|
|
14
|
+
Games built on Forward+ can end up on the Compatibility renderer (OpenGL): phones where Metal/Vulkan is
|
|
15
|
+
unavailable, weak GPUs, or a project that picks it for battery. The failures are silent: no error, just
|
|
16
|
+
black fruit, pale colors, or objects that stop animating after the first few hundred. Each trap below
|
|
17
|
+
comes with its fix and the reason.
|
|
18
|
+
|
|
19
|
+
## 1. Know which renderer you actually got
|
|
20
|
+
|
|
21
|
+
- Phones use `rendering/renderer/rendering_method.mobile`, which defaults to `mobile`, not Forward+.
|
|
22
|
+
Set it explicitly.
|
|
23
|
+
- A device can fall back to another renderer when it lacks a capability. Trust the renderer name printed
|
|
24
|
+
at startup (or `RenderingServer.get_current_rendering_method()`), not the project setting.
|
|
25
|
+
- Preview Compatibility on your computer:
|
|
26
|
+
`<summer> --path . --rendering-method gl_compatibility`.
|
|
27
|
+
|
|
28
|
+
## 2. The traps
|
|
29
|
+
|
|
30
|
+
| Symptom on Compatibility | Cause | Fix |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| Objects past roughly the 250th stop growing, lose color or read as default | GLES3 reserves 16 `instance uniform` slots per instance out of 4096, so only about 256 instances in the whole scene can use them. Beyond that, values silently read 0. | Don't use `instance uniform` for anything numerous. Put per-instance state in a one-instance MultiMesh's `INSTANCE_CUSTOM` (a vec4), or bake it into mesh vertex colors. |
|
|
33
|
+
| Fruit/flowers render solid black | GLES3 multiplies `COLOR` by the MultiMesh instance color, which is 0 when `use_colors` is off. | Enable `use_colors` and set every instance color to white, or don't read `COLOR` in that path. |
|
|
34
|
+
| Everything looks pastel on Forward+ (saturated on Compatibility) | Forward+ shades in linear space, Compatibility in sRGB. Colors you bake into vertex `COLOR` or hard-code into `ALBEDO` are usually sRGB. | Convert once, only where needed: `if (!OUTPUT_IS_SRGB) col = to_linear(col);` with the helper below (the shading language has no built-in `srgb_to_linear`). Or pass colors as `uniform vec3 c : source_color`, which converts for you. |
|
|
35
|
+
| Whole scene pale/lime on Compatibility while Forward+ looks right | Tonemap, glow and ambient respond differently. | Keep a Compatibility branch of your lighting profile (lower ambient and exposure) and check both. |
|
|
36
|
+
| Foliage glows white | Glow threshold too low for bright leaves. | Raise the glow HDR threshold (~1.5) and keep bloom near 0. |
|
|
37
|
+
|
|
38
|
+
Everything the player must see (ripe crop, enemy, pickup) must stay readable without glow, SSR,
|
|
39
|
+
volumetric fog or other Forward+-only effects: use shape, color and icons too.
|
|
40
|
+
|
|
41
|
+
The helper (standard sRGB curve):
|
|
42
|
+
|
|
43
|
+
```glsl
|
|
44
|
+
vec3 to_linear(vec3 c) {
|
|
45
|
+
return mix(pow((c + vec3(0.055)) * (1.0 / 1.055), vec3(2.4)), c * (1.0 / 12.92), lessThan(c, vec3(0.04045)));
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 3. Keep one shader path
|
|
50
|
+
|
|
51
|
+
Write shaders in plain spatial math: vertex-color ramps, simple rim terms, no custom `light()` unless
|
|
52
|
+
you test it on both renderers. One path for both renderers means one set of bugs and no drift.
|
|
53
|
+
|
|
54
|
+
## 4. Verify, don't assume
|
|
55
|
+
|
|
56
|
+
1. Render the same scene on Forward+ and `gl_compatibility` offscreen:
|
|
57
|
+
`<summer> --audio-driver Dummy --summer-offscreen --path . --resolution 1600x900 -s res://tools/capture.gd -- --out=<dir>`
|
|
58
|
+
(add `--rendering-method gl_compatibility` for the second run).
|
|
59
|
+
2. Read both images side by side, and include a stress shot with many instances (the 256 limit only shows
|
|
60
|
+
at scale).
|
|
61
|
+
3. Grep the log for `SCRIPT ERROR`, `SHADER ERROR` and `ERROR:`. A shader that fails to compile still lets
|
|
62
|
+
the capture exit 0 and draws the object untextured, so a missing grep hides the failure.
|
|
63
|
+
4. If later captures repeat the same frame, the offscreen run froze (it happens when another engine
|
|
64
|
+
renders at the same time). Check with `md5 -r *.png` and rerun alone.
|
|
65
|
+
|
|
66
|
+
## Common mistakes
|
|
67
|
+
|
|
68
|
+
- Checking only the project setting and calling it "Forward+ on phones".
|
|
69
|
+
- Using `instance uniform` for per-plant or per-tile state.
|
|
70
|
+
- Reading `COLOR` from a MultiMesh without instance colors.
|
|
71
|
+
- Testing Compatibility with ten objects when the game shows five hundred.
|
|
72
|
+
- Budgeting one run per fix: every look change needs two captures (one per renderer). Plan runs in pairs.
|
|
73
|
+
|
|
74
|
+
## See also
|
|
75
|
+
|
|
76
|
+
- `web-compatibility-look` (a finished look when the game only runs on Compatibility, as on the web)
|
|
77
|
+
- `3d-lighting` (lighting profiles)
|
|
78
|
+
- `bounded-engine-runs` (safe offscreen capture runs)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
id: skill/compatibility-renderer-traps
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Make a Forward+ Summer game also look right on the Compatibility renderer: instance-uniform budget, black MultiMesh colors, sRGB vertex colors."
|
|
5
|
+
use_when:
|
|
6
|
+
- a game must run on phones or weak GPUs that may use the Compatibility or Mobile renderer
|
|
7
|
+
- objects render black, pale or stop animating on one renderer but not another
|
|
8
|
+
- writing shaders for many instances (crops, foliage, tiles) that must work everywhere
|
|
9
|
+
facets:
|
|
10
|
+
lifecycle:
|
|
11
|
+
- build
|
|
12
|
+
domains:
|
|
13
|
+
- rendering
|
|
14
|
+
- performance
|
|
15
|
+
modalities:
|
|
16
|
+
- shaders
|
|
17
|
+
- scripts
|
|
18
|
+
compatibility:
|
|
19
|
+
engine: ">=4.6"
|
|
20
|
+
related:
|
|
21
|
+
skills:
|
|
22
|
+
- skill/web-compatibility-look
|
|
23
|
+
- skill/3d-lighting
|
|
24
|
+
- skill/bounded-engine-runs
|
|
25
|
+
source: official
|
|
26
|
+
license: MIT
|
|
27
|
+
status: preview
|
|
28
|
+
recommended: true
|