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
|
@@ -5,7 +5,7 @@ license: MIT
|
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: audio
|
|
7
7
|
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep Glob Write Edit summer_generate_audio summer_search_assets summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_get_scene_tree
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_generate_audio summer_search_assets summer_import_from_url summer_add_node summer_set_prop summer_instantiate_scene summer_inspect_node summer_get_scene_tree
|
|
9
9
|
paths: ["audio/sfx/**", "scripts/**", "**/*.tscn"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -13,22 +13,22 @@ paths: ["audio/sfx/**", "scripts/**", "**/*.tscn"]
|
|
|
13
13
|
|
|
14
14
|
## Overview
|
|
15
15
|
|
|
16
|
-
This skill produces one named SFX clip
|
|
16
|
+
This skill produces one named SFX clip that follows the audio bible's vocabulary, then wires it into the scene as an AudioStreamPlayer that plays once and frees itself (or stops cleanly if it is a short loop). The prompt shape decides the result: "metal sword swing whoosh, dry, sharp, 250ms" returns the right clip on the first try; "epic battle sound" returns twenty seconds of musical noise.
|
|
17
17
|
|
|
18
|
-
ElevenLabs SFX (the `sound_effects` capability of `summer_generate_audio`) is
|
|
18
|
+
ElevenLabs SFX (the `sound_effects` capability of `summer_generate_audio`) is literal. It treats the prompt as a description of a real sound. Concrete material, action and intensity beat adjectives.
|
|
19
19
|
|
|
20
20
|
## When to use
|
|
21
21
|
|
|
22
22
|
- One-shot SFX: footstep, swing, click, hit, impact, pickup, jump, land, door, breath.
|
|
23
|
-
- Short loops < 2s: hum, drone snippet, rain texture (for
|
|
23
|
+
- Short loops < 2s: hum, drone snippet, rain texture (for longer looping ambience use `ambient-bed`).
|
|
24
24
|
- Replacing a placeholder beep with something on-bible.
|
|
25
25
|
|
|
26
26
|
## When NOT to use
|
|
27
27
|
|
|
28
|
-
- Music or musical stings → `
|
|
29
|
-
- Long location ambience (>5s) → `
|
|
30
|
-
- Voice / dialogue → `
|
|
31
|
-
- Defining the *vocabulary* of SFX
|
|
28
|
+
- Music or musical stings → `music-track`.
|
|
29
|
+
- Long location ambience (>5s) → `ambient-bed`.
|
|
30
|
+
- Voice / dialogue → `voice-line`.
|
|
31
|
+
- Defining the *vocabulary* of SFX → `audio-direction`. This skill executes against an existing bible.
|
|
32
32
|
|
|
33
33
|
## Steps
|
|
34
34
|
|
|
@@ -46,7 +46,7 @@ The bible defines an SFX *class* (UI, Pickup positive, Damage, Footstep, Attack,
|
|
|
46
46
|
|
|
47
47
|
### 2. Search for an existing clip first
|
|
48
48
|
|
|
49
|
-
Generation
|
|
49
|
+
Generation uses credits. Reuse an existing clip when one fits.
|
|
50
50
|
|
|
51
51
|
```
|
|
52
52
|
summer_search_assets(query="<class> <subject>", assetType="audio", source="all")
|
|
@@ -64,7 +64,7 @@ ElevenLabs SFX responds to literal sound descriptions. Pattern:
|
|
|
64
64
|
<subject> <material> <action>, <intensity>, <character>, <duration cue>
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
-
Working examples
|
|
67
|
+
Working examples:
|
|
68
68
|
|
|
69
69
|
| Goal | Prompt that works | Why |
|
|
70
70
|
|---|---|---|
|
|
@@ -91,7 +91,7 @@ Prompts that DON'T work (and why):
|
|
|
91
91
|
|
|
92
92
|
Show the prompt and the call before running:
|
|
93
93
|
|
|
94
|
-
> Prompt: `metal sword swing whoosh, dry, sharp, 250ms`. Duration 0.5s (model floor). Model: ElevenLabs SFX.
|
|
94
|
+
> Prompt: `metal sword swing whoosh, dry, sharp, 250ms`. Duration 0.5s (model floor). Model: ElevenLabs SFX. Generate?
|
|
95
95
|
|
|
96
96
|
The `sound_effects` capability reads the description from **`text`**, not `prompt`. Passing `prompt` here is a 400 `text_required` — `prompt` is only for the `music` capability.
|
|
97
97
|
|
|
@@ -155,7 +155,7 @@ func _ready() -> void:
|
|
|
155
155
|
play()
|
|
156
156
|
```
|
|
157
157
|
|
|
158
|
-
Save it as a `.tscn`, then `summer_instantiate_scene(scenePath, parent, scene, name)` to place it.
|
|
158
|
+
Save it as a `.tscn`, then `summer_instantiate_scene(scenePath, parent, scene, name)` to place it. That only places the node at author time. To spawn one per event at the emitter's position at runtime, use GDScript (`preload(...).instantiate()` + `add_child`). The node frees itself when the stream finishes.
|
|
159
159
|
|
|
160
160
|
### 8. Volume calibration
|
|
161
161
|
|
|
@@ -170,7 +170,7 @@ If it comes back too loud (rare): negative `volume_db`, or trim attack in an edi
|
|
|
170
170
|
### 9. Confirm in scene
|
|
171
171
|
|
|
172
172
|
```
|
|
173
|
-
summer_inspect_node(path="
|
|
173
|
+
summer_inspect_node(path="Player/SwingSFX")
|
|
174
174
|
```
|
|
175
175
|
|
|
176
176
|
Verify `stream`, `bus`, `volume_db`. Trigger it via `summer_play` if the user wants to hear it now.
|
|
@@ -199,7 +199,7 @@ Stinger event: short triumphant brass stinger, 1.5s, hall reverb
|
|
|
199
199
|
|
|
200
200
|
- **Adjective-only prompts.** `epic`, `cool`, `realistic`, `professional` — meaningless to the model.
|
|
201
201
|
- **Multiple events in one prompt.** Split into two generations.
|
|
202
|
-
- **Looping a non-loop-clean clip.**
|
|
202
|
+
- **Looping a non-loop-clean clip.** It clicks. Use `ambient-bed` for real loops.
|
|
203
203
|
- **Skipping the bus.** Default bus is `Master`. SFX must route to the `SFX` bus or the mix breaks.
|
|
204
204
|
- **Generating before searching.** Reuse before regenerate.
|
|
205
205
|
- **Generating before reading the bible.** The clip will fight the rest of the audio.
|
|
@@ -230,13 +230,13 @@ After the SFX is wired:
|
|
|
230
230
|
> SFX `sword_swing_01.wav` wired to `Player/SwingSFX` on the `SFX` bus. Next:
|
|
231
231
|
> - Trigger it from your attack animation's `Call Method Track` → `play()`.
|
|
232
232
|
> - Generate the parry / clash counterpart with `/sound-effect` again.
|
|
233
|
-
> - For
|
|
233
|
+
> - For footsteps across surfaces, generate one clip per material and switch on the floor's `physics_material` (see Edge cases).
|
|
234
234
|
|
|
235
235
|
## See also
|
|
236
236
|
|
|
237
|
-
- `audio
|
|
238
|
-
- `
|
|
239
|
-
- `
|
|
240
|
-
- `
|
|
237
|
+
- `audio-direction` — defines the vocabulary this skill obeys
|
|
238
|
+
- `ambient-bed` — long looping textures
|
|
239
|
+
- `music-track` — music
|
|
240
|
+
- `voice-line` — TTS
|
|
241
241
|
- `../../references/mcp-tools-reference/mcp-tools-reference.md`
|
|
242
242
|
- `../../references/godot-version/godot-version.md` — Summer compatibility for audio nodes
|
|
@@ -59,7 +59,7 @@ defined relative to a rotated subject; then use `directionSpace="local"`.
|
|
|
59
59
|
- `grounded: true` means downward support was detected. It does not mean the
|
|
60
60
|
object is centered or otherwise well placed.
|
|
61
61
|
- `contactStatus` and `contacts` identify touching or overlapping colliders.
|
|
62
|
-
|
|
62
|
+
The physics shape query cannot distinguish touching from penetration here.
|
|
63
63
|
- `directions.<label>.status` is `blocked` when clearance is below the tool's
|
|
64
64
|
threshold; `distance` is measured from the subject bounds.
|
|
65
65
|
- `evidence: "physics"` is exact collider-query evidence.
|
|
@@ -93,7 +93,7 @@ defined relative to a rotated subject; then use `directionSpace="local"`.
|
|
|
93
93
|
5. Check: `summer_measure` plane mode on each facade line (every front on one
|
|
94
94
|
plane), pair mode on joints you doubt, `summer_starcast` with
|
|
95
95
|
`directionSpace: "local"` on mounted pieces, `summer_test_placement` before
|
|
96
|
-
committing a piece in a tight spot. Starcast's local names follow
|
|
96
|
+
committing a piece in a tight spot. Starcast's local names follow the engine:
|
|
97
97
|
`forward` is -Z, `back` is +Z. A piece with a -Z back should read
|
|
98
98
|
`forward` blocked by the wall at about the standoff (or the wall in
|
|
99
99
|
`contacts` when flush) and `back` open.
|
|
@@ -30,7 +30,7 @@ Read it before the first call in a task. The workflow that uses them is in
|
|
|
30
30
|
declared in `truncated: {list: {shown, total}}`.
|
|
31
31
|
- **No silent fallback.** A missing op answers `engine_lacks_op`; a measurement
|
|
32
32
|
that cannot be made answers a named `failure_reason`.
|
|
33
|
-
- **Engine ops.**
|
|
33
|
+
- **Engine ops.** Reads run one read-only GDScript probe
|
|
34
34
|
through `RunSceneScript` (the op behind `summer_run_script`: in-process, no
|
|
35
35
|
child editor, `undo: "none"`, no checkpoint). Mutations are ordinary
|
|
36
36
|
`SetProp`, `SnapToSurface` and `InstantiateScene` ops: one undo step per
|
|
@@ -52,11 +52,11 @@ Read it before the first call in a task. The workflow that uses them is in
|
|
|
52
52
|
| Pipe or duct end to end | `summer_connect_ports` |
|
|
53
53
|
| What is in front of this point, and its normal? | `summer_raycast` |
|
|
54
54
|
| Gap or overlap between two pieces; is the facade front flat? | `summer_measure` |
|
|
55
|
-
| What surrounds a placed piece, which side is blocked? | `summer_starcast`
|
|
56
|
-
| Will a pose fit before I commit it in a tight spot? | `summer_test_placement`
|
|
57
|
-
| Seat a prop on a floor, table or ledge | `summer_snap_to_surface`
|
|
58
|
-
| Line up or equally space 2-16 placed pieces on one axis | `summer_align_distribute_3d`
|
|
59
|
-
| Did exactly that change, and does it look right? | `summer_world_snapshot` + `summer_snapshot_diff`, then `summer_screenshot`
|
|
55
|
+
| What surrounds a placed piece, which side is blocked? | `summer_starcast` |
|
|
56
|
+
| Will a pose fit before I commit it in a tight spot? | `summer_test_placement` |
|
|
57
|
+
| Seat a prop on a floor, table or ledge | `summer_snap_to_surface` |
|
|
58
|
+
| Line up or equally space 2-16 placed pieces on one axis | `summer_align_distribute_3d` |
|
|
59
|
+
| Did exactly that change, and does it look right? | `summer_world_snapshot` + `summer_snapshot_diff`, then `summer_screenshot` |
|
|
60
60
|
|
|
61
61
|
## `summer_inspect_asset`
|
|
62
62
|
|
|
@@ -133,20 +133,20 @@ instances it off the scene tree, measures, and frees it.
|
|
|
133
133
|
|
|
134
134
|
## `summer_instantiate_scene` (placed)
|
|
135
135
|
|
|
136
|
-
- **
|
|
136
|
+
- **Placement arguments:** `position`, `rotation_degrees`, `scale` (`[x, y, z]`,
|
|
137
137
|
parent-local) or `transform` (`"Transform3D(xx, xy, xz, yx, yy, yz, zx, zy,
|
|
138
138
|
zz, ox, oy, oz)"`). Not `transform` with the others; not `scale` or
|
|
139
139
|
`transform` with `target_size`.
|
|
140
140
|
- **Behaviour:** `InstantiateScene` (its own request, as the engine requires),
|
|
141
141
|
then one `SetProp` request on the node path the receipt reports (a name
|
|
142
|
-
collision rename is followed), then `SaveScene`. Without
|
|
143
|
-
|
|
142
|
+
collision rename is followed), then `SaveScene`. Without these fields it only
|
|
143
|
+
instances the piece.
|
|
144
144
|
- **Result:** the merged receipt (`results` holds every op; the per-request
|
|
145
145
|
`receipts` copies are kept only when something failed) plus
|
|
146
146
|
`placement {nodePath, applied, fields, space: "parent_local"}`.
|
|
147
147
|
- **Ops:** `InstantiateScene`, `SetProp`, `SaveScene`.
|
|
148
148
|
|
|
149
|
-
## `summer_batch`
|
|
149
|
+
## `summer_batch` placement
|
|
150
150
|
|
|
151
151
|
- `InstantiateScene` ops may carry the same placement fields (arrays or
|
|
152
152
|
`"Vector3(...)"` strings). Each piece is one op; its `SetProp`s are sent right
|
|
@@ -161,8 +161,7 @@ instances it off the scene tree, measures, and frees it.
|
|
|
161
161
|
transforms of a run of `InstantiateScene` ops are held back and sent
|
|
162
162
|
together (up to 200 `SetProp`s per request) just before the next op that is
|
|
163
163
|
not an `InstantiateScene`, riding along with it when it can. A batch of N
|
|
164
|
-
placed pieces is therefore about N + 2 requests and N + 2 undo steps (
|
|
165
|
-
2N + 1). Every later op in the list (a `SetProp`, `SnapToSurface`, a query,
|
|
164
|
+
placed pieces is therefore about N + 2 requests and N + 2 undo steps. Every later op in the list (a `SetProp`, `SnapToSurface`, a query,
|
|
166
165
|
the save) runs after the transforms land. If an `InstantiateScene` fails,
|
|
167
166
|
the pieces created before it still get their transforms; nothing is saved.
|
|
168
167
|
|
|
@@ -245,7 +244,7 @@ instances it off the scene tree, measures, and frees it.
|
|
|
245
244
|
in front of the hit plane); `hit_normal_pointed_away_from_the_ray_flipped`
|
|
246
245
|
(the ray hit a back face; the piece still mounts on the ray's side).
|
|
247
246
|
- **Check after:** `summer_starcast` with `directionSpace: "local"`. Its local
|
|
248
|
-
names follow
|
|
247
|
+
names follow the engine (`forward` = -Z, `back` = +Z), so a -Z back reads
|
|
249
248
|
`forward` blocked (or the surface in `contacts` when seated flush) and `back`
|
|
250
249
|
open.
|
|
251
250
|
- **Limits:** the back face is the visible-mesh AABB in the piece's own axes;
|
|
@@ -353,12 +352,3 @@ instances it off the scene tree, measures, and frees it.
|
|
|
353
352
|
- **Result, plane:** `{coplanar, plane, spread, off_plane_count, nodes [{path,
|
|
354
353
|
face, deviation, off_plane: proud|recessed}], no_geometry?}`.
|
|
355
354
|
- **Ops:** `RunSceneScript` (read-only).
|
|
356
|
-
|
|
357
|
-
## What belongs in the engine later
|
|
358
|
-
|
|
359
|
-
These tools compose existing ops. Natively they would be faster and exact:
|
|
360
|
-
an `InstantiateScene` that takes a transform (one request, one undo step per
|
|
361
|
-
piece), a compact `summer_batch` receipt mode in the ops executor, a raycast and
|
|
362
|
-
a measure op that need no script and do not mark the active tab unsaved, an
|
|
363
|
-
asset-geometry op that reads the import cache without instancing, and an
|
|
364
|
-
oriented-bounds (OBB) query so rotated pieces stop needing `space: "local"`.
|
|
@@ -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_slice_asset_sheet summer_get_studio_workflow summer_search_assets summer_import_from_url summer_import_asset_by_id summer_set_resource_property summer_add_node summer_set_prop
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_slice_asset_sheet summer_get_studio_workflow summer_search_assets summer_import_from_url summer_import_asset_by_id summer_set_resource_property summer_write_file summer_add_node summer_set_prop summer_save_scene
|
|
9
9
|
paths: ["assets/**", "sprites/**", "art/sprites/**"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -13,7 +13,7 @@ paths: ["assets/**", "sprites/**", "art/sprites/**"]
|
|
|
13
13
|
|
|
14
14
|
This skill produces a grid of animation frames for a 2D character — walk cycle, idle bob, attack swing, death sequence — and wires the result into an `AnimatedSprite2D` via a `SpriteFrames` resource.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Sprite-sheet generation from a single text-to-image call is **unreliable**. Models can render "a sprite sheet of a knight walking" and produce 8 frames, but the inter-frame consistency (same anatomy, same costume, same lighting) is poor. Limbs morph between frames. Pixel sprites get extra fingers in frame 3. The result usually looks worse than the static sprite did.
|
|
17
17
|
|
|
18
18
|
This skill therefore offers **three paths**, ranked by reliability:
|
|
19
19
|
|
|
@@ -38,7 +38,7 @@ So do not tell the user to cut a generated sheet by hand or in ImageMagick. The
|
|
|
38
38
|
- The character is 3D — use `generate-motion` for skeletal animation.
|
|
39
39
|
- The user wants a single static sprite → `pixel-art` or `character-portrait`.
|
|
40
40
|
- The user wants UI animation (loading spinner, button hover) — animate via `AnimationPlayer` rotating/tweening a static texture instead. Don't sprite-sheet UI.
|
|
41
|
-
- The user has 12+ frames per animation and 4+ animations
|
|
41
|
+
- The user has 12+ frames per animation and 4+ animations. That is dozens to hundreds of generations, each using credits. Pause and agree on scope first.
|
|
42
42
|
|
|
43
43
|
## Steps
|
|
44
44
|
|
|
@@ -62,7 +62,7 @@ Ask the user (or decide based on context):
|
|
|
62
62
|
| Higher-res character (128px+), 6-12 frames | **Per-frame img2img** |
|
|
63
63
|
| User wants exact-pixel consistency | **Aseprite manual** — AI cannot deliver exact pixels |
|
|
64
64
|
|
|
65
|
-
State the path before starting: "I'll do per-frame img2img
|
|
65
|
+
State the path before starting: "I'll do per-frame img2img: 6 generations. The first frame is the base; each next frame uses the previous one as reference. OK?"
|
|
66
66
|
|
|
67
67
|
### 3a. Path 1 — Per-frame img2img
|
|
68
68
|
|
|
@@ -74,11 +74,11 @@ summer_generate_image(
|
|
|
74
74
|
referenceImageUrl="<frame 1 fileUrl>",
|
|
75
75
|
model="nano-banana-2",
|
|
76
76
|
style="<same as base>",
|
|
77
|
-
|
|
77
|
+
removeBackground=true
|
|
78
78
|
)
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
`summer_generate_image` has no
|
|
81
|
+
`summer_generate_image` has no size argument; put negations in the prompt text. `removeBackground: true` gives you real alpha instead of a prompted "transparent background" that the model may paint as a literal checkerboard. `referenceImageUrl` only works on edit-capable models (`nano-banana-2`, `seedream-5-pro`, `nano-banana-lite`, `gpt-image-2`, `gemini-flash`, `flux-2`); `grok-imagine` has no edit endpoint and returns `edit_not_supported`.
|
|
82
82
|
|
|
83
83
|
Repeat for each frame. Save each as `goblin_walk_01.png`, `goblin_walk_02.png`, etc.
|
|
84
84
|
|
|
@@ -93,11 +93,11 @@ summer_generate_image(
|
|
|
93
93
|
prompt="goblin warrior walk cycle, sprite sheet, 6 frames in a horizontal row, identical character across frames, side view, frames clearly separated with empty space between them, consistent lighting, consistent palette. No scene background, no varying lighting, not a different character per frame.",
|
|
94
94
|
model="nano-banana-2",
|
|
95
95
|
style="none",
|
|
96
|
-
|
|
96
|
+
removeBackground=true
|
|
97
97
|
)
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
-
There is no `"pixel"` style preset (`style` is `realistic | cartoon | anime | none`; anything else is coerced to `none`)
|
|
100
|
+
There is no `"pixel"` style preset (`style` is `realistic | cartoon | anime | none`; anything else is coerced to `none`) and no size argument; the layout and the negations have to be in the prompt.
|
|
101
101
|
|
|
102
102
|
Then cut it with the same server-side slicer Studio uses, passing the asset id the generation returned:
|
|
103
103
|
|
|
@@ -113,7 +113,7 @@ Inspect the result. If the frames are coherent and the count matches, proceed. I
|
|
|
113
113
|
|
|
114
114
|
Tell the user:
|
|
115
115
|
|
|
116
|
-
> AI sprite-sheet generation is unreliable
|
|
116
|
+
> AI sprite-sheet generation is unreliable. For clean pixel animation, hand-author it in Aseprite (or Piskel, free in the browser). Onion-skin frame-by-frame; ~10 minutes for a 4-frame walk cycle. Want me to generate a base reference image you can trace?
|
|
117
117
|
|
|
118
118
|
If yes, generate the static base via `pixel-art` and stop here. The user takes it to Aseprite.
|
|
119
119
|
|
|
@@ -223,7 +223,7 @@ Frame 3: summer_generate_image(prompt="<base + delta>", referenceImageUrl="<fram
|
|
|
223
223
|
...
|
|
224
224
|
```
|
|
225
225
|
|
|
226
|
-
Tell the user to run via the Summer dashboard. Or recommend Aseprite (paid
|
|
226
|
+
Tell the user to run via the Summer dashboard. Or recommend Aseprite (paid) or Piskel (free, in the browser) for hand-authoring — for pixel art under 64×64, it is the faster path even with MCP available.
|
|
227
227
|
|
|
228
228
|
## Handoff
|
|
229
229
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: store-art
|
|
3
|
+
description: "Make Summer Games store art per slot and flow: key art, covers, icons, screenshots, trailer: size, shape, text rules, fallbacks."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: deployment
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: summer_read_library
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /store-art — store art
|
|
12
|
+
|
|
13
|
+
This skill covers every store art slot per flow (desktop and mobile): size, shape, text rules, fallbacks, and why each one matters.
|
|
14
|
+
|
|
15
|
+
Its current text lives on the hosted Summer Engine MCP, the same text the Studio agent reads, so it changes with the store and is never stale here. Load it before you act:
|
|
16
|
+
|
|
17
|
+
1. `summer_read_library` with id `skill/store-art` returns the current text when this machine has a store sign-in (`summer login --store`).
|
|
18
|
+
2. A host that shows MCP prompts or resources has it as the `store-art` prompt and the resource `summer://skills/store-art`.
|
|
19
|
+
3. Without a store sign-in: https://docs.summerengine.com/llms.txt lists every docs page; fetch any page as .md.
|
|
20
|
+
|
|
21
|
+
Screenshots: `summer_capture_gameplay` takes them offscreen. Get past the title screen with the game's own flags in `args` or with `steps`, e.g. `{"args":["--autostart"],"steps":[{"wait":3000},{"shot":true},{"key":"Space"},{"wait":800},{"shot":true}]}`.
|
|
22
|
+
|
|
23
|
+
The one rule to keep even before you load it: Key art, covers and icons carry no text: the stores draw the title over them. Screenshots are real play.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
id: skill/store-art
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Make Summer Games store art per slot and flow: key art, covers, icons, screenshots, trailer: size, shape, text rules, fallbacks."
|
|
5
|
+
use_when:
|
|
6
|
+
- "making or choosing store art for Summer Games: key art, cover, icon, screenshots, trailer"
|
|
7
|
+
- "summer_store_set_art rejects an image for its shape or size, or summer_store_get_listing says an art slot is missing"
|
|
8
|
+
- "deciding whether a store image may carry text, and which slot falls back to which"
|
|
9
|
+
facets:
|
|
10
|
+
lifecycle:
|
|
11
|
+
- launch
|
|
12
|
+
domains:
|
|
13
|
+
- creator
|
|
14
|
+
- assets
|
|
15
|
+
modalities:
|
|
16
|
+
- images
|
|
17
|
+
- video
|
|
18
|
+
related:
|
|
19
|
+
skills:
|
|
20
|
+
- skill/publish-your-game
|
|
21
|
+
- skill/store-listing
|
|
22
|
+
tools:
|
|
23
|
+
- tool/generate-image
|
|
24
|
+
- tool/capture-gameplay
|
|
25
|
+
- tool/list-my-assets
|
|
26
|
+
hosted_resource: "summer://skills/store-art"
|
|
27
|
+
source: official
|
|
28
|
+
license: MIT
|
|
29
|
+
status: stable
|
|
30
|
+
recommended: false
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: store-listing
|
|
3
|
+
description: "Write a Summer Games store page per flow (desktop, mobile): targets, title, tagline, descriptions, tags, and what never to write."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: deployment
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: summer_read_library
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /store-listing — store listing
|
|
12
|
+
|
|
13
|
+
This skill covers the store page text per flow (desktop and mobile): targets, title, tagline, descriptions, tags, and what never to write.
|
|
14
|
+
|
|
15
|
+
Its current text lives on the hosted Summer Engine MCP, the same text the Studio agent reads, so it changes with the store and is never stale here. Load it before you act:
|
|
16
|
+
|
|
17
|
+
1. `summer_read_library` with id `skill/store-listing` returns the current text when this machine has a store sign-in (`summer login --store`).
|
|
18
|
+
2. A host that shows MCP prompts or resources has it as the `store-listing` prompt and the resource `summer://skills/store-listing`.
|
|
19
|
+
3. Without a store sign-in: https://docs.summerengine.com/llms.txt lists every docs page; fetch any page as .md.
|
|
20
|
+
|
|
21
|
+
The one rule to keep even before you load it: Never invent features, modes, player counts, awards or prices.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: skill/store-listing
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Write a Summer Games store page per flow (desktop, mobile): targets, title, tagline, descriptions, tags, and what never to write."
|
|
5
|
+
use_when:
|
|
6
|
+
- "writing or fixing a game's store page text on Summer Games: title, tagline, description, tags"
|
|
7
|
+
- "summer_store_update_listing or summer_store_get_listing says a text field is missing or wrong"
|
|
8
|
+
- "choosing the targets (web, Mac, Windows, Linux, iPhone, Android) that decide the desktop and mobile store flows"
|
|
9
|
+
facets:
|
|
10
|
+
lifecycle:
|
|
11
|
+
- launch
|
|
12
|
+
domains:
|
|
13
|
+
- creator
|
|
14
|
+
- product-language
|
|
15
|
+
modalities:
|
|
16
|
+
- docs
|
|
17
|
+
related:
|
|
18
|
+
skills:
|
|
19
|
+
- skill/publish-your-game
|
|
20
|
+
- skill/store-art
|
|
21
|
+
hosted_resource: "summer://skills/store-listing"
|
|
22
|
+
source: official
|
|
23
|
+
license: MIT
|
|
24
|
+
status: stable
|
|
25
|
+
recommended: false
|
|
@@ -142,6 +142,6 @@ Every failure is final: none of them asks you to capture again.
|
|
|
142
142
|
|
|
143
143
|
## See also
|
|
144
144
|
|
|
145
|
-
- `
|
|
146
|
-
- `
|
|
147
|
-
- `
|
|
145
|
+
- `multiplayer` — where the client and the authority run
|
|
146
|
+
- `multiplayer-state` — the authority's Command handlers, where most events happen
|
|
147
|
+
- `summer-match-results` — results and ratings, which Summer records itself
|
|
@@ -42,7 +42,7 @@ Declining never blocks play. A game must work without these permissions.
|
|
|
42
42
|
|
|
43
43
|
**Availability:**
|
|
44
44
|
|
|
45
|
-
- **Engine release.** This needs an engine that includes
|
|
45
|
+
- **Engine release.** This needs an engine release that includes `SummerClientFriends`. On older engines, `Summer.client.friends` does not exist and scripts that use it fail to parse. Check the class reference for `SummerClientFriends` before using this skill.
|
|
46
46
|
- **Hosted only.** `is_available()` is `false` in Local Play and editor runs, for guests, for accounts the platform keeps out of social features (`age_restricted`, under 13), and in Summer apps without `player.friends@1` (friends) or `player.messaging@1` (messages).
|
|
47
47
|
- **Overlays.** The screens need the Summer app to offer friends and parties; otherwise they fail with `capability_unavailable` or `ui_unavailable`.
|
|
48
48
|
|
|
@@ -133,8 +133,8 @@ How it behaves:
|
|
|
133
133
|
- **When the list is read again.** With a handler on `changed`, the engine re-reads the list on every change hint, after a consent decision, on `refresh()`, and about every 60 seconds while the game is in front. Never poll yourself.
|
|
134
134
|
- **Statuses.** Show `in_this_game` friends first. `unknown` means presence couldn't be read; it is not `offline`.
|
|
135
135
|
- **Rows.** Key them by `user_id`; each read replaces the `SummerFriend` objects.
|
|
136
|
-
- **Profiles of other players.** For the people in the current match, use the user ids your authority publishes (the `players` map in `
|
|
137
|
-
- **Inviting a friend into a match.** Use the party invite sheet (`
|
|
136
|
+
- **Profiles of other players.** For the people in the current match, use the user ids your authority publishes (the `players` map in `summer-world-chat`, step 1) and call `show_profile(user_id)`. Your own id fails with `invalid_argument`.
|
|
137
|
+
- **Inviting a friend into a match.** Use the party invite sheet (`summer-parties`).
|
|
138
138
|
|
|
139
139
|
### 3. Direct messages (only if chat is central)
|
|
140
140
|
|
|
@@ -188,7 +188,7 @@ Local Play has no accounts, so check the hidden path locally:
|
|
|
188
188
|
- there are no script errors.
|
|
189
189
|
|
|
190
190
|
```
|
|
191
|
-
summer_project_setting
|
|
191
|
+
summer_project_setting key="summer/local_play/players" value=2
|
|
192
192
|
summer_play
|
|
193
193
|
summer_get_diagnostics
|
|
194
194
|
summer_stop
|
|
@@ -199,7 +199,7 @@ and revoke access in the Summer app, and watch `access_changed`.
|
|
|
199
199
|
|
|
200
200
|
## Checklist
|
|
201
201
|
|
|
202
|
-
- [ ] The engine's class reference lists `SummerClientFriends
|
|
202
|
+
- [ ] The engine's class reference lists `SummerClientFriends`.
|
|
203
203
|
- [ ] `summer.build.json` declares exactly the permissions the code asks for.
|
|
204
204
|
- [ ] Local Play: friends features are hidden, with no script errors.
|
|
205
205
|
- [ ] Declining consent leaves the game fully playable, and the button can ask again later.
|
|
@@ -216,11 +216,11 @@ and revoke access in the Summer app, and watch `access_changed`.
|
|
|
216
216
|
| Treat `unknown` as `offline` | Show it as unknown | It means presence couldn't be read |
|
|
217
217
|
| Poll `refresh()` on a timer | Connect `changed` | The engine already re-reads while a handler is connected |
|
|
218
218
|
| Declare every permission "just in case" | Declare only what you use | The consent sheet lists each declared permission |
|
|
219
|
-
| Use friends to put players in one match | `
|
|
219
|
+
| Use friends to put players in one match | `summer-parties` | Parties are how players play together |
|
|
220
220
|
|
|
221
221
|
## See also
|
|
222
222
|
|
|
223
|
-
- `
|
|
224
|
-
- `
|
|
225
|
-
- `
|
|
226
|
-
- `
|
|
223
|
+
- `summer-parties`: playing together, the invite sheet
|
|
224
|
+
- `summer-world-chat`: chat inside a match
|
|
225
|
+
- `multiplayer-publish`: `summer.build.json` and publishing a Build
|
|
226
|
+
- `multiplayer-testing`: what Local Play can and can't test
|
|
@@ -31,7 +31,7 @@ Under Local Play they fail with a typed code (step 5); the authority's
|
|
|
31
31
|
degrade gracefully, and check the real numbers on a hosted staging build.
|
|
32
32
|
|
|
33
33
|
This skill extends the Courtyard game: its authority concludes matches as in
|
|
34
|
-
`
|
|
34
|
+
`summer-match-results`.
|
|
35
35
|
|
|
36
36
|
## Steps
|
|
37
37
|
|
|
@@ -104,7 +104,7 @@ func show_queue_board(queue: StringName) -> void:
|
|
|
104
104
|
pending returns the same operation.
|
|
105
105
|
|
|
106
106
|
After a match, `Summer.client.ratings.rating_committed` delivers the
|
|
107
|
-
player's own before-and-after rating (see `
|
|
107
|
+
player's own before-and-after rating (see `summer-match-results`).
|
|
108
108
|
|
|
109
109
|
### 3. Write a Game ranking from the authority
|
|
110
110
|
|
|
@@ -136,7 +136,7 @@ func _add_score(ranking: StringName, player_id: String, points: int) -> void:
|
|
|
136
136
|
```
|
|
137
137
|
|
|
138
138
|
`sessions` maps each `session_id` to the `SummerSession` the authority keeps
|
|
139
|
-
in `_on_session_joined` (`
|
|
139
|
+
in `_on_session_joined` (`summer-match-results`, step 1). The engine never
|
|
140
140
|
retries a write. After a failure other than a conflict, read the score before
|
|
141
141
|
deciding to write again: the first write may have committed.
|
|
142
142
|
|
|
@@ -226,6 +226,6 @@ on them.
|
|
|
226
226
|
|
|
227
227
|
## See also
|
|
228
228
|
|
|
229
|
-
- `
|
|
230
|
-
- `
|
|
231
|
-
- `
|
|
229
|
+
- `summer-match-results` — concluding matches, which moves ratings
|
|
230
|
+
- `summer-matchmaking` — declaring rated queues and teams
|
|
231
|
+
- `summer-player-data` — saving per-player progress that isn't a ranking
|
|
@@ -29,9 +29,9 @@ Where it works: all of this runs under Local Play with a deterministic
|
|
|
29
29
|
settlement, so the whole flow is testable locally. Rating values are real only
|
|
30
30
|
when hosted.
|
|
31
31
|
|
|
32
|
-
This skill extends the Courtyard game (`
|
|
33
|
-
`
|
|
34
|
-
With a team queue (`
|
|
32
|
+
This skill extends the Courtyard game (`multiplayer-project` and
|
|
33
|
+
`multiplayer-state`): the first player to collect `WIN_COINS` coins wins.
|
|
34
|
+
With a team queue (`summer-matchmaking`), their whole team wins.
|
|
35
35
|
|
|
36
36
|
## Steps
|
|
37
37
|
|
|
@@ -48,7 +48,7 @@ var sessions := {} # session_id -> SummerSession
|
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
In `_ready()`, next to the other World signals (skip this line if
|
|
51
|
-
`
|
|
51
|
+
`summer-player-data` already connected it):
|
|
52
52
|
|
|
53
53
|
```gdscript
|
|
54
54
|
world.session_joined.connect(_on_session_joined)
|
|
@@ -61,7 +61,7 @@ func _on_session_joined(session: SummerSession) -> void:
|
|
|
61
61
|
sessions[session.session_id] = session
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
If the game already has `_on_session_joined` (`
|
|
64
|
+
If the game already has `_on_session_joined` (`summer-player-data`
|
|
65
65
|
adds one), put the line at its start instead of defining it twice.
|
|
66
66
|
|
|
67
67
|
At the top of `_on_session_left`:
|
|
@@ -159,7 +159,7 @@ The rules `conclude` enforces:
|
|
|
159
159
|
refused. A rejected conclusion (`invalid_request`) commits nothing, so you
|
|
160
160
|
may conclude again with corrected arguments.
|
|
161
161
|
- `rating_deltas`, the third argument, is only for `authority_v1` queues
|
|
162
|
-
(`
|
|
162
|
+
(`summer-leaderboards`).
|
|
163
163
|
|
|
164
164
|
The settlement lists each player's committed rating changes:
|
|
165
165
|
|
|
@@ -205,7 +205,7 @@ func _on_server_disconnected(code: String, _detail: String) -> void:
|
|
|
205
205
|
show_status("The match has ended.")
|
|
206
206
|
```
|
|
207
207
|
|
|
208
|
-
`show_status` and the `Hud/Status` label come from `
|
|
208
|
+
`show_status` and the `Hud/Status` label come from `summer-matchmaking`.
|
|
209
209
|
|
|
210
210
|
- `match_result` arrives when the authority concludes. Its `rating_state` is
|
|
211
211
|
`RATING_STATE_PENDING` on a rated queue, or `RATING_STATE_NONE`.
|
|
@@ -232,7 +232,7 @@ func _on_server_disconnected(code: String, _detail: String) -> void:
|
|
|
232
232
|
`world.complete()` on a World that should keep running.
|
|
233
233
|
- `draining(deadline_unix)` on the World means Summer is shutting the server
|
|
234
234
|
down (maintenance). Conclude or save before the deadline
|
|
235
|
-
(`
|
|
235
|
+
(`summer-world-saves`).
|
|
236
236
|
|
|
237
237
|
A match that never concludes holds its players until the World is stopped;
|
|
238
238
|
every match needs an ending, including "everyone else left".
|
|
@@ -240,7 +240,7 @@ every match needs an ending, including "everyone else left".
|
|
|
240
240
|
### 5. Test it with Local Play
|
|
241
241
|
|
|
242
242
|
```
|
|
243
|
-
summer_project_setting
|
|
243
|
+
summer_project_setting key="summer/local_play/players" value=2
|
|
244
244
|
summer_play
|
|
245
245
|
summer_get_diagnostics
|
|
246
246
|
summer_stop
|
|
@@ -280,7 +280,7 @@ clients stay connected until they leave.
|
|
|
280
280
|
|
|
281
281
|
## See also
|
|
282
282
|
|
|
283
|
-
- `
|
|
284
|
-
- `
|
|
285
|
-
- `
|
|
286
|
-
- `
|
|
283
|
+
- `summer-matchmaking` — queues and teams that the outcome refers to
|
|
284
|
+
- `summer-leaderboards` — ratings and `authority_v1` rating moves
|
|
285
|
+
- `summer-world-saves` — persistent Worlds that outlive a match
|
|
286
|
+
- `multiplayer-testing` — running bots through a whole match
|