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.
Files changed (293) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +4 -2
  3. package/.codex-plugin/plugin.json +5 -3
  4. package/.cursor-plugin/plugin.json +4 -2
  5. package/.factory-plugin/plugin.json +4 -2
  6. package/.opencode/INSTALL.md +8 -8
  7. package/.opencode/plugins/summer.js +2 -2
  8. package/AGENTS.md +7 -7
  9. package/CHANGELOG.md +50 -0
  10. package/GEMINI.md +1 -1
  11. package/NOTICE +1 -1
  12. package/README.md +32 -35
  13. package/assets/api-docs.json.gz +0 -0
  14. package/assets/autopilot/run.sh +2 -2
  15. package/assets/navigation/web-routes.json +1 -1
  16. package/commands/gameskill.md +2 -2
  17. package/commands/summer.md +25 -25
  18. package/dist/cli/commands/install.d.ts +10 -0
  19. package/dist/cli/commands/install.js +55 -10
  20. package/dist/cli/commands/open.d.ts +1 -1
  21. package/dist/cli/commands/run.d.ts +1 -1
  22. package/dist/cli/commands/run.js +1 -1
  23. package/dist/cli/commands/skills.js +2 -2
  24. package/dist/cli/commands/tool.d.ts +7 -0
  25. package/dist/cli/commands/tool.js +36 -1
  26. package/dist/core/api-client.d.ts +5 -6
  27. package/dist/core/api-client.js +12 -15
  28. package/dist/core/auth.js +2 -2
  29. package/dist/core/capabilities/asset-import.d.ts +0 -1
  30. package/dist/core/capabilities/camera-view.d.ts +1 -1
  31. package/dist/core/capabilities/camera-view.js +2 -2
  32. package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
  33. package/dist/core/capabilities/capture-gameplay.js +283 -0
  34. package/dist/core/capabilities/connect-signal.d.ts +1 -2
  35. package/dist/core/capabilities/connect-signal.js +1 -2
  36. package/dist/core/capabilities/console-read.d.ts +2 -2
  37. package/dist/core/capabilities/console-read.js +2 -2
  38. package/dist/core/capabilities/creator.js +1 -1
  39. package/dist/core/capabilities/doctor.d.ts +9 -1
  40. package/dist/core/capabilities/doctor.js +47 -4
  41. package/dist/core/capabilities/engine-receipt.d.ts +5 -7
  42. package/dist/core/capabilities/engine-receipt.js +7 -9
  43. package/dist/core/capabilities/engine-run.d.ts +4 -0
  44. package/dist/core/capabilities/engine-run.js +33 -5
  45. package/dist/core/capabilities/export-engine-version.d.ts +15 -0
  46. package/dist/core/capabilities/export-engine-version.js +24 -0
  47. package/dist/core/capabilities/export-game.d.ts +9 -1
  48. package/dist/core/capabilities/export-game.js +115 -39
  49. package/dist/core/capabilities/export-presets.d.ts +1 -1
  50. package/dist/core/capabilities/export-presets.js +1 -1
  51. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
  52. package/dist/core/capabilities/fabricate-mesh.js +2 -3
  53. package/dist/core/capabilities/frame-quality.d.ts +4 -4
  54. package/dist/core/capabilities/frame-quality.js +4 -4
  55. package/dist/core/capabilities/grep.d.ts +1 -1
  56. package/dist/core/capabilities/grep.js +1 -1
  57. package/dist/core/capabilities/image-generation.d.ts +9 -0
  58. package/dist/core/capabilities/image-generation.js +19 -1
  59. package/dist/core/capabilities/navigation/open.d.ts +1 -1
  60. package/dist/core/capabilities/navigation/open.js +1 -1
  61. package/dist/core/capabilities/navigation/render-product-map.js +1 -1
  62. package/dist/core/capabilities/navigation/targets.js +2 -2
  63. package/dist/core/capabilities/placement-batch.d.ts +1 -1
  64. package/dist/core/capabilities/placement-batch.js +2 -2
  65. package/dist/core/capabilities/play-determinism.d.ts +1 -1
  66. package/dist/core/capabilities/play-determinism.js +1 -1
  67. package/dist/core/capabilities/publish-build.d.ts +15 -2
  68. package/dist/core/capabilities/publish-build.js +78 -28
  69. package/dist/core/capabilities/publish-download.d.ts +1 -2
  70. package/dist/core/capabilities/publish-download.js +2 -3
  71. package/dist/core/capabilities/replace-node.d.ts +1 -3
  72. package/dist/core/capabilities/replace-node.js +1 -3
  73. package/dist/core/capabilities/runtime-control.d.ts +5 -7
  74. package/dist/core/capabilities/runtime-control.js +7 -9
  75. package/dist/core/capabilities/scene-batch.d.ts +1 -1
  76. package/dist/core/capabilities/scene-batch.js +1 -1
  77. package/dist/core/capabilities/scene-kind.js +1 -1
  78. package/dist/core/capabilities/scene-readback.d.ts +3 -4
  79. package/dist/core/capabilities/scene-readback.js +3 -4
  80. package/dist/core/capabilities/scene-script.d.ts +2 -2
  81. package/dist/core/capabilities/scene-script.js +2 -2
  82. package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
  83. package/dist/core/capabilities/seeing/shot-store.js +1 -1
  84. package/dist/core/capabilities/summer-bundle.d.ts +2 -3
  85. package/dist/core/capabilities/summer-bundle.js +2 -3
  86. package/dist/core/capabilities/surface-snap.d.ts +1 -1
  87. package/dist/core/capabilities/surface-snap.js +1 -1
  88. package/dist/core/capabilities/tool-dispatch.js +11 -1
  89. package/dist/core/capabilities/ui-control.d.ts +1 -2
  90. package/dist/core/capabilities/ui-control.js +1 -2
  91. package/dist/core/capabilities/world-snapshot.d.ts +1 -1
  92. package/dist/core/capabilities/world-snapshot.js +1 -1
  93. package/dist/core/capability-skew.d.ts +2 -3
  94. package/dist/core/capability-skew.js +4 -5
  95. package/dist/core/config.js +2 -2
  96. package/dist/core/engine-install.d.ts +16 -0
  97. package/dist/core/engine-install.js +32 -2
  98. package/dist/core/feedback/client.js +1 -1
  99. package/dist/core/hosted-mcp.d.ts +115 -0
  100. package/dist/core/hosted-mcp.js +164 -0
  101. package/dist/core/launch-posture.d.ts +6 -3
  102. package/dist/core/launch-posture.js +18 -5
  103. package/dist/core/library-read.js +1 -2
  104. package/dist/core/templates.d.ts +1 -2
  105. package/dist/core/templates.js +1 -2
  106. package/dist/mcp/hosted-mount.d.ts +13 -59
  107. package/dist/mcp/hosted-mount.js +24 -30
  108. package/dist/mcp/server.d.ts +2 -2
  109. package/dist/mcp/server.js +5 -4
  110. package/dist/mcp/tools/creator-tools.js +14 -4
  111. package/dist/mcp/tools/debug-tools.js +1 -1
  112. package/dist/mcp/tools/generate-tools.js +19 -9
  113. package/dist/mcp/tools/navigation-tools.d.ts +1 -1
  114. package/dist/mcp/tools/navigation-tools.js +1 -1
  115. package/dist/mcp/tools/spatial-tools.js +1 -1
  116. package/dist/mcp/tools/visual-tools.js +2 -2
  117. package/dist/mcp/tools/with-engine.d.ts +1 -2
  118. package/dist/mcp/tools/with-engine.js +1 -2
  119. package/gemini-extension.json +3 -1
  120. package/hooks/session-start.sh +2 -2
  121. package/integrations/README.md +70 -76
  122. package/integrations/claude/README.md +0 -3
  123. package/integrations/codex/README.md +1 -2
  124. package/integrations/copilot-jetbrains/README.md +1 -1
  125. package/integrations/cursor/README.md +1 -2
  126. package/integrations/factory/README.md +15 -11
  127. package/integrations/mistral-vibe/README.md +1 -1
  128. package/integrations/opencode/README.md +1 -1
  129. package/integrations/roo-code/README.md +1 -1
  130. package/integrations/rovo-dev/README.md +1 -1
  131. package/integrations/trae/README.md +1 -1
  132. package/integrations/windsurf/README.md +3 -3
  133. package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
  134. package/library/references/gd-style/gd-style.md +4 -6
  135. package/library/references/godot-version/godot-version.md +3 -3
  136. package/library/references/headless-routing/headless-routing.md +2 -2
  137. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
  138. package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -16
  139. package/library/references/product-map/product-map.md +1 -1
  140. package/library/references/public-surface-language/public-surface-language.md +1 -1
  141. package/library/references/summer-folder/summer-folder.md +1 -1
  142. package/library/skills/3d-lighting/SKILL.md +4 -4
  143. package/library/skills/README.md +11 -9
  144. package/library/skills/adaptive-music/SKILL.md +7 -7
  145. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  146. package/library/skills/ambient-bed/SKILL.md +12 -14
  147. package/library/skills/animated-loop/SKILL.md +42 -42
  148. package/library/skills/animation-tree/SKILL.md +6 -6
  149. package/library/skills/art-direction/SKILL.md +8 -11
  150. package/library/skills/asset-strategy/SKILL.md +3 -3
  151. package/library/skills/audio-direction/SKILL.md +8 -10
  152. package/library/skills/auto-fire-targeting/SKILL.md +4 -3
  153. package/library/skills/bounded-engine-runs/SKILL.md +95 -0
  154. package/library/skills/bounded-engine-runs/resource.yaml +29 -0
  155. package/library/skills/brainstorm-game/SKILL.md +5 -5
  156. package/library/skills/brainstorming/SKILL.md +9 -15
  157. package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
  158. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
  159. package/library/skills/character-animation-wiring/SKILL.md +2 -2
  160. package/library/skills/character-model/SKILL.md +15 -26
  161. package/library/skills/character-movement/SKILL.md +1 -1
  162. package/library/skills/character-movement/references/movement-3d.md +1 -1
  163. package/library/skills/character-portrait/SKILL.md +4 -4
  164. package/library/skills/cinematic-cutscene/SKILL.md +38 -38
  165. package/library/skills/combat-basics/SKILL.md +1 -1
  166. package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
  167. package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
  168. package/library/skills/concept-art/SKILL.md +4 -4
  169. package/library/skills/create-asset-sheet/SKILL.md +12 -31
  170. package/library/skills/debug/SKILL.md +5 -4
  171. package/library/skills/debugging-game-feel/SKILL.md +1 -4
  172. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  173. package/library/skills/design-level/SKILL.md +5 -5
  174. package/library/skills/design-mechanic/SKILL.md +6 -6
  175. package/library/skills/design-npc/SKILL.md +8 -15
  176. package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
  177. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
  178. package/library/skills/environment-kit/SKILL.md +5 -5
  179. package/library/skills/export-and-ship/SKILL.md +25 -24
  180. package/library/skills/fabricating-assets/SKILL.md +1 -1
  181. package/library/skills/facial-and-lipsync/SKILL.md +5 -5
  182. package/library/skills/fps-controller/SKILL.md +17 -16
  183. package/library/skills/fps-controller/resource.yaml +0 -2
  184. package/library/skills/game-feel/SKILL.md +6 -7
  185. package/library/skills/gameskill/SKILL.md +3 -3
  186. package/library/skills/gdscript-patterns/SKILL.md +3 -3
  187. package/library/skills/generate-motion/SKILL.md +5 -22
  188. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
  189. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
  190. package/library/skills/headless-scripting/SKILL.md +8 -8
  191. package/library/skills/headless-scripting/resource.yaml +1 -0
  192. package/library/skills/in-game-purchases/SKILL.md +123 -118
  193. package/library/skills/in-game-purchases/resource.yaml +2 -2
  194. package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
  195. package/library/skills/investigating-bugs/SKILL.md +3 -11
  196. package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
  197. package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
  198. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
  199. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
  200. package/library/skills/make-game/SKILL.md +3 -5
  201. package/library/skills/make-game/references/2d-platformer.md +1 -1
  202. package/library/skills/multiplayer-project/SKILL.md +1 -1
  203. package/library/skills/multiplayer-testing/SKILL.md +4 -4
  204. package/library/skills/music-track/SKILL.md +40 -38
  205. package/library/skills/new-project/SKILL.md +4 -6
  206. package/library/skills/organic-model/SKILL.md +9 -9
  207. package/library/skills/pixel-art/SKILL.md +6 -6
  208. package/library/skills/play/SKILL.md +3 -4
  209. package/library/skills/playtesting-a-feature/SKILL.md +4 -6
  210. package/library/skills/procedural-animation/SKILL.md +10 -11
  211. package/library/skills/prop-model/SKILL.md +4 -4
  212. package/library/skills/psx-retro-rendering/SKILL.md +20 -20
  213. package/library/skills/psx-retro-rendering/resource.yaml +2 -3
  214. package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
  215. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
  216. package/library/skills/remote-deploy/SKILL.md +20 -21
  217. package/library/skills/retarget/SKILL.md +19 -23
  218. package/library/skills/running-in-the-cloud/SKILL.md +5 -5
  219. package/library/skills/scene-composition/SKILL.md +5 -5
  220. package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
  221. package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
  222. package/library/skills/scene-scripting/SKILL.md +3 -3
  223. package/library/skills/scene-to-level/SKILL.md +28 -31
  224. package/library/skills/skill-create/SKILL.md +1 -1
  225. package/library/skills/skill-improve/SKILL.md +9 -9
  226. package/library/skills/skill-test/SKILL.md +10 -10
  227. package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
  228. package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
  229. package/library/skills/skybox-panorama/SKILL.md +8 -9
  230. package/library/skills/sound-effect/SKILL.md +19 -19
  231. package/library/skills/spatial-placement/SKILL.md +2 -2
  232. package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
  233. package/library/skills/sprite-sheet/SKILL.md +10 -10
  234. package/library/skills/summer-analytics/SKILL.md +3 -3
  235. package/library/skills/summer-friends/SKILL.md +10 -10
  236. package/library/skills/summer-leaderboards/SKILL.md +6 -6
  237. package/library/skills/summer-match-results/SKILL.md +13 -13
  238. package/library/skills/summer-matchmaking/SKILL.md +11 -11
  239. package/library/skills/summer-parties/SKILL.md +9 -9
  240. package/library/skills/summer-player-data/SKILL.md +12 -12
  241. package/library/skills/summer-store/SKILL.md +6 -6
  242. package/library/skills/summer-world-chat/SKILL.md +9 -9
  243. package/library/skills/summer-world-saves/SKILL.md +7 -7
  244. package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
  245. package/library/skills/tileable-texture/SKILL.md +1 -1
  246. package/library/skills/trailer-shot/SKILL.md +36 -36
  247. package/library/skills/tune-performance/SKILL.md +13 -13
  248. package/library/skills/tune-performance/resource.yaml +1 -1
  249. package/library/skills/ui-graphics/SKILL.md +7 -7
  250. package/library/skills/use-widget-asset/SKILL.md +7 -7
  251. package/library/skills/using-summer/SKILL.md +5 -7
  252. package/library/skills/vehicle-model/SKILL.md +6 -7
  253. package/library/skills/vehicle-model/resource.yaml +2 -2
  254. package/library/skills/verification-before-completion/SKILL.md +5 -6
  255. package/library/skills/vfx-dissolve/SKILL.md +4 -4
  256. package/library/skills/vfx-fire/SKILL.md +6 -6
  257. package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
  258. package/library/skills/vfx-hit-spark/SKILL.md +4 -4
  259. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
  260. package/library/skills/vfx-lightning/SKILL.md +5 -5
  261. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
  262. package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
  263. package/library/skills/vfx-magic-glow/SKILL.md +4 -4
  264. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
  265. package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
  266. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
  267. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
  268. package/library/skills/vfx-smoke/SKILL.md +5 -5
  269. package/library/skills/vfx-water-ripple/SKILL.md +2 -2
  270. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
  271. package/library/skills/voice-line/SKILL.md +9 -9
  272. package/library/skills/web-compatibility-look/resource.yaml +1 -0
  273. package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
  274. package/library/skills/writing-plans/SKILL.md +4 -4
  275. package/library/skills/writing-skills/SKILL.md +8 -8
  276. package/library/tools/capture-gameplay/resource.yaml +73 -0
  277. package/library/tools/creator-publish/resource.yaml +4 -4
  278. package/library/tools/creator-releases/resource.yaml +5 -5
  279. package/library/tools/generate-image/resource.yaml +15 -1
  280. package/library/tools/publish-build/resource.yaml +6 -2
  281. package/package.json +1 -1
  282. package/registry/generated/aliases.json +1 -0
  283. package/registry/generated/counts.json +3 -3
  284. package/registry/generated/gemini-extension.json +3 -1
  285. package/registry/generated/index.json +248 -135
  286. package/registry/generated/marketplace.claude.json +2 -2
  287. package/registry/generated/plugin.claude.json +4 -2
  288. package/registry/generated/plugin.codex.json +5 -3
  289. package/registry/generated/plugin.cursor.json +4 -2
  290. package/registry/generated/plugin.factory.json +4 -2
  291. package/registry/generated/skills-index.md +11 -9
  292. package/registry/generated/skills-registry.json +33 -6
  293. 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
