summer-engine 3.4.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +5 -1
- package/.codex-plugin/plugin.json +5 -1
- package/.cursor-plugin/plugin.json +5 -1
- package/.factory-plugin/plugin.json +5 -1
- package/.opencode/INSTALL.md +8 -8
- package/.opencode/plugins/summer.js +2 -2
- package/AGENTS.md +7 -7
- package/CHANGELOG.md +37 -0
- package/GEMINI.md +1 -1
- package/NOTICE +1 -1
- package/README.md +35 -35
- 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/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/setup.js +24 -4
- package/dist/cli/commands/skills.js +2 -2
- 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 +72 -7
- package/dist/core/capabilities/capture-gameplay.js +386 -25
- 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/engine-receipt.d.ts +5 -7
- package/dist/core/capabilities/engine-receipt.js +7 -9
- package/dist/core/capabilities/export-engine-version.d.ts +7 -0
- package/dist/core/capabilities/export-engine-version.js +9 -0
- package/dist/core/capabilities/export-game.d.ts +4 -0
- package/dist/core/capabilities/export-game.js +53 -10
- 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 +12 -2
- package/dist/core/capabilities/image-generation.js +31 -2
- 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 +1 -1
- package/dist/core/capabilities/publish-build.js +21 -9
- 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 +11 -3
- package/dist/core/capabilities/summer-bundle.js +21 -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 +14 -3
- 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/feedback/client.js +1 -1
- package/dist/core/launch-posture.d.ts +3 -3
- package/dist/core/launch-posture.js +3 -3
- package/dist/core/library-read.d.ts +7 -0
- package/dist/core/library-read.js +60 -9
- package/dist/core/library-search.d.ts +2 -0
- package/dist/core/templates.d.ts +1 -2
- package/dist/core/templates.js +1 -2
- package/dist/installer/agent-config.d.ts +25 -0
- package/dist/installer/agent-config.js +114 -3
- package/dist/installer/agent-table.d.ts +12 -0
- package/dist/installer/agent-table.js +9 -0
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.js +2 -2
- package/dist/mcp/tools/creator-tools.js +33 -4
- package/dist/mcp/tools/debug-tools.js +1 -1
- package/dist/mcp/tools/generate-tools.js +18 -37
- package/dist/mcp/tools/library-tools.d.ts +2 -1
- package/dist/mcp/tools/library-tools.js +1 -0
- 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 +5 -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 +16 -15
- 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 +16 -6
- 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 +6 -7
- 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 +2 -2
- package/library/skills/concept-art/SKILL.md +3 -3
- 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 +24 -25
- package/library/skills/export-and-ship/resource.yaml +2 -1
- 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/grow-analytics/SKILL.md +21 -0
- package/library/skills/grow-analytics/resource.yaml +27 -0
- package/library/skills/headless-scripting/SKILL.md +8 -8
- 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/publish-your-game/SKILL.md +21 -0
- package/library/skills/publish-your-game/resource.yaml +29 -0
- 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/store-art/SKILL.md +23 -0
- package/library/skills/store-art/resource.yaml +30 -0
- package/library/skills/store-listing/SKILL.md +21 -0
- package/library/skills/store-listing/resource.yaml +25 -0
- package/library/skills/summer-analytics/SKILL.md +3 -3
- package/library/skills/summer-analytics/resource.yaml +1 -0
- 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/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 +66 -1
- package/library/tools/creator-publish/resource.yaml +4 -4
- package/library/tools/creator-releases/resource.yaml +5 -5
- package/library/tools/export-game/resource.yaml +3 -0
- package/library/tools/generate-image/resource.yaml +4 -2
- package/library/tools/publish-build/resource.yaml +5 -1
- package/package.json +1 -1
- package/registry/generated/counts.json +2 -2
- package/registry/generated/gemini-extension.json +5 -1
- package/registry/generated/index.json +280 -137
- package/registry/generated/marketplace.claude.json +1 -1
- package/registry/generated/plugin.claude.json +5 -1
- package/registry/generated/plugin.codex.json +5 -1
- package/registry/generated/plugin.cursor.json +5 -1
- package/registry/generated/plugin.factory.json +5 -1
- package/registry/generated/skills-index.md +16 -6
- package/registry/generated/skills-registry.json +57 -5
- package/registry/schemas/domains.json +1 -1
- package/registry/schemas/skill.schema.json +5 -0
|
@@ -11,18 +11,18 @@ paths: ["**/*.gd", "**/*.tscn", "**/*.tres"]
|
|
|
11
11
|
|
|
12
12
|
# AnimationTree — Wire Clips Into Behavior
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
This skill generates nothing. It composes existing clips on an `AnimationPlayer` into an `AnimationTree` with a `StateMachine` for distinct states (idle / attack / hit / dead) and `BlendSpace` nodes for continuous parameters (walk-run blend by speed). Wired wrong, you get T-poses, snapping, or clips that cut each other off.
|
|
15
15
|
|
|
16
16
|
The canonical Summer Engine stack:
|
|
17
17
|
|
|
18
18
|
```
|
|
19
19
|
Character (CharacterBody3D)
|
|
20
|
-
├── Skeleton3D (from the
|
|
20
|
+
├── Skeleton3D (from the rigged GLB)
|
|
21
21
|
├── AnimationPlayer # holds the raw clips (idle, walk, run, attack_sword, ...)
|
|
22
22
|
└── AnimationTree # references AnimationPlayer, drives behavior
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
Before adding the tree, prove direct `AnimationPlayer.play()` visibly moves the rig.
|
|
25
|
+
Before adding the tree, prove direct `AnimationPlayer.play()` visibly moves the rig. The engine may import animation GLBs as `AnimationLibrary` resources or as `PackedScene`s with embedded `AnimationPlayer`s. If a copied clip appears in the list but the mesh T-poses, its tracks probably target a different root/skeleton path. Use the embedded player that came with the matching GLB, or remap/copy tracks only after confirming they target the active `Skeleton3D`. An inactive AnimationTree is also a no-op, so always set `AnimationTree.active = true`.
|
|
26
26
|
|
|
27
27
|
## When to use this skill
|
|
28
28
|
|
|
@@ -72,7 +72,7 @@ Before walking the CRUD steps below, check the ctx lane — one `summer_run_scri
|
|
|
72
72
|
- **Animation-tier engines:** `ctx.anim_state_machine(character, {states: {...}, transitions: [[from, to, {blend_s: 0.2}], ...], start: "idle"})` gets-or-creates the AnimationTree, wires it to the player, builds the state machine, sets `active = true`. Unknown clip names come back as a report entry listing the player's REAL clips — never wire against guessed names. Full recipe (inspect clips/bones first, method-track events, root motion, playtest verification): `character-animation-wiring`.
|
|
73
73
|
- **Any engine (raw fallback):** the same classes are fully script-bound — `AnimationNodeStateMachine.add_node(name, AnimationNodeAnimation)`, `add_transition(from, to, AnimationNodeStateMachineTransition)` (one transition resource each, `xfade_time` on it), then `tree.anim_player = tree.get_path_to(player)`, `tree.tree_root = sm`, `tree.active = true`, and `ctx.set_owner_recursive(tree)`. The raw script is quoted in `character-animation-wiring`.
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
Scope: `anim_state_machine` builds clip states + transitions only. The canonical machine below — BlendSpace1D locomotion, OneShot attack/hit — still needs the `.tres` (or raw-script) lane for those node types. Discrete idle/walk/run backbones don't.
|
|
76
76
|
|
|
77
77
|
## Steps via MCP
|
|
78
78
|
|
|
@@ -259,7 +259,7 @@ Then `summer_play` and watch — the goblin should idle in place, blend up to wa
|
|
|
259
259
|
|
|
260
260
|
- **OneShot:** the action is a *temporary override* of an underlying state (attack while running, hit-react while attacking). The base keeps playing.
|
|
261
261
|
- **StateMachine state:** the action is a *replacement* (dead, stunned, ragdoll). Nothing else plays.
|
|
262
|
-
-
|
|
262
|
+
- Action combat is usually OneShot for attacks + a StateMachine state for "dead". Don't model attacks as StateMachine states unless you need precise transition control between attack-string variants.
|
|
263
263
|
|
|
264
264
|
### BlendSpace1D vs BlendSpace2D
|
|
265
265
|
|
|
@@ -270,7 +270,7 @@ Then `summer_play` and watch — the goblin should idle in place, blend up to wa
|
|
|
270
270
|
|
|
271
271
|
- Skipping AnimationTree and calling `AnimationPlayer.play("walk")` from script. Works for one clip; breaks the moment you need a crossfade.
|
|
272
272
|
- Modeling every attack as a StateMachine state. The transition matrix explodes (N states × N transitions). Use one OneShot per attack and switch its inner clip via `parameters/Attack/animation`.
|
|
273
|
-
- Writing the `.tres` by hand without using sub_resource IDs —
|
|
273
|
+
- Writing the `.tres` by hand without using sub_resource IDs — the engine loses the references. Always use `[sub_resource id="..."]` blocks.
|
|
274
274
|
- Driving `blend_position` from raw input (`Input.get_axis(...)`). Drive from actual velocity — that way the blend matches the body's real motion, including knockback and slope-slide.
|
|
275
275
|
|
|
276
276
|
## Edge cases
|
|
@@ -13,7 +13,7 @@ paths: [".summer/**", "project.godot", "**/*.tscn"]
|
|
|
13
13
|
|
|
14
14
|
## Overview
|
|
15
15
|
|
|
16
|
-
A consistent art direction
|
|
16
|
+
A consistent art direction makes a low-budget game look finished. Solo developers most often lose it by mixing styles — a toon-shaded character on a photoreal terrain, a pixel UI over a smooth 3D world. This skill builds an art bible the rest of the project obeys: references, palette, mood, lighting plan, post-processing, and a do/don't list. It writes to `.summer/art-bible.md` — the file every rendering / shader / lighting / VFX skill reads later.
|
|
17
17
|
|
|
18
18
|
**Core principle:** Constraint produces style. A game with **15 colors total** looks more intentional than a game with infinite-color textures. Pick the constraint, then defend it.
|
|
19
19
|
|
|
@@ -118,7 +118,7 @@ State the plan in one block. For the current Summer Engine rendering stack:
|
|
|
118
118
|
```
|
|
119
119
|
Sun: DirectionalLight3D, color #fff2d9, energy 0.9, angle ~30° (warm low-angle)
|
|
120
120
|
Sky: ProceduralSkyMaterial, sky_top_color #6b88a3, sky_horizon_color #d8b88e
|
|
121
|
-
Ambient:
|
|
121
|
+
Ambient: Environment ambient_light_color #4a5570, ambient_light_energy 0.15
|
|
122
122
|
Indoor fills: OmniLight3D color #ffd9a8, energy 0.6, range 4m
|
|
123
123
|
NEVER: pure-white DirectionalLight, no ambient, hard cube shadows
|
|
124
124
|
```
|
|
@@ -138,7 +138,7 @@ Summer Engine post stack: Glow, SDFGI, SSAO, SSR, Adjustments, Color Correction
|
|
|
138
138
|
|
|
139
139
|
```
|
|
140
140
|
Glow: ON, threshold 0.9, intensity 0.5 (soft bloom on highlights only)
|
|
141
|
-
SDFGI: OFF for vertical-slice scope (perf cost; bake
|
|
141
|
+
SDFGI: OFF for vertical-slice scope (perf cost; bake lightmaps later)
|
|
142
142
|
SSAO: ON, light_affect 0.3 (just enough for grounding)
|
|
143
143
|
SSR: OFF unless we have wet/glass surfaces
|
|
144
144
|
Color correction: Filmic tonemap, slight S-curve LUT toward warm
|
|
@@ -159,7 +159,7 @@ This is the contract. Five do's, five don'ts. Specific, enforceable.
|
|
|
159
159
|
- Outline shader on character + interactable props (no outline on environment).
|
|
160
160
|
- Soft shadows (DirectionalLight3D shadow_blur 1.5).
|
|
161
161
|
- Warm key + cool fill — never both warm or both cool.
|
|
162
|
-
- Texture filter:
|
|
162
|
+
- Texture filter: Nearest for a crunchy, near-pixel feel.
|
|
163
163
|
|
|
164
164
|
## DON'T
|
|
165
165
|
- No pure white (#ffffff). Use #f4ecdf.
|
|
@@ -176,7 +176,7 @@ Some art-direction calls translate to `project.godot` settings. Apply them.
|
|
|
176
176
|
**Preferred (Summer MCP):**
|
|
177
177
|
|
|
178
178
|
```
|
|
179
|
-
summer_project_setting(key="rendering/textures/canvas_textures/default_texture_filter", value="
|
|
179
|
+
summer_project_setting(key="rendering/textures/canvas_textures/default_texture_filter", value="0") # Nearest, if pixel-art-ish (1 = Linear, the default)
|
|
180
180
|
summer_project_setting(key="rendering/environment/defaults/default_clear_color", value="Color(0.227, 0.290, 0.227)") # palette primary
|
|
181
181
|
summer_project_setting(key="rendering/anti_aliasing/quality/msaa_3d", value="2") # MSAA 2x for clean edges
|
|
182
182
|
```
|
|
@@ -274,9 +274,6 @@ No template — this is a workflow that produces the bible the rest of the proje
|
|
|
274
274
|
|
|
275
275
|
## See also
|
|
276
276
|
|
|
277
|
-
- `
|
|
278
|
-
- `audio
|
|
279
|
-
- `
|
|
280
|
-
- `shaders/shader-basics/SKILL.md` — for outline / toon shaders
|
|
281
|
-
- `post-processing/bloom-and-glow/SKILL.md` — implements the glow rule
|
|
282
|
-
- `post-processing/color-grading/SKILL.md` — implements the LUT and tonemap call
|
|
277
|
+
- `brainstorm-game` — produces the brief that anchors the bible
|
|
278
|
+
- `audio-direction` — the sonic counterpart
|
|
279
|
+
- `3d-lighting` — implements the lighting plan and the environment's glow, tonemap and SSAO settings
|
|
@@ -34,7 +34,7 @@ Ask the **exact phrase** before dispatching. Skipping the question is the most c
|
|
|
34
34
|
| Concept art vs character portrait | "Quick check — exploring the look (3-4 variants for art direction) or generating a final character portrait for dialogue UI?" | `concept-art` (exploring) / `character-portrait` (final) |
|
|
35
35
|
| Prop vs character model | "Static object (sword, chair, lantern) or rigged character that needs animation?" | `prop-model` / `character-model` |
|
|
36
36
|
| Tile vs sprite sheet | "One seamless tile that repeats, or a frame grid for an animated sprite?" | `tileable-texture` / `sprite-sheet` |
|
|
37
|
-
| SFX vs music | "One-shot effect or a longer track (loop, theme, ambient bed)?" | `sound-effect` / `music-track` (or `
|
|
37
|
+
| SFX vs music | "One-shot effect or a longer track (loop, theme, ambient bed)?" | `sound-effect` / `music-track` (or `ambient-bed`) |
|
|
38
38
|
| Generate vs retarget motion | "Generate a new clip on this character, or apply an existing library to a new character?" | `generate-motion` / `retarget` |
|
|
39
39
|
| VFX recipe vs game-feel | "Particle/shader effect in the world or screen-feel (camera shake, hit-stop)?" | `vfx-<name>` / `game-feel` |
|
|
40
40
|
|
|
@@ -61,7 +61,7 @@ Invoke the specialist via the `Skill` tool. Don't paraphrase — let it run. Pas
|
|
|
61
61
|
| Request | Skill |
|
|
62
62
|
|---|---|
|
|
63
63
|
| Sword / chair / barrel / static object | `prop-model` |
|
|
64
|
-
| Player / NPC / enemy / boss / rigged humanoid | `character-model` (
|
|
64
|
+
| Player / NPC / enemy / boss / rigged humanoid | `character-model` (generated mesh + auto-rig) |
|
|
65
65
|
| Modular dungeon / building blocks | `environment-kit` |
|
|
66
66
|
| Car / spaceship / hard-surface vehicle | `vehicle-model` |
|
|
67
67
|
| Tree / rock / mushroom / foliage | `organic-model` |
|
|
@@ -132,4 +132,4 @@ VFX is **code, not generative** — recipes are shader + GDScript + node setup,
|
|
|
132
132
|
|
|
133
133
|
## Fallback (no MCP)
|
|
134
134
|
|
|
135
|
-
The router still works without MCP — classification is text-only. It hands off to the specialist, which surfaces its own no-MCP fallback (typically: run the
|
|
135
|
+
The router still works without MCP — classification is text-only. It hands off to the specialist, which surfaces its own no-MCP fallback (typically: run the same generation in the Summer dashboard, then `summer_import_from_url` once MCP is back).
|
|
@@ -13,7 +13,7 @@ paths: [".summer/**", "project.godot", "**/*.tscn", "audio/**"]
|
|
|
13
13
|
|
|
14
14
|
## Overview
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Many indie games sound like one sound library used flat: the same generic "swoosh" for menu, jump, pickup and hit. This skill builds an audio bible that names the music style, the SFX vocabulary, the dynamic music plan, and the spatial / mix rules. Writes to `.summer/audio-bible.md` and configures the audio bus layout in the project so the rest of the work has a real foundation.
|
|
17
17
|
|
|
18
18
|
**Core principle:** SFX needs a *vocabulary*, not a *library*. Eight named SFX classes with consistent character beat 80 random library hits.
|
|
19
19
|
|
|
@@ -25,7 +25,7 @@ Ask exactly this:
|
|
|
25
25
|
|
|
26
26
|
> Three reference tracks, games, or films for the music. What instruments matter? And what's the SFX vibe — chunky, clean, synthetic, or organic?
|
|
27
27
|
|
|
28
|
-
Three is the minimum. One or two collapses into a clone.
|
|
28
|
+
Three is the minimum. One or two collapses into a clone.
|
|
29
29
|
|
|
30
30
|
If they freeze, offer four axes (not titles):
|
|
31
31
|
|
|
@@ -237,9 +237,9 @@ End with:
|
|
|
237
237
|
| Music louder than SFX | Players need SFX for gameplay; music is mood. Default mix is -8 dB music vs 0 dB SFX. |
|
|
238
238
|
| No reverb buses | "Send" architecture (rooms route to a small/large/outdoor reverb bus) is mandatory or your mix sounds dry-then-wet inconsistently. |
|
|
239
239
|
| Pure sine "ding" for pickup | Reads as cheap mobile game. Use a major-third interval with character. |
|
|
240
|
-
| Same footstep sample for all surfaces |
|
|
240
|
+
| Same footstep sample for all surfaces | Players hear footsteps constantly; material-aware steps carry much of the perceived audio quality. |
|
|
241
241
|
| No master ceiling / true peak | Audio clips on console builds without `-1 dBTP` ceiling. Always set it. |
|
|
242
|
-
| Assuming SetResourceProperty fails silently on inline sub_resources | It does not — inline targets work, and the structural failures (`node not found`, `property is not a resource`, `resource is null`) are explicit errors. What *is* silent on current engines is a bad value shape: a JSON object instead of
|
|
242
|
+
| Assuming SetResourceProperty fails silently on inline sub_resources | It does not — inline targets work, and the structural failures (`node not found`, `property is not a resource`, `resource is null`) are explicit errors. What *is* silent on current engines is a bad value shape: a JSON object instead of an engine literal string, a misspelled `subProperty`, or a wrong-typed value returns `ok:true` yet no-ops or coerces destructively. Pass class names and literal strings, and confirm in the saved `.tres`/`.tscn`, never from `ok` alone. See `../../references/mcp-tools-reference/mcp-tools-reference.md`. |
|
|
243
243
|
|
|
244
244
|
## Collaborative protocol
|
|
245
245
|
|
|
@@ -255,9 +255,7 @@ No template — this is a workflow that produces the bible the rest of the proje
|
|
|
255
255
|
- `../../references/godot-version/godot-version.md` — Summer compatibility and
|
|
256
256
|
version-sensitive audio API notes
|
|
257
257
|
- `../../references/mcp-tools-reference/mcp-tools-reference.md`
|
|
258
|
-
- `
|
|
259
|
-
- `
|
|
260
|
-
- `
|
|
261
|
-
- `
|
|
262
|
-
- `audio/footstep-systems/SKILL.md` (NEXT) — material-aware footstep impl
|
|
263
|
-
- `audio/dynamic-music-stingers/SKILL.md` (LATER) — implements the dynamic music plan
|
|
258
|
+
- `brainstorm-game` — produces the brief that anchors the bible
|
|
259
|
+
- `art-direction` — the visual counterpart; audio must rhyme with it
|
|
260
|
+
- `adaptive-music` — implements the dynamic music plan
|
|
261
|
+
- `sound-effect`, `music-track`, `ambient-bed`, `voice-line` — generate the audio the bible describes
|
|
@@ -172,10 +172,11 @@ Use `summer_get_diagnostics` to confirm no new errors.
|
|
|
172
172
|
`summer_inspect_node` will **not** show you `pending_damage` mid-fight. It reads
|
|
173
173
|
the edited scene in the editor — the response even tags itself
|
|
174
174
|
`provenance: editor_scene` — so it reports the saved node, not the live
|
|
175
|
-
instance. Runtime values need a runtime
|
|
175
|
+
instance. Runtime values need a runtime read: with the game running, read
|
|
176
|
+
the enemy with `summer_inspect_runtime_node` or `summer_game_probe` (engine
|
|
177
|
+
builds with the runtime-control ops; see the `agent-playtesting` skill).
|
|
176
178
|
|
|
177
|
-
|
|
178
|
-
`summer_batch`. It spins up a hidden, disposable game instance that runs a
|
|
179
|
+
On any build, the `RunVerification` op, sent through `summer_batch`, also works. It spins up a hidden, disposable game instance that runs a
|
|
179
180
|
GDScript probe and exits; it never touches the editor:
|
|
180
181
|
|
|
181
182
|
```
|
|
@@ -11,9 +11,9 @@ paths: ["project.godot", "tests/**/*.gd", "tools/**/*.gd"]
|
|
|
11
11
|
|
|
12
12
|
# Bounded engine runs for agents
|
|
13
13
|
|
|
14
|
-
Agents verify games by running the engine many times: imports, tests, captures, multiplayer bots.
|
|
15
|
-
that hangs, overlaps another, makes noise or hides an error costs time
|
|
16
|
-
|
|
14
|
+
Agents verify games by running the engine many times: imports, tests, captures, multiplayer bots. A run
|
|
15
|
+
that hangs, overlaps another, makes noise or hides an error costs time. These rules keep runs safe when
|
|
16
|
+
several agents share one project on one machine.
|
|
17
17
|
|
|
18
18
|
## 1. Every run is bounded, muted and alone
|
|
19
19
|
|
|
@@ -29,14 +29,13 @@ day of several agents sharing one project on one Mac.
|
|
|
29
29
|
<project>/.engine.lock 180 <summer> ...
|
|
30
30
|
```
|
|
31
31
|
Put this in one wrapper script and make every agent use it.
|
|
32
|
-
- **Cap its memory.** A time limit does not stop a run from eating all memory first
|
|
33
|
-
|
|
34
|
-
(compressor full, swap unable to grow). The wrapper should run the command as a child, sum the resident
|
|
32
|
+
- **Cap its memory.** A time limit does not stop a run from eating all memory first; several engine runs plus a
|
|
33
|
+
browser loading a large web export can exhaust memory and crash the machine. The wrapper should run the command as a child, sum the resident
|
|
35
34
|
memory of its whole process tree (browsers spawn GPU/renderer helpers), kill the tree past a cap (e.g.
|
|
36
35
|
3 GB), and also stop when system free memory falls low (`sysctl -n kern.memorystatus_level` < 15 on macOS),
|
|
37
36
|
because GPU memory on Apple Silicon is system memory but is not counted in RSS. Refuse to start when the
|
|
38
37
|
system is already short (< 35).
|
|
39
|
-
- **Mute it.** `--audio-driver Dummy`.
|
|
38
|
+
- **Mute it.** `--audio-driver Dummy`.
|
|
40
39
|
- **Render only when you must, and offscreen.** `--headless` for logic (no pixels). For visual checks use
|
|
41
40
|
`--summer-offscreen` with a fixed `--resolution` and a capture script that saves PNGs and quits. Visible
|
|
42
41
|
windows only when a human asked to watch.
|
|
@@ -201,8 +201,8 @@ No template — this is a workflow that produces the brief that drives template
|
|
|
201
201
|
|
|
202
202
|
## See also
|
|
203
203
|
|
|
204
|
-
- `
|
|
205
|
-
- `
|
|
206
|
-
- `
|
|
207
|
-
- `audio
|
|
208
|
-
- `
|
|
204
|
+
- `design-mechanic` — design the core loop in detail
|
|
205
|
+
- `design-level` — sketch level 1
|
|
206
|
+
- `art-direction` — turn the one-phrase look into a full bible
|
|
207
|
+
- `audio-direction` — sonic identity
|
|
208
|
+
- `make-game` — scaffold the project once the brief is locked
|
|
@@ -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
|
|