summer-engine 3.3.0 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +4 -2
- package/.codex-plugin/plugin.json +5 -3
- package/.cursor-plugin/plugin.json +4 -2
- package/.factory-plugin/plugin.json +4 -2
- package/.opencode/INSTALL.md +8 -8
- package/.opencode/plugins/summer.js +2 -2
- package/AGENTS.md +7 -7
- package/CHANGELOG.md +50 -0
- package/GEMINI.md +1 -1
- package/NOTICE +1 -1
- package/README.md +32 -35
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/run.sh +2 -2
- package/assets/navigation/web-routes.json +1 -1
- package/commands/gameskill.md +2 -2
- package/commands/summer.md +25 -25
- package/dist/cli/commands/install.d.ts +10 -0
- package/dist/cli/commands/install.js +55 -10
- package/dist/cli/commands/open.d.ts +1 -1
- package/dist/cli/commands/run.d.ts +1 -1
- package/dist/cli/commands/run.js +1 -1
- package/dist/cli/commands/skills.js +2 -2
- package/dist/cli/commands/tool.d.ts +7 -0
- package/dist/cli/commands/tool.js +36 -1
- package/dist/core/api-client.d.ts +5 -6
- package/dist/core/api-client.js +12 -15
- package/dist/core/auth.js +2 -2
- package/dist/core/capabilities/asset-import.d.ts +0 -1
- package/dist/core/capabilities/camera-view.d.ts +1 -1
- package/dist/core/capabilities/camera-view.js +2 -2
- package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
- package/dist/core/capabilities/capture-gameplay.js +283 -0
- package/dist/core/capabilities/connect-signal.d.ts +1 -2
- package/dist/core/capabilities/connect-signal.js +1 -2
- package/dist/core/capabilities/console-read.d.ts +2 -2
- package/dist/core/capabilities/console-read.js +2 -2
- package/dist/core/capabilities/creator.js +1 -1
- package/dist/core/capabilities/doctor.d.ts +9 -1
- package/dist/core/capabilities/doctor.js +47 -4
- package/dist/core/capabilities/engine-receipt.d.ts +5 -7
- package/dist/core/capabilities/engine-receipt.js +7 -9
- package/dist/core/capabilities/engine-run.d.ts +4 -0
- package/dist/core/capabilities/engine-run.js +33 -5
- package/dist/core/capabilities/export-engine-version.d.ts +15 -0
- package/dist/core/capabilities/export-engine-version.js +24 -0
- package/dist/core/capabilities/export-game.d.ts +9 -1
- package/dist/core/capabilities/export-game.js +115 -39
- package/dist/core/capabilities/export-presets.d.ts +1 -1
- package/dist/core/capabilities/export-presets.js +1 -1
- package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
- package/dist/core/capabilities/fabricate-mesh.js +2 -3
- package/dist/core/capabilities/frame-quality.d.ts +4 -4
- package/dist/core/capabilities/frame-quality.js +4 -4
- package/dist/core/capabilities/grep.d.ts +1 -1
- package/dist/core/capabilities/grep.js +1 -1
- package/dist/core/capabilities/image-generation.d.ts +9 -0
- package/dist/core/capabilities/image-generation.js +19 -1
- package/dist/core/capabilities/navigation/open.d.ts +1 -1
- package/dist/core/capabilities/navigation/open.js +1 -1
- package/dist/core/capabilities/navigation/render-product-map.js +1 -1
- package/dist/core/capabilities/navigation/targets.js +2 -2
- package/dist/core/capabilities/placement-batch.d.ts +1 -1
- package/dist/core/capabilities/placement-batch.js +2 -2
- package/dist/core/capabilities/play-determinism.d.ts +1 -1
- package/dist/core/capabilities/play-determinism.js +1 -1
- package/dist/core/capabilities/publish-build.d.ts +15 -2
- package/dist/core/capabilities/publish-build.js +78 -28
- package/dist/core/capabilities/publish-download.d.ts +1 -2
- package/dist/core/capabilities/publish-download.js +2 -3
- package/dist/core/capabilities/replace-node.d.ts +1 -3
- package/dist/core/capabilities/replace-node.js +1 -3
- package/dist/core/capabilities/runtime-control.d.ts +5 -7
- package/dist/core/capabilities/runtime-control.js +7 -9
- package/dist/core/capabilities/scene-batch.d.ts +1 -1
- package/dist/core/capabilities/scene-batch.js +1 -1
- package/dist/core/capabilities/scene-kind.js +1 -1
- package/dist/core/capabilities/scene-readback.d.ts +3 -4
- package/dist/core/capabilities/scene-readback.js +3 -4
- package/dist/core/capabilities/scene-script.d.ts +2 -2
- package/dist/core/capabilities/scene-script.js +2 -2
- package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
- package/dist/core/capabilities/seeing/shot-store.js +1 -1
- package/dist/core/capabilities/summer-bundle.d.ts +2 -3
- package/dist/core/capabilities/summer-bundle.js +2 -3
- package/dist/core/capabilities/surface-snap.d.ts +1 -1
- package/dist/core/capabilities/surface-snap.js +1 -1
- package/dist/core/capabilities/tool-dispatch.js +11 -1
- package/dist/core/capabilities/ui-control.d.ts +1 -2
- package/dist/core/capabilities/ui-control.js +1 -2
- package/dist/core/capabilities/world-snapshot.d.ts +1 -1
- package/dist/core/capabilities/world-snapshot.js +1 -1
- package/dist/core/capability-skew.d.ts +2 -3
- package/dist/core/capability-skew.js +4 -5
- package/dist/core/config.js +2 -2
- package/dist/core/engine-install.d.ts +16 -0
- package/dist/core/engine-install.js +32 -2
- package/dist/core/feedback/client.js +1 -1
- package/dist/core/hosted-mcp.d.ts +115 -0
- package/dist/core/hosted-mcp.js +164 -0
- package/dist/core/launch-posture.d.ts +6 -3
- package/dist/core/launch-posture.js +18 -5
- package/dist/core/library-read.js +1 -2
- package/dist/core/templates.d.ts +1 -2
- package/dist/core/templates.js +1 -2
- package/dist/mcp/hosted-mount.d.ts +13 -59
- package/dist/mcp/hosted-mount.js +24 -30
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.js +5 -4
- package/dist/mcp/tools/creator-tools.js +14 -4
- package/dist/mcp/tools/debug-tools.js +1 -1
- package/dist/mcp/tools/generate-tools.js +19 -9
- package/dist/mcp/tools/navigation-tools.d.ts +1 -1
- package/dist/mcp/tools/navigation-tools.js +1 -1
- package/dist/mcp/tools/spatial-tools.js +1 -1
- package/dist/mcp/tools/visual-tools.js +2 -2
- package/dist/mcp/tools/with-engine.d.ts +1 -2
- package/dist/mcp/tools/with-engine.js +1 -2
- package/gemini-extension.json +3 -1
- package/hooks/session-start.sh +2 -2
- package/integrations/README.md +70 -76
- package/integrations/claude/README.md +0 -3
- package/integrations/codex/README.md +1 -2
- package/integrations/copilot-jetbrains/README.md +1 -1
- package/integrations/cursor/README.md +1 -2
- package/integrations/factory/README.md +15 -11
- package/integrations/mistral-vibe/README.md +1 -1
- package/integrations/opencode/README.md +1 -1
- package/integrations/roo-code/README.md +1 -1
- package/integrations/rovo-dev/README.md +1 -1
- package/integrations/trae/README.md +1 -1
- package/integrations/windsurf/README.md +3 -3
- package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
- package/library/references/gd-style/gd-style.md +4 -6
- package/library/references/godot-version/godot-version.md +3 -3
- package/library/references/headless-routing/headless-routing.md +2 -2
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -16
- package/library/references/product-map/product-map.md +1 -1
- package/library/references/public-surface-language/public-surface-language.md +1 -1
- package/library/references/summer-folder/summer-folder.md +1 -1
- package/library/skills/3d-lighting/SKILL.md +4 -4
- package/library/skills/README.md +11 -9
- package/library/skills/adaptive-music/SKILL.md +7 -7
- package/library/skills/ai-characters-in-games/SKILL.md +1 -1
- package/library/skills/ambient-bed/SKILL.md +12 -14
- package/library/skills/animated-loop/SKILL.md +42 -42
- package/library/skills/animation-tree/SKILL.md +6 -6
- package/library/skills/art-direction/SKILL.md +8 -11
- package/library/skills/asset-strategy/SKILL.md +3 -3
- package/library/skills/audio-direction/SKILL.md +8 -10
- package/library/skills/auto-fire-targeting/SKILL.md +4 -3
- package/library/skills/bounded-engine-runs/SKILL.md +95 -0
- package/library/skills/bounded-engine-runs/resource.yaml +29 -0
- package/library/skills/brainstorm-game/SKILL.md +5 -5
- package/library/skills/brainstorming/SKILL.md +9 -15
- package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
- package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
- package/library/skills/character-animation-wiring/SKILL.md +2 -2
- package/library/skills/character-model/SKILL.md +15 -26
- package/library/skills/character-movement/SKILL.md +1 -1
- package/library/skills/character-movement/references/movement-3d.md +1 -1
- package/library/skills/character-portrait/SKILL.md +4 -4
- package/library/skills/cinematic-cutscene/SKILL.md +38 -38
- package/library/skills/combat-basics/SKILL.md +1 -1
- package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
- package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
- package/library/skills/concept-art/SKILL.md +4 -4
- package/library/skills/create-asset-sheet/SKILL.md +12 -31
- package/library/skills/debug/SKILL.md +5 -4
- package/library/skills/debugging-game-feel/SKILL.md +1 -4
- package/library/skills/debugging-game-feel/resource.yaml +1 -1
- package/library/skills/design-level/SKILL.md +5 -5
- package/library/skills/design-mechanic/SKILL.md +6 -6
- package/library/skills/design-npc/SKILL.md +8 -15
- package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
- package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
- package/library/skills/environment-kit/SKILL.md +5 -5
- package/library/skills/export-and-ship/SKILL.md +25 -24
- package/library/skills/fabricating-assets/SKILL.md +1 -1
- package/library/skills/facial-and-lipsync/SKILL.md +5 -5
- package/library/skills/fps-controller/SKILL.md +17 -16
- package/library/skills/fps-controller/resource.yaml +0 -2
- package/library/skills/game-feel/SKILL.md +6 -7
- package/library/skills/gameskill/SKILL.md +3 -3
- package/library/skills/gdscript-patterns/SKILL.md +3 -3
- package/library/skills/generate-motion/SKILL.md +5 -22
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
- package/library/skills/headless-scripting/SKILL.md +8 -8
- package/library/skills/headless-scripting/resource.yaml +1 -0
- package/library/skills/in-game-purchases/SKILL.md +123 -118
- package/library/skills/in-game-purchases/resource.yaml +2 -2
- package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
- package/library/skills/investigating-bugs/SKILL.md +3 -11
- package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
- package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
- package/library/skills/make-game/SKILL.md +3 -5
- package/library/skills/make-game/references/2d-platformer.md +1 -1
- package/library/skills/multiplayer-project/SKILL.md +1 -1
- package/library/skills/multiplayer-testing/SKILL.md +4 -4
- package/library/skills/music-track/SKILL.md +40 -38
- package/library/skills/new-project/SKILL.md +4 -6
- package/library/skills/organic-model/SKILL.md +9 -9
- package/library/skills/pixel-art/SKILL.md +6 -6
- package/library/skills/play/SKILL.md +3 -4
- package/library/skills/playtesting-a-feature/SKILL.md +4 -6
- package/library/skills/procedural-animation/SKILL.md +10 -11
- package/library/skills/prop-model/SKILL.md +4 -4
- package/library/skills/psx-retro-rendering/SKILL.md +20 -20
- package/library/skills/psx-retro-rendering/resource.yaml +2 -3
- package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
- package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
- package/library/skills/remote-deploy/SKILL.md +20 -21
- package/library/skills/retarget/SKILL.md +19 -23
- package/library/skills/running-in-the-cloud/SKILL.md +5 -5
- package/library/skills/scene-composition/SKILL.md +5 -5
- package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
- package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
- package/library/skills/scene-scripting/SKILL.md +3 -3
- package/library/skills/scene-to-level/SKILL.md +28 -31
- package/library/skills/skill-create/SKILL.md +1 -1
- package/library/skills/skill-improve/SKILL.md +9 -9
- package/library/skills/skill-test/SKILL.md +10 -10
- package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
- package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
- package/library/skills/skybox-panorama/SKILL.md +8 -9
- package/library/skills/sound-effect/SKILL.md +19 -19
- package/library/skills/spatial-placement/SKILL.md +2 -2
- package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
- package/library/skills/sprite-sheet/SKILL.md +10 -10
- package/library/skills/summer-analytics/SKILL.md +3 -3
- package/library/skills/summer-friends/SKILL.md +10 -10
- package/library/skills/summer-leaderboards/SKILL.md +6 -6
- package/library/skills/summer-match-results/SKILL.md +13 -13
- package/library/skills/summer-matchmaking/SKILL.md +11 -11
- package/library/skills/summer-parties/SKILL.md +9 -9
- package/library/skills/summer-player-data/SKILL.md +12 -12
- package/library/skills/summer-store/SKILL.md +6 -6
- package/library/skills/summer-world-chat/SKILL.md +9 -9
- package/library/skills/summer-world-saves/SKILL.md +7 -7
- package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
- package/library/skills/tileable-texture/SKILL.md +1 -1
- package/library/skills/trailer-shot/SKILL.md +36 -36
- package/library/skills/tune-performance/SKILL.md +13 -13
- package/library/skills/tune-performance/resource.yaml +1 -1
- package/library/skills/ui-graphics/SKILL.md +7 -7
- package/library/skills/use-widget-asset/SKILL.md +7 -7
- package/library/skills/using-summer/SKILL.md +5 -7
- package/library/skills/vehicle-model/SKILL.md +6 -7
- package/library/skills/vehicle-model/resource.yaml +2 -2
- package/library/skills/verification-before-completion/SKILL.md +5 -6
- package/library/skills/vfx-dissolve/SKILL.md +4 -4
- package/library/skills/vfx-fire/SKILL.md +6 -6
- package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-hit-spark/SKILL.md +4 -4
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/SKILL.md +5 -5
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-magic-glow/SKILL.md +4 -4
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-smoke/SKILL.md +5 -5
- package/library/skills/vfx-water-ripple/SKILL.md +2 -2
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/voice-line/SKILL.md +9 -9
- package/library/skills/web-compatibility-look/resource.yaml +1 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
- package/library/skills/writing-plans/SKILL.md +4 -4
- package/library/skills/writing-skills/SKILL.md +8 -8
- package/library/tools/capture-gameplay/resource.yaml +73 -0
- package/library/tools/creator-publish/resource.yaml +4 -4
- package/library/tools/creator-releases/resource.yaml +5 -5
- package/library/tools/generate-image/resource.yaml +15 -1
- package/library/tools/publish-build/resource.yaml +6 -2
- package/package.json +1 -1
- package/registry/generated/aliases.json +1 -0
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +3 -1
- package/registry/generated/index.json +248 -135
- package/registry/generated/marketplace.claude.json +2 -2
- package/registry/generated/plugin.claude.json +4 -2
- package/registry/generated/plugin.codex.json +5 -3
- package/registry/generated/plugin.cursor.json +4 -2
- package/registry/generated/plugin.factory.json +4 -2
- package/registry/generated/skills-index.md +11 -9
- package/registry/generated/skills-registry.json +33 -6
- package/registry/schemas/domains.json +1 -1
|
@@ -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
|
|
|
@@ -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
|
|
@@ -20,7 +20,7 @@ groups searching players, reserves a server for them, and every player's
|
|
|
20
20
|
The authority then reads each player's team from the verified Session.
|
|
21
21
|
|
|
22
22
|
There is no lobby object, invite code or server browser. Friends who want to
|
|
23
|
-
play together use a party (`
|
|
23
|
+
play together use a party (`summer-parties`), which enters a queue as one group.
|
|
24
24
|
|
|
25
25
|
Where it works:
|
|
26
26
|
|
|
@@ -31,8 +31,8 @@ Where it works:
|
|
|
31
31
|
| Accept/Decline prompt | No: no proposal happens | Yes, when the queue declares `acceptance` |
|
|
32
32
|
| Rating-based grouping | No | Yes |
|
|
33
33
|
|
|
34
|
-
This skill extends the Courtyard game from `
|
|
35
|
-
`
|
|
34
|
+
This skill extends the Courtyard game from `multiplayer-project` and
|
|
35
|
+
`multiplayer-state`. Its client already joins `Game.QUEUE` and sends a
|
|
36
36
|
`join` Command; its authority publishes `match_doc`.
|
|
37
37
|
|
|
38
38
|
## Steps
|
|
@@ -64,7 +64,7 @@ The fields Summer accepts, and their rules:
|
|
|
64
64
|
| `minPlayers` / `maxPlayers` | Players per match | `minPlayers` ≥ 1, `maxPlayers` ≥ `minPlayers`. Measured support is up to 16 per match |
|
|
65
65
|
| `worldDefinition` | The WorldDefinition's `definition_id` | Required; every WorldDefinition must be used by a queue |
|
|
66
66
|
| `policy` | `fifo` (first come) or `rating` (group by skill) | `rating` needs `ratingSystemRef`; `fifo` must not declare one |
|
|
67
|
-
| `ratingSystemRef` | `elo_v1` (Summer rates two sides) or `authority_v1` (your authority reports rating moves) | See `
|
|
67
|
+
| `ratingSystemRef` | `elo_v1` (Summer rates two sides) or `authority_v1` (your authority reports rating moves) | See `summer-leaderboards` |
|
|
68
68
|
| `teams` | `{count, size}`: fixed sides, such as 2v2 = `{2, 2}` | `count` 2..64, `size` 1..16, `minPlayers` = `maxPlayers` = count × size; `elo_v1` needs exactly 2 teams |
|
|
69
69
|
| `acceptance` | `{"mode": "all", "ttl": "20s"}` asks every player to accept; `{"mode": "none"}` skips it | `ttl` required with `all`, forbidden with `none` |
|
|
70
70
|
| `searchTtl` | `{min, default, max}` search lifetime | Go durations (`30s`, `2m`); min ≤ default ≤ max |
|
|
@@ -249,8 +249,8 @@ one you name. In the editor and with `summer_play`, name it with the
|
|
|
249
249
|
`summer/local_play/queue` project setting:
|
|
250
250
|
|
|
251
251
|
```
|
|
252
|
-
summer_project_setting
|
|
253
|
-
summer_project_setting
|
|
252
|
+
summer_project_setting key="summer/local_play/queue" value="duel"
|
|
253
|
+
summer_project_setting key="summer/local_play/players" value=2
|
|
254
254
|
summer_play
|
|
255
255
|
summer_get_diagnostics
|
|
256
256
|
summer_stop
|
|
@@ -294,8 +294,8 @@ Test the accept prompt and rating-based grouping on a hosted staging build.
|
|
|
294
294
|
|
|
295
295
|
## See also
|
|
296
296
|
|
|
297
|
-
- `
|
|
298
|
-
- `
|
|
299
|
-
- `
|
|
300
|
-
- `
|
|
301
|
-
- `
|
|
297
|
+
- `multiplayer` — how Summer multiplayer fits together
|
|
298
|
+
- `summer-match-results` — ending a match and reporting who won
|
|
299
|
+
- `summer-leaderboards` — ratings and leaderboards for rated queues
|
|
300
|
+
- `summer-parties` — friends entering a queue together
|
|
301
|
+
- `multiplayer-testing` — Local Play options and bots
|
|
@@ -39,7 +39,7 @@ Outside a party, or when parties are unavailable, getters are empty and
|
|
|
39
39
|
`is_in_party()` is `false`. So the same Play button works everywhere: no party
|
|
40
40
|
means an ordinary `SummerJoinTarget.queue(...)` join. Build that path first.
|
|
41
41
|
|
|
42
|
-
This skill extends the Courtyard game from `
|
|
42
|
+
This skill extends the Courtyard game from `multiplayer-project`
|
|
43
43
|
(`network/game.gd` as `Game`, `client/main.gd` with `command()`).
|
|
44
44
|
|
|
45
45
|
## Steps
|
|
@@ -48,7 +48,7 @@ This skill extends the Courtyard game from `skill/multiplayer-project`
|
|
|
48
48
|
|
|
49
49
|
A party member must not join on their own the moment the game starts. Move the
|
|
50
50
|
join out of `client/main.gd`'s `_ready` into `enter(target)`, and keep every
|
|
51
|
-
signal connection from `
|
|
51
|
+
signal connection from `multiplayer-movement` and `multiplayer-state`:
|
|
52
52
|
|
|
53
53
|
```gdscript
|
|
54
54
|
func _ready() -> void:
|
|
@@ -87,7 +87,7 @@ func enter(target: SummerJoinTarget) -> bool:
|
|
|
87
87
|
return true
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
-
Move the Local Play bot hook from `
|
|
90
|
+
Move the Local Play bot hook from `multiplayer-testing` into `enter()`,
|
|
91
91
|
after the joined line.
|
|
92
92
|
|
|
93
93
|
### 2. Add the party node
|
|
@@ -193,7 +193,7 @@ fails with retryable `party_version_conflict`. React to `data_changed(key)` and
|
|
|
193
193
|
`member_data_changed(member, key)`, or just re-render on `changed`.
|
|
194
194
|
|
|
195
195
|
Party data is a lobby convenience, not game state. Once the match starts, the
|
|
196
|
-
authority owns everything (`
|
|
196
|
+
authority owns everything (`multiplayer-state`). It never sees party data;
|
|
197
197
|
send choices that matter in your `join` Command and validate them there.
|
|
198
198
|
|
|
199
199
|
### 4. Handle join failures
|
|
@@ -217,7 +217,7 @@ client joins solo from `_ready`. Test that path locally, then the party path
|
|
|
217
217
|
on Summer staging with real accounts.
|
|
218
218
|
|
|
219
219
|
```
|
|
220
|
-
summer_project_setting
|
|
220
|
+
summer_project_setting key="summer/local_play/players" value=2
|
|
221
221
|
summer_play
|
|
222
222
|
summer_get_diagnostics
|
|
223
223
|
summer_stop
|
|
@@ -247,7 +247,7 @@ summer_stop
|
|
|
247
247
|
|
|
248
248
|
## See also
|
|
249
249
|
|
|
250
|
-
- `
|
|
251
|
-
- `
|
|
252
|
-
- `
|
|
253
|
-
- `
|
|
250
|
+
- `summer-matchmaking`: queues, sizes, teams and the accept prompt
|
|
251
|
+
- `summer-friends`: friends list, profiles and messages
|
|
252
|
+
- `multiplayer-project`: the client entry scene this extends
|
|
253
|
+
- `multiplayer-testing`: Local Play, and what needs staging
|
|
@@ -39,8 +39,8 @@ Local Play's store keeps the latest value plus five earlier revisions, with
|
|
|
39
39
|
the same validation and `save_id` rules as hosted. Delete a persona's folder
|
|
40
40
|
to start that player fresh. Only hosted play proves durability.
|
|
41
41
|
|
|
42
|
-
This skill extends the game from `
|
|
43
|
-
`
|
|
42
|
+
This skill extends the game from `multiplayer-project` and
|
|
43
|
+
`multiplayer-state`: the authority's `_join` Command handler, the
|
|
44
44
|
private `mine` State group, and the `wallets` it keeps.
|
|
45
45
|
|
|
46
46
|
## Steps
|
|
@@ -70,7 +70,7 @@ var profiles := {}
|
|
|
70
70
|
```
|
|
71
71
|
|
|
72
72
|
In `_ready()`, next to the other `world` signals, before `Summer.initialize`
|
|
73
|
-
(connect `session_joined` only once if `
|
|
73
|
+
(connect `session_joined` only once if `summer-match-results` already
|
|
74
74
|
did):
|
|
75
75
|
|
|
76
76
|
```gdscript
|
|
@@ -83,7 +83,7 @@ did):
|
|
|
83
83
|
autosave.start()
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
If `_on_session_joined` already exists (`
|
|
86
|
+
If `_on_session_joined` already exists (`summer-match-results` adds
|
|
87
87
|
one), put this body at its end instead of defining it twice.
|
|
88
88
|
|
|
89
89
|
```gdscript
|
|
@@ -254,7 +254,7 @@ func _show_saved_progress() -> void:
|
|
|
254
254
|
|
|
255
255
|
### 6. Keep the publish checks passing
|
|
256
256
|
|
|
257
|
-
The source-graph check in `
|
|
257
|
+
The source-graph check in `multiplayer-publish` (step 4b) flags every
|
|
258
258
|
call ending in `load(` without a string literal inside, so
|
|
259
259
|
`Summer.authority.player_data.load(session)` and
|
|
260
260
|
`Summer.client.player_data.load()` report
|
|
@@ -274,7 +274,7 @@ Run the same session twice. Local Play personas (`player-1`, `player-2`)
|
|
|
274
274
|
keep their files between runs, so run 2 must start where run 1 ended.
|
|
275
275
|
|
|
276
276
|
```
|
|
277
|
-
summer_project_setting
|
|
277
|
+
summer_project_setting key="summer/local_play/players" value=2
|
|
278
278
|
summer_play
|
|
279
279
|
summer_get_diagnostics
|
|
280
280
|
summer_stop
|
|
@@ -284,7 +284,7 @@ summer_stop
|
|
|
284
284
|
```
|
|
285
285
|
|
|
286
286
|
From a terminal: `<summer> --path . --summer-local-play 2 --summer-local-play-headless --summer-local-play-timeout 20 -- --bot={client}`,
|
|
287
|
-
twice (see `
|
|
287
|
+
twice (see `multiplayer-testing` for bot mode). Print markers such as
|
|
288
288
|
`print("PROFILE_LOADED coins=", ...)` and `print("SAVED ", save_id, " revision=", commit.revision)` while testing, then check them.
|
|
289
289
|
|
|
290
290
|
Files: `~/Library/Application Support/Godot/app_userdata/<project name>/summer_local_player_data/<game id>/<persona>/public.json`
|
|
@@ -311,12 +311,12 @@ folder to start over.
|
|
|
311
311
|
| Start a second commit while one is pending | One commit per player and slot at a time | The second fails with `operation_in_progress` |
|
|
312
312
|
| Keep retrying after `player_data_superseded` | Stop saving through that Session | A newer World owns the player now |
|
|
313
313
|
| Store `Vector3`, `Color` or `null` | Plain JSON: numbers, strings, arrays, dictionaries | Unsupported types fail with `player_data_unsupported_type` |
|
|
314
|
-
| Save the match (positions, round score) | Save only what outlives the match | The World ends; `
|
|
314
|
+
| Save the match (positions, round score) | Save only what outlives the match | The World ends; `summer-world-saves` covers Worlds that persist |
|
|
315
315
|
| Truncate data that grew past 64 KiB | Refuse to grow; test the maximum size | `player_data_too_large` rejects the whole commit |
|
|
316
316
|
|
|
317
317
|
## See also
|
|
318
318
|
|
|
319
|
-
- `
|
|
320
|
-
- `
|
|
321
|
-
- `
|
|
322
|
-
- `
|
|
319
|
+
- `multiplayer-state` — the wallet and private State group this skill saves
|
|
320
|
+
- `summer-world-saves` — saving a whole persistent World instead of one player
|
|
321
|
+
- `multiplayer-testing` — bots and repeated Local Play runs
|
|
322
|
+
- `summer-leaderboards` — scores other players can see
|
|
@@ -45,8 +45,8 @@ proves nothing.
|
|
|
45
45
|
Items and offers are created in your game's Studio pages (`summer_open` target
|
|
46
46
|
`game`). Code never creates items.
|
|
47
47
|
|
|
48
|
-
This skill extends the Courtyard game from `
|
|
49
|
-
`
|
|
48
|
+
This skill extends the Courtyard game from `multiplayer-project` and
|
|
49
|
+
`multiplayer-state`.
|
|
50
50
|
|
|
51
51
|
## Steps
|
|
52
52
|
|
|
@@ -265,7 +265,7 @@ Walk through every outcome:
|
|
|
265
265
|
|
|
266
266
|
## See also
|
|
267
267
|
|
|
268
|
-
- `
|
|
269
|
-
- `
|
|
270
|
-
- `
|
|
271
|
-
- `
|
|
268
|
+
- `multiplayer-state`: Commands and the match document used for equipped items
|
|
269
|
+
- `multiplayer-testing`: Local Play fixtures and personas
|
|
270
|
+
- `summer-player-data`: saving a player's loadout between matches
|
|
271
|
+
- `summer-analytics`: measuring the shop
|
|
@@ -32,7 +32,7 @@ composition, and the authority neither sees nor writes them.
|
|
|
32
32
|
| Channel keys | 1–64 of `A-Z a-z 0-9 _ . -`, starting with a letter or digit; at most 64 channels per World |
|
|
33
33
|
| History | Best effort, not a full log. A new handle shows the newest 2 messages; `load_older()` grows the window to at most 16 |
|
|
34
34
|
| Lifetime | A handle belongs to one World admission. After leaving or joining another World, open a new one |
|
|
35
|
-
| Not included | Direct messages (`
|
|
35
|
+
| Not included | Direct messages (`summer-friends`), party chat (the Summer app) and messages written by your server |
|
|
36
36
|
|
|
37
37
|
**Hosted only.** Chat needs a joined hosted World and a Summer app whose Player
|
|
38
38
|
Host offers `player.channels`. A queue reservation is not enough: open the
|
|
@@ -40,8 +40,8 @@ channel after `enter()` succeeds. In Local Play and editor runs,
|
|
|
40
40
|
`check_open_readiness()` and `open_world_channel()` fail with `unavailable`.
|
|
41
41
|
Build the "chat hidden" path first.
|
|
42
42
|
|
|
43
|
-
This skill extends the Courtyard game from `
|
|
44
|
-
`
|
|
43
|
+
This skill extends the Courtyard game from `multiplayer-project` and
|
|
44
|
+
`multiplayer-state`.
|
|
45
45
|
|
|
46
46
|
## Steps
|
|
47
47
|
|
|
@@ -49,7 +49,7 @@ This skill extends the Courtyard game from `skill/multiplayer-project` and
|
|
|
49
49
|
|
|
50
50
|
Messages carry the author's Summer user id (`player_id`), not a name. The
|
|
51
51
|
authority already knows every verified name. Publish them in the shared match
|
|
52
|
-
document (`
|
|
52
|
+
document (`multiplayer-state`): in `authority/main.gd`'s `_join`, before
|
|
53
53
|
accepting, add
|
|
54
54
|
|
|
55
55
|
```gdscript
|
|
@@ -158,7 +158,7 @@ Call `$Chat.open()` after `enter()` returns `true`. Wire it into the UI:
|
|
|
158
158
|
Locally, check that the hidden path works and nothing errors:
|
|
159
159
|
|
|
160
160
|
```
|
|
161
|
-
summer_project_setting
|
|
161
|
+
summer_project_setting key="summer/local_play/players" value=2
|
|
162
162
|
summer_play
|
|
163
163
|
summer_get_diagnostics
|
|
164
164
|
summer_stop
|
|
@@ -189,7 +189,7 @@ Then test real chat on Summer staging with two accounts in one match.
|
|
|
189
189
|
|
|
190
190
|
## See also
|
|
191
191
|
|
|
192
|
-
- `
|
|
193
|
-
- `
|
|
194
|
-
- `
|
|
195
|
-
- `
|
|
192
|
+
- `multiplayer-state`: the match document that carries player names
|
|
193
|
+
- `summer-friends`: direct messages with friends
|
|
194
|
+
- `summer-parties`: party chat lives in the Summer app
|
|
195
|
+
- `multiplayer-testing`: what Local Play can and can't test
|