- 3. **Ask clarifying questions** — one at a time, understand purpose/constraints/success criteria
26
- 4. **Propose 2-3 approaches** — with trade-offs and your recommendation
27
- 5. **Present design** — in sections scaled to their complexity, get user approval after each section
28
- 6. **Write design doc** — save to `.summer/specs/YYYY-MM-DD-<topic>-design.md` in the game project and commit
29
- 7. **Spec self-review** — quick inline check for placeholders, contradictions, ambiguity, scope (see below)
30
- 8. **User reviews written spec** — ask user to review the spec file before proceeding
31
- 9. **Transition to implementation** — invoke writing-plans skill to create implementation plan
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" -> "Visual questions ahead?";
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 frontend-design, mcp-builder, or any other implementation skill. The ONLY skill you invoke after brainstorming is writing-plans.
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 SummerEngine 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.
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 SummerEngine where movement feel is the core gameplay.
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 retrieved 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.
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. This is the source of the "tightest" feel described in the originating post.
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 (Godot 4)
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 for Godot; the exact per-frame update bodies from Player.cs were not fully retrievable (see evidence limitations). 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.
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 SummerEngine's pixels-per-meter differs from Celeste's native resolution: preserve ratios (e.g., DashSpeed ≈ 2.67× MaxRun; RunAccel ≈ 11× MaxRun).
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 are taken directly from the retrieved Player.cs source. Per-state update-loop bodies from the middle of the 182 KB file were not retrievable (tool truncation); where the skeleton fills standard platformer patterns (e.g., jump-cut-on-release), this is noted as structural translation, not extracted code. Not yet verified inside SummerEngine.
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
- - "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"
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, honestly
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, verbatim the calls that matter:
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 **canonical Meshy auto-rig pipeline**. It produces a humanoid `.glb` with a Meshy-compatible skeleton that `generate-motion` can drive directly. The work is split into two paid passes with a **mandatory user-review gate between them** — the rig pass is more expensive and locks the topology, so the user must see the un-rigged preview and approve before you spend on the rig.
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 (~$0.05, ~10s)
20
- 2. Un-rigged 3D mesh → summer_generate_3d(image-to-3d) (~$0.50, ~60s)
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) (~$1.00, ~90s)
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** (~$1.00, ~90s, Meshy auto-rig). It locks the topology and adds a skeleton compatible with `generate-motion`. Once you approve I'll run it.
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 doubles the cost and locks the design.
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 a Meshy-rigged skeleton. `rigAssetId` saved.
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")`. Custom prompt-driven motion
213
- > is not shipped; hand-author one-off moves in Summer Engine or import a
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.** Doubles cost, locks the design, and removes the user's chance to course-correct cheaply.
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). See `character-model` retexture flow (TBD) — for now, route to `asset-strategy`.
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 at the Summer dashboard (or any image gen — Midjourney, nano-banana web, DALL-E).
237
- 2. Upload to Meshy at meshy.ai → Image to 3D → enable rigging.
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 is identical to the MCP path — same Meshy skeleton, same compatibility with `generate-motion` (which has its own dashboard fallback).
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 a Meshy-rigged skeleton. Next:
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 (the 40% every 2D game shares)
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 Godot forward `-Z`, lerp
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, which is why this skill works over MCP at all; 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.
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, ~$0.02, model nano-banana-2, anchor locked from `.summer/portrait-anchor.md`. OK?
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. Be clear about what the preset actually does though: 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.
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 `video/trailer-shot`. If they want a 3-second seamless background loop, that's `video/animated-loop`. This skill is for narrative beats with a defined start, middle, and end — usually with dialogue or VO.
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" — `video/trailer-shot`.
30
- - "Looping splash screen background" — `video/animated-loop`.
31
- - "Animated logo backdrop on the title screen" — `video/animated-loop`.
32
- - Real-time in-engine cinematic with the actual gameplay characters and camera — that's a Godot AnimationPlayer / Timeline job, not generated video. Route to `scene-composition`.
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, ~$1.50 total on kling**. Confirm before spending.
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 $0.05 still beats regenerating a $0.50 video.
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? | Cost | Speed | When |
76
- |---|---|---|---|---|
77
- | `ltx` | yes | $0.10 | ~30s | Iteration, blocking shots, B-roll, throwaway tests |
78
- | `kling` | yes | $0.50 | 2-4 min | Hero shots, character cutscenes, anything the player will sit and watch |
79
- | `minimax` | yes | $0.25 | 2-3 min | Stylized / anime-leaning content; better at non-photoreal looks than kling |
80
- | `kling-turbo` | **no** | $0.30 | 1-2 min | Text-to-video only — usable only if you drop the reference image |
81
- | `veo3` | **no** | $1.00 | 3-5 min | Text-to-video only — usable only if you drop the reference image |
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 the editor (Godot's AnimationPlayer or your `cinematics/` controller scene) syncs them.
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 audio/voice-line>"
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 Godot's import pipeline, and *fails the import* if the file never becomes a loadable resource. Convert with ffmpeg or DaVinci before importing:
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 | Cost | 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` | $0.50 | 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` | $0.50 | 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` | $0.50 | 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` | $1.00 | 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` | $0.50 | 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` | $0.50 | 5s |
178
- | Throwaway iteration / blocking | `ltx` | same prompt as above | $0.10 | 5s |
179
- | Anime / stylized cutscene | `minimax` | `anime-style young swordsman draws blade and steps forward, sakura petals, dramatic wind, Studio Ghibli soft painterly` | $0.25 | 5s |
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.** Burn $0.10 on `ltx` to validate framing and prompt; only spend $0.50 once the composition lands.
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 Studio MCP server isn't running, the user can do all of this through the Studio web dashboard at the Summer Engine cloud console:
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 `audio/voice-line` if you haven't yet.
228
- > - Score the moment with `audio/music-track` — a cutscene without music feels like a placeholder.
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 `video/trailer-shot` against the same reference.
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
- - `video/trailer-shot` — marketing footage, 5-10s, maximum visual punch.
235
- - `video/animated-loop` — seamless looping background clips.
236
- - `audio/voice-line` — TTS dialogue used inside cutscenes.
237
- - `audio/music-track` — score the cutscene.
238
- - `2d-assets/concept-art` — generate the reference image axis if no character reference exists yet.
239
- - `2d-assets/character-portrait` — produce a high-fidelity locked character portrait for use as `imageUrl`.
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 Godot combat pattern is hitbox + hurtbox + health, wired by signals. Build it
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