summer-engine 2.0.0 → 2.3.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/{marketplace.json → .claude-plugin/marketplace.json} +3 -3
- package/.claude-plugin/plugin.json +37 -4
- package/.codex-plugin/plugin.json +38 -5
- package/.cursor-plugin/plugin.json +37 -4
- package/.factory-plugin/plugin.json +20 -0
- package/.opencode/INSTALL.md +9 -3
- package/.opencode/plugins/summer.js +0 -2
- package/AGENTS.md +51 -0
- package/CLAUDE.md +5 -0
- package/GEMINI.md +56 -0
- package/README.md +211 -61
- package/_persona/summer/SKILL.md +113 -0
- package/dist/commands/install.js +2 -2
- package/dist/commands/setup.js +4 -0
- package/dist/commands/skills.js +115 -2
- package/dist/lib/agent-config.d.ts +2 -2
- package/dist/lib/agent-config.js +171 -5
- package/dist/lib/skills-registry.d.ts +290 -26
- package/dist/lib/skills-registry.js +503 -1
- package/dist/mcp/tools/generate-tools.js +101 -0
- package/gemini-extension.json +2 -2
- package/package.json +9 -3
- package/skills/2d-assets/character-portrait/SKILL.md +196 -0
- package/skills/2d-assets/concept-art/SKILL.md +152 -0
- package/skills/2d-assets/pixel-art/SKILL.md +180 -0
- package/skills/2d-assets/skybox-panorama/SKILL.md +207 -0
- package/skills/2d-assets/sprite-sheet/SKILL.md +239 -0
- package/skills/2d-assets/tileable-texture/SKILL.md +205 -0
- package/skills/2d-assets/ui-graphics/SKILL.md +210 -0
- package/skills/3d-assets/character-model/SKILL.md +225 -0
- package/skills/3d-assets/environment-kit/SKILL.md +164 -0
- package/skills/3d-assets/organic-model/SKILL.md +192 -0
- package/skills/3d-assets/prop-model/SKILL.md +133 -0
- package/skills/3d-assets/vehicle-model/SKILL.md +202 -0
- package/skills/ai-and-npcs/design-npc/SKILL.md +3 -1
- package/skills/animation/animation-tree/SKILL.md +260 -0
- package/skills/animation/facial-and-lipsync/SKILL.md +282 -0
- package/skills/animation/generate-motion/SKILL.md +129 -0
- package/skills/animation/procedural-animation/SKILL.md +234 -0
- package/skills/animation/retarget/SKILL.md +172 -0
- package/skills/asset-pipeline/asset-strategy/SKILL.md +102 -212
- package/skills/audio/adaptive-music/SKILL.md +326 -0
- package/skills/audio/ambient-bed/SKILL.md +278 -0
- package/skills/audio/music-track/SKILL.md +268 -0
- package/skills/audio/sound-effect/SKILL.md +237 -0
- package/skills/audio/voice-line/SKILL.md +253 -0
- package/skills/catalog.yaml +249 -3
- package/skills/video/animated-loop/SKILL.md +200 -0
- package/skills/video/cinematic-cutscene/SKILL.md +204 -0
- package/skills/video/trailer-shot/SKILL.md +203 -0
- package/skills/visual-effects/_building-blocks/additive-billboard-particles.md +28 -0
- package/skills/visual-effects/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/skills/visual-effects/_building-blocks/trauma-shake-snippet.md +51 -0
- package/skills/visual-effects/{vfx → game-feel}/SKILL.md +1 -1
- package/skills/visual-effects/recipes/dissolve/SKILL.md +349 -0
- package/skills/visual-effects/recipes/fire/SKILL.md +387 -0
- package/skills/visual-effects/recipes/hit-spark/SKILL.md +330 -0
- package/skills/visual-effects/recipes/lightning/SKILL.md +372 -0
- package/skills/visual-effects/recipes/magic-glow/SKILL.md +377 -0
- package/skills/visual-effects/recipes/muzzle-flash/SKILL.md +326 -0
- package/skills/visual-effects/recipes/smoke/SKILL.md +381 -0
- package/skills/visual-effects/recipes/water-ripple/SKILL.md +340 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: character-portrait
|
|
3
|
+
description: Use when generating a single, polished bust/portrait of a character for dialogue UI, character-select screens, lore cards, or codex entries. One character, locked composition, VN-style. Trigger on "character portrait", "dialogue portrait", "VN portrait", "character bust", "headshot", "character select image", "lore card art".
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: 2d-assets
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url summer_set_resource_property
|
|
9
|
+
paths: ["assets/**", "art/portraits/**", "ui/portraits/**"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# character-portrait — Locked Bust for Dialogue UI
|
|
13
|
+
|
|
14
|
+
This skill produces ONE polished character portrait — bust or shoulders-up framing, neutral or stylized background, designed to drop into a dialogue UI, character-select screen, or lore card. It is the **opposite** of `summer:2d-assets/concept-art`: concept art explores; this skill commits.
|
|
15
|
+
|
|
16
|
+
The single biggest failure mode is **inconsistency across a cast**. Generating five party members one at a time without a locked anchor produces five images that look like they're from five different games — different lighting, different angle, different palette, different rendering style. This skill makes you write a **locked anchor suffix** the first time and re-use it verbatim for every subsequent portrait.
|
|
17
|
+
|
|
18
|
+
If the user is still exploring the look, this is the wrong skill — route to `summer:2d-assets/concept-art` first, lock a direction, then come back here. The `summer:asset-pipeline/asset-strategy` meta-router asks **"Quick check — exploring the look (3-4 variants for art direction) or generating a final character portrait for dialogue UI?"** to disambiguate.
|
|
19
|
+
|
|
20
|
+
## When to use
|
|
21
|
+
|
|
22
|
+
- "Generate a portrait for the merchant NPC."
|
|
23
|
+
- "I need a character-select image for the four playable heroes."
|
|
24
|
+
- "Make a lore-card image of the king."
|
|
25
|
+
- "Add a VN-style dialogue portrait for Aria."
|
|
26
|
+
- The cast is locked and the visual direction is locked; you're producing finals.
|
|
27
|
+
|
|
28
|
+
## When NOT to use
|
|
29
|
+
|
|
30
|
+
- The user is still exploring → `summer:2d-assets/concept-art`.
|
|
31
|
+
- The user wants pixel art → `summer:2d-assets/pixel-art`.
|
|
32
|
+
- The user wants a full-body 3D model → `summer:asset-pipeline/asset-strategy`.
|
|
33
|
+
- The user wants 4+ animated expressions of the same character — generate one base portrait here, then use img2img with the base as `referenceImageUrl` for each expression.
|
|
34
|
+
|
|
35
|
+
## Steps
|
|
36
|
+
|
|
37
|
+
### 1. Read or establish the locked anchor
|
|
38
|
+
|
|
39
|
+
Check `.summer/portrait-anchor.md` first.
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
Read .summer/portrait-anchor.md
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
If it doesn't exist, this is the first portrait in the cast — you must define the anchor now. Ask the user (or infer from `.summer/GameSoul.md`):
|
|
46
|
+
|
|
47
|
+
- **Framing:** bust (chest up) or shoulders-up?
|
|
48
|
+
- **Angle:** straight-on, three-quarter left, three-quarter right?
|
|
49
|
+
- **Lighting:** soft front, dramatic side, rim-lit, golden-hour?
|
|
50
|
+
- **Background:** flat color, soft gradient, painterly blur, in-world environment?
|
|
51
|
+
- **Rendering style:** painterly, anime, semi-realistic, line-art-with-flat-color?
|
|
52
|
+
|
|
53
|
+
Write the anchor to `.summer/portrait-anchor.md`:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
## Portrait anchor (re-use verbatim for every cast member)
|
|
57
|
+
|
|
58
|
+
framing: bust, shoulders to crown of head visible
|
|
59
|
+
angle: three-quarter view, slight turn to character's left
|
|
60
|
+
lighting: soft warm key from upper right, cool fill from left, gentle rim
|
|
61
|
+
background: muted painterly gradient, dark teal to deep brown, no scene detail
|
|
62
|
+
style: semi-realistic painterly, soft edges, oil-painting feel
|
|
63
|
+
aspect: portrait_4_3
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Every subsequent portrait in this cast appends the anchor to the prompt verbatim. **Do not edit the anchor mid-cast** unless the user explicitly says "I want the new ones to look different."
|
|
67
|
+
|
|
68
|
+
### 2. Search for an existing portrait
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
summer_search_assets(query="<character name> portrait", filter={ kind: "image" })
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Reuse beats regenerate. If the user wants to iterate on an existing one, pull its URL and pass it as `referenceImageUrl` for img2img.
|
|
75
|
+
|
|
76
|
+
### 3. Build the prompt — character + anchor
|
|
77
|
+
|
|
78
|
+
Pattern:
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
<character description>. <anchor framing/angle/lighting/background/style>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The character description should include: identity (age, build, hair, distinctive features), expression, costume/equipment, any signature prop. Keep it under 60 words including the anchor.
|
|
85
|
+
|
|
86
|
+
### 4. Confirm and call
|
|
87
|
+
|
|
88
|
+
> Generating Aria the witch portrait — 1 image, ~$0.02, model nano-banana-2, anchor locked from `.summer/portrait-anchor.md`. OK?
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
summer_generate_image(
|
|
92
|
+
prompt="Aria, young witch, mid-twenties, pale skin, long black hair with silver streak, sharp green eyes, half-smile, wearing dark indigo robes with silver embroidery, raven on shoulder. <anchor verbatim>",
|
|
93
|
+
model="nano-banana-2",
|
|
94
|
+
style="none",
|
|
95
|
+
options={ image_size: "portrait_4_3" }
|
|
96
|
+
)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`style: "none"` because the anchor's "semi-realistic painterly" already specifies style; the preset would fight it.
|
|
100
|
+
|
|
101
|
+
### 5. Import and wire into UI
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
summer_import_from_url(
|
|
105
|
+
url="<fileUrl from generation>",
|
|
106
|
+
path="res://ui/portraits/aria.png"
|
|
107
|
+
)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
For dialogue UI nodes, wire the texture into a `TextureRect`:
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
summer_set_resource_property(
|
|
114
|
+
nodePath="/root/UI/DialogueBox/PortraitRect",
|
|
115
|
+
resourceProperty="texture",
|
|
116
|
+
value="res://ui/portraits/aria.png"
|
|
117
|
+
)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
For character-select with multiple portraits, name files consistently: `aria.png`, `borin.png`, `cael.png`, `dara.png`. Index-able from code via `"res://ui/portraits/%s.png" % character_id`.
|
|
121
|
+
|
|
122
|
+
### 6. Iterate (img2img) instead of regenerating from scratch
|
|
123
|
+
|
|
124
|
+
If the user wants the portrait tweaked ("smaller smile", "darker robes"), use img2img with the existing image as `referenceImageUrl`. Preserves identity and lighting.
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
summer_generate_image(
|
|
128
|
+
prompt="<original prompt> with a smaller, more subtle smile",
|
|
129
|
+
referenceImageUrl="<previous fileUrl>",
|
|
130
|
+
model="nano-banana-2",
|
|
131
|
+
style="none"
|
|
132
|
+
)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Prompt patterns
|
|
136
|
+
|
|
137
|
+
| Goal | Prompt skeleton (subject part only — append anchor verbatim) | Why |
|
|
138
|
+
|---|---|---|
|
|
139
|
+
| Generic NPC | `<name>, <age> <build>, <hair>, <eyes>, <expression>, wearing <costume>` | Identity-first; no scene context |
|
|
140
|
+
| Hero / protagonist | `<name>, <age> <build>, <hair>, <distinctive feature>, confident <expression>, wearing <signature outfit>, holding <signature prop>` | Adds prop for memorability |
|
|
141
|
+
| Antagonist | `<name>, <imposing detail>, <unsettling expression>, wearing <costume with menacing detail>, <signature scar/mark>` | Antagonists need visual asymmetry |
|
|
142
|
+
| Lore card / king | `<name>, <age>, regal <expression>, wearing <ornate detail>, <crown/insignia>, formal portrait pose` | Formal pose overrides anchor's three-quarter |
|
|
143
|
+
| Expression variant | `<previous prompt> with <new expression: angry / surprised / sad / laughing>` + `referenceImageUrl: <base portrait>` | img2img preserves identity |
|
|
144
|
+
| Younger / older variant | `<character> as a <child / elder>` + `referenceImageUrl: <base>` | For flashback / time-skip portraits |
|
|
145
|
+
|
|
146
|
+
### Bad prompts (and why)
|
|
147
|
+
|
|
148
|
+
| Bad | Failure mode |
|
|
149
|
+
|---|---|
|
|
150
|
+
| `cool warrior portrait` | No identity, no anchor. Returns generic stock art. |
|
|
151
|
+
| `the witch but make her sad` (no img2img ref) | Without `referenceImageUrl`, you get a *different* witch who is sad. Identity drift. |
|
|
152
|
+
| Anchor inconsistent across cast | Each portrait looks like a different game. The cast doesn't read as a cast. |
|
|
153
|
+
| `full body portrait` | "Portrait" implies bust. If you want full body, say so explicitly AND switch to `image_size: "portrait_4_3"` framed full-body — but that's a different asset class; consider `concept-art` or 3D pipeline. |
|
|
154
|
+
| `transparent background` for a painterly portrait | Painterly + transparent fails on most models. Use a flat or gradient background, then alpha-cut in an editor if you must. |
|
|
155
|
+
|
|
156
|
+
## Anti-patterns
|
|
157
|
+
|
|
158
|
+
- **No anchor file.** Every cast member generated ad-hoc looks unrelated. Define the anchor on portrait #1, re-use for the rest of the cast.
|
|
159
|
+
- **Editing the anchor mid-cast.** If you change lighting from "warm key" to "dramatic side" halfway through, the cast splits visually. Either commit to the change and regenerate everyone, or stick with the anchor.
|
|
160
|
+
- **Regenerating from scratch when img2img would do.** Identity drifts every regen. Iterate via `referenceImageUrl`.
|
|
161
|
+
- **Using the portrait as a 3D reference.** Portraits have dramatic lighting, painterly backgrounds, and cropped framing — all of which corrupt 3D generation. For 3D, generate a separate clean white-bg full-body T-pose via `summer:asset-pipeline/asset-strategy`.
|
|
162
|
+
- **Using `style: "realistic"` or `"cartoon"`** when the anchor already names a style. The preset overrides the anchor.
|
|
163
|
+
|
|
164
|
+
## Edge cases
|
|
165
|
+
|
|
166
|
+
- **Character has a non-human silhouette (lizardfolk, demon, robot).** The anchor still applies — framing, lighting, background, rendering style. Only the subject description changes. Verify the model can hold the silhouette under "bust framing" — some models default to humanoid.
|
|
167
|
+
- **Player wants to swap costumes mid-game.** Generate one base portrait per costume (`aria_traveler.png`, `aria_robes.png`, `aria_armored.png`) and switch by index. Use img2img from the base for consistency.
|
|
168
|
+
- **Cast of 12+ characters.** Anchor discipline gets harder as fatigue sets in. Print the anchor as a header in your generation script and don't write any prompt without it.
|
|
169
|
+
- **User wants the portrait to "read at small size" (32×32 in a portrait list).** That's pixel-art territory; route to `summer:2d-assets/pixel-art`.
|
|
170
|
+
|
|
171
|
+
## Fallback (no MCP)
|
|
172
|
+
|
|
173
|
+
Print the prompt and the call:
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
summer_generate_image(prompt="<character + anchor>", model="nano-banana-2", style="none", options={ image_size: "portrait_4_3" })
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Tell the user to run via the Summer dashboard, then `summer_import_from_url` the result to `res://ui/portraits/<name>.png`.
|
|
180
|
+
|
|
181
|
+
## Handoff
|
|
182
|
+
|
|
183
|
+
After the portrait is wired:
|
|
184
|
+
|
|
185
|
+
- **More cast members** → re-invoke this skill with the same anchor. Don't redefine.
|
|
186
|
+
- **Expression variants** → re-invoke with `referenceImageUrl` set to the base portrait.
|
|
187
|
+
- **Pixel-art version of the same character** → `summer:2d-assets/pixel-art`.
|
|
188
|
+
- **3D model of the same character** → `summer:asset-pipeline/asset-strategy` (the portrait is NOT a usable 3D reference; generate a separate T-pose).
|
|
189
|
+
- **Dialogue system wiring** → `summer:scene-composition` for the UI hierarchy.
|
|
190
|
+
|
|
191
|
+
## See also
|
|
192
|
+
|
|
193
|
+
- `summer:2d-assets/concept-art` — explore the look first if not yet locked.
|
|
194
|
+
- `summer:asset-pipeline/asset-strategy` — meta-router and the 3D pipeline.
|
|
195
|
+
- `summer:scene-composition` — wiring the portrait into a dialogue UI scene.
|
|
196
|
+
- `_shared/mcp-tools-reference.md` — `summer_generate_image` parameter schema.
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: concept-art
|
|
3
|
+
description: Use when the user is exploring art direction — wants 3-4 rough variants of a character, environment, or prop to pick a vibe before committing to a final asset. Generates a batch of evocative concept images, not finals. Trigger on "concept art", "art direction", "explore the look", "give me some variants", "what could this character look like", "mood board", "rough sketches".
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: 2d-assets
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url
|
|
9
|
+
paths: ["assets/**", "art/**", "concepts/**"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# concept-art — Batch-of-Variants for Art Direction
|
|
13
|
+
|
|
14
|
+
This skill produces **3-4 rough concept images** of the same subject under different stylistic interpretations. The goal is not the final asset — the goal is to give the user something visual to react to so they can lock a direction. Variants are deliberately divergent (different palette, mood, framing, era) so the user has real choices, not four near-identical takes.
|
|
15
|
+
|
|
16
|
+
If the user wants ONE polished image (a dialogue portrait, a hero card), this is the wrong skill — route to `summer:2d-assets/character-portrait`. The `summer:asset-pipeline/asset-strategy` meta-router uses the disambiguation phrase **"Quick check — exploring the look (3-4 variants for art direction) or generating a final character portrait for dialogue UI?"** to send users to one of the two. If you arrived here without that question being asked, ask it before generating.
|
|
17
|
+
|
|
18
|
+
## When to use
|
|
19
|
+
|
|
20
|
+
- "I'm not sure what this character should look like — give me some options."
|
|
21
|
+
- "Show me 3-4 directions for the witch."
|
|
22
|
+
- "I want a mood board for the swamp level."
|
|
23
|
+
- Early-project art direction, before the GameSoul.md visual style is locked.
|
|
24
|
+
- The user describes a vibe ("dark fantasy", "Ghibli-esque", "Mobius") and wants to see it rendered.
|
|
25
|
+
|
|
26
|
+
## When NOT to use
|
|
27
|
+
|
|
28
|
+
- The user wants a single locked portrait for a dialogue UI → `summer:2d-assets/character-portrait`.
|
|
29
|
+
- The user wants pixel art specifically → `summer:2d-assets/pixel-art`.
|
|
30
|
+
- The user wants a UI icon or HUD element → `summer:2d-assets/ui-graphics`.
|
|
31
|
+
- The user wants a tileable wall/floor texture → `summer:2d-assets/tileable-texture`.
|
|
32
|
+
- The user wants an image-to-3D reference → `summer:asset-pipeline/asset-strategy` (the 3D pipeline has its own prompt suffix).
|
|
33
|
+
|
|
34
|
+
## Steps
|
|
35
|
+
|
|
36
|
+
### 1. Confirm exploration vs final
|
|
37
|
+
|
|
38
|
+
Before generating, ask once:
|
|
39
|
+
|
|
40
|
+
> Quick check — exploring the look (3-4 variants for art direction) or generating a final character portrait for dialogue UI?
|
|
41
|
+
|
|
42
|
+
If "final" → hand off to `summer:2d-assets/character-portrait`. If "explore" → continue.
|
|
43
|
+
|
|
44
|
+
### 2. Search for prior concepts
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
summer_search_assets(query="<subject> concept", filter={ kind: "image" })
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
If something already exists, ask if the user wants to riff on it (img2img via `referenceImageUrl`) or start fresh.
|
|
51
|
+
|
|
52
|
+
### 3. Pick a variant axis
|
|
53
|
+
|
|
54
|
+
Variants must differ on **one explicit axis**, not noise. Pick one:
|
|
55
|
+
|
|
56
|
+
| Axis | Use when |
|
|
57
|
+
|---|---|
|
|
58
|
+
| Palette / mood | "Should this feel grim or hopeful?" |
|
|
59
|
+
| Era / setting | "Medieval, sci-fi, modern, post-apoc?" |
|
|
60
|
+
| Stylization | "Painterly, anime, photoreal, Mobius line-art?" |
|
|
61
|
+
| Silhouette / proportions | Character design — slim/bulky/childlike/monstrous |
|
|
62
|
+
| Time of day / lighting | Environment — dawn/noon/dusk/night |
|
|
63
|
+
|
|
64
|
+
State the axis to the user before generating: "I'll vary on **stylization** — painterly, anime, line-art, photoreal. OK?"
|
|
65
|
+
|
|
66
|
+
### 4. Generate the batch
|
|
67
|
+
|
|
68
|
+
Issue 3-4 calls in parallel, one per variant. Use the same subject phrasing across all four; only the style-modifier changes.
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
summer_generate_image(
|
|
72
|
+
prompt="<subject>. <axis variant 1>. concept art, evocative, rough painterly, atmospheric lighting",
|
|
73
|
+
model="nano-banana-2",
|
|
74
|
+
style="none",
|
|
75
|
+
options={ image_size: "landscape_16_9" }
|
|
76
|
+
)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`style: "none"` is intentional — concept art doesn't want the default "realistic" or "cartoon" preset overriding the prompt's stylistic direction.
|
|
80
|
+
|
|
81
|
+
### 5. Present the batch
|
|
82
|
+
|
|
83
|
+
After all 4 return, show the user the thumbnails (link `thumbnailUrl` for each) and ask:
|
|
84
|
+
|
|
85
|
+
> Which direction lands? I can generate variants on the chosen one, or hand off to `character-portrait` for a final.
|
|
86
|
+
|
|
87
|
+
Do NOT import any of these as `res://` assets yet. Concept art is reference, not shipped art. Only import once the user picks a winner — then either it goes to `character-portrait` for a polished version or directly to `summer_import_from_url` if they want to use it as-is as a reference.
|
|
88
|
+
|
|
89
|
+
## Prompt patterns
|
|
90
|
+
|
|
91
|
+
The structure: **subject + axis variant + "concept art" + lighting/atmosphere**. Keep prompts under 30 words.
|
|
92
|
+
|
|
93
|
+
| Goal | Prompt that works | Why |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| Character — palette axis | `young witch with raven familiar. <warm autumn palette / cold blue moonlit palette / sickly green swamp palette / monochrome ash palette>. concept art, painterly, atmospheric` | Locked subject + four explicit palettes |
|
|
96
|
+
| Character — silhouette axis | `goblin warrior. <slim wiry / hulking brute / childlike imp / multi-limbed mutant>. concept art, full body, rough painterly` | Forces real shape variation |
|
|
97
|
+
| Environment — mood axis | `swamp village at dusk. <hopeful warm lanterns / oppressive fog / abandoned ruins / overgrown nature reclaim>. concept art, wide shot, atmospheric` | Mood drives composition |
|
|
98
|
+
| Environment — stylization axis | `mountain temple. <Studio Ghibli soft painterly / Mobius clean line-art / dark Berserk ink / Hayao detailed wash>. concept art, wide establishing shot` | Names real reference styles the model recognizes |
|
|
99
|
+
| Prop — era axis | `royal sword. <bronze age / medieval / ornate baroque / sci-fi energy>. concept art, three-quarter view, neutral background` | Era as the only varying dimension |
|
|
100
|
+
| Creature — physiology axis | `forest spirit. <deer-like elegant / fungal grotesque / jellyfish floating / branch-and-moss elemental>. concept art, atmospheric, painterly` | Forces real morphological divergence |
|
|
101
|
+
|
|
102
|
+
### Bad prompts (and why)
|
|
103
|
+
|
|
104
|
+
| Bad | Failure mode |
|
|
105
|
+
|---|---|
|
|
106
|
+
| `cool fantasy character` | No subject, no axis. All 4 variants will look interchangeable. |
|
|
107
|
+
| `make 4 different witches` | Model doesn't render "4 of"; you must call 4 times. |
|
|
108
|
+
| `epic concept art masterpiece trending on artstation` | Adjective soup. Trending-on-artstation is a 2022 cliche; modern models render it as bland slop. |
|
|
109
|
+
| `same character but different` | "Different" is undefined. Pick an axis and name it. |
|
|
110
|
+
|
|
111
|
+
## Anti-patterns
|
|
112
|
+
|
|
113
|
+
- **Generating 4 near-identical variants** because you didn't pick a real axis. The user can't choose between four images that all look like the same painting.
|
|
114
|
+
- **Importing concept art as final assets.** These are exploration. The polished version comes from `character-portrait` after a direction is picked.
|
|
115
|
+
- **Using `style: "realistic"` or `style: "cartoon"`** — the preset fights the prompt's stylistic direction. Use `style: "none"` for concept art.
|
|
116
|
+
- **Skipping the disambiguation question.** If you don't ask, you'll get yelled at when you generate 4 portraits and the user wanted one polished bust.
|
|
117
|
+
- **Generating before the GameSoul.md is written.** If `.summer/GameSoul.md` exists, read it first — its visual-style section narrows the axis.
|
|
118
|
+
|
|
119
|
+
## Edge cases
|
|
120
|
+
|
|
121
|
+
- **User says "just one" after you propose 4.** That's a `character-portrait` job. Hand off.
|
|
122
|
+
- **User wants 8+ variants.** Generate 4 first; if the user wants more on the same axis, generate 4 more. Don't dump 8 at once — overload paralyzes choice.
|
|
123
|
+
- **Subject is a fully described scene, not an asset.** You're producing key art, not asset reference. Use `image_size: "landscape_16_9"` and bias toward atmospheric.
|
|
124
|
+
- **User wants the final to be 3D.** After they pick a direction, route to `summer:asset-pipeline/asset-strategy` — concept-art images are not 3D-ready references (they have backgrounds, scene context, dramatic lighting baked in). The 3D pipeline needs its own clean white-background reference.
|
|
125
|
+
|
|
126
|
+
## Fallback (no MCP)
|
|
127
|
+
|
|
128
|
+
Print the 4 prompts and the call for each:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
summer_generate_image(prompt="<variant 1>", model="nano-banana-2", style="none", options={ image_size: "landscape_16_9" })
|
|
132
|
+
summer_generate_image(prompt="<variant 2>", ...)
|
|
133
|
+
...
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Tell the user to run via the Summer dashboard, then come back and `summer_import_from_url` the winning variant.
|
|
137
|
+
|
|
138
|
+
## Handoff
|
|
139
|
+
|
|
140
|
+
Once the user picks a direction:
|
|
141
|
+
|
|
142
|
+
- **Character / NPC final** → `summer:2d-assets/character-portrait` (use the picked variant as `referenceImageUrl`).
|
|
143
|
+
- **3D model from this concept** → `summer:asset-pipeline/asset-strategy` (regenerate a 3D-ready reference; concept art is not 3D-ready as-is).
|
|
144
|
+
- **Tileable texture from this mood** → `summer:2d-assets/tileable-texture`.
|
|
145
|
+
- **Pixel-art version** → `summer:2d-assets/pixel-art`.
|
|
146
|
+
- **Lock the visual direction** → write the choice into `.summer/GameSoul.md` under `## Visual style` so future asset skills inherit it.
|
|
147
|
+
|
|
148
|
+
## See also
|
|
149
|
+
|
|
150
|
+
- `summer:asset-pipeline/asset-strategy` — meta-router that delegates here vs other 2d-assets skills.
|
|
151
|
+
- `summer:2d-assets/character-portrait` — the polished single-image counterpart.
|
|
152
|
+
- `_shared/mcp-tools-reference.md` — `summer_generate_image` parameter schema.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pixel-art
|
|
3
|
+
description: Use when generating pixel-art assets — sprites, items, tiles, portraits in a pixel style at a specific resolution (32×32, 64×64, 128×128). Pixel-perfect grid, limited palette, retro feel. Trigger on "pixel art", "8-bit art", "16-bit sprite", "pixel sprite", "retro tileset", "pixel icon", "pixel portrait".
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: 2d-assets
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url summer_set_resource_property
|
|
9
|
+
paths: ["assets/**", "art/pixel/**", "sprites/**"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# pixel-art — Pixel-Perfect Sprites and Tiles
|
|
13
|
+
|
|
14
|
+
This skill generates pixel-art assets — sprites, items, tiles, icons, portraits — at a target resolution (32×32, 64×64, 128×128, etc.). Pixel art has hard constraints (grid alignment, limited palette, no anti-aliased edges) that diffusion models violate by default. This skill encodes the prompt patterns and post-processing discipline that makes the output actually look like pixel art and not "blurry small image."
|
|
15
|
+
|
|
16
|
+
**Backing tool:** `summer_generate_image` with `style: "pixel"` and an explicit pixel-art prompt. Pass `options.image_size: "square_hd"` and have the agent enforce pixel-perfect by setting the project's default texture filter to Nearest (and downscaling to the target resolution post-gen). Output is upscaled by the model — you generally request a small generation (or downscale post-gen) to get crisp pixels.
|
|
17
|
+
|
|
18
|
+
## When to use
|
|
19
|
+
|
|
20
|
+
- "Generate a 32×32 sword icon for the inventory."
|
|
21
|
+
- "I need a pixel-art portrait of the merchant for the dialogue UI."
|
|
22
|
+
- "Make a 64×64 enemy sprite — a slime monster."
|
|
23
|
+
- "Generate a tileset for a grass / dirt / stone biome at 16×16 per tile."
|
|
24
|
+
- The game has a pixel-art aesthetic and the user wants assets in-style.
|
|
25
|
+
|
|
26
|
+
## When NOT to use
|
|
27
|
+
|
|
28
|
+
- The user wants a high-resolution painterly portrait → `summer:2d-assets/character-portrait`.
|
|
29
|
+
- The user wants animated frames (walk cycle, attack) → `summer:2d-assets/sprite-sheet` (pixel art is harder for sprite sheets — read that skill's caveats).
|
|
30
|
+
- The user wants a tileable seamless texture (not pixel art) → `summer:2d-assets/tileable-texture`.
|
|
31
|
+
- The game is 3D / non-pixel — verify the user actually wants pixel before generating.
|
|
32
|
+
|
|
33
|
+
## Steps
|
|
34
|
+
|
|
35
|
+
### 1. Lock the resolution and palette
|
|
36
|
+
|
|
37
|
+
Ask the user (or read `.summer/GameSoul.md`):
|
|
38
|
+
|
|
39
|
+
- **Resolution per asset:** 16×16, 32×32, 64×64, 128×128 are standard. Sprites usually 32 or 64; portraits 64 or 128; icons 16 or 32.
|
|
40
|
+
- **Palette:** named retro palette (NES 56-color, Game Boy 4-color green, PICO-8 16-color, Sweetie-16) OR custom hex list OR "no palette restriction."
|
|
41
|
+
- **Outline:** hard black outline, colored outline, or no outline?
|
|
42
|
+
|
|
43
|
+
Write to `.summer/pixel-anchor.md` so the rest of the cast/tileset stays consistent:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
## Pixel anchor
|
|
47
|
+
|
|
48
|
+
base resolution: 32x32 per sprite
|
|
49
|
+
palette: PICO-8 16-color
|
|
50
|
+
outline: hard 1px dark outline (NOT pure black — use the palette's darkest color)
|
|
51
|
+
shading: 3-tone (light, mid, shadow), no gradients, no AA
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 2. Search for existing assets
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
summer_search_assets(query="<subject> pixel", filter={ kind: "image" })
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 3. Build the prompt
|
|
61
|
+
|
|
62
|
+
Pattern:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
pixel art <subject>, <resolution>, <palette>, <outline rule>, <shading rule>, no anti-aliasing, no blur, sharp pixel edges, transparent background
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The model can't actually generate at 32×32 — it generates at 1024×1024 with pixel-art *style*. You then downscale to the target resolution post-import for crisp pixels.
|
|
69
|
+
|
|
70
|
+
### 4. Generate
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
summer_generate_image(
|
|
74
|
+
prompt="pixel art slime monster, 32x32 sprite, PICO-8 palette, hard 1px outline in palette's darkest color, 3-tone shading, no anti-aliasing, no blur, sharp pixel edges, transparent background, front-facing",
|
|
75
|
+
model="nano-banana-2",
|
|
76
|
+
style="pixel",
|
|
77
|
+
options={
|
|
78
|
+
image_size: "square_hd",
|
|
79
|
+
negative_prompt: "blurry, smooth gradients, anti-aliasing, photorealistic, 3D render, soft edges"
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
`negative_prompt` is critical for pixel art — without it the model smuggles in soft edges and gradients.
|
|
85
|
+
|
|
86
|
+
### 5. Downscale to target resolution
|
|
87
|
+
|
|
88
|
+
The generated image is 1024×1024 pixel-style. To get true crisp pixels at 32×32:
|
|
89
|
+
|
|
90
|
+
- Import to the engine, then in the import dock set `Filter: Nearest` (no smoothing).
|
|
91
|
+
- For a true 32×32 atlas/icon, downscale in an external editor (Aseprite, GIMP "nearest neighbor") to 32×32 before importing. Aseprite's "Sprite > Sprite Size" with Nearest gives the cleanest result.
|
|
92
|
+
- In Godot, set `Project Settings → Rendering → Textures → Default Texture Filter: Nearest` if the entire game is pixel-art. This kills bilinear smoothing project-wide.
|
|
93
|
+
|
|
94
|
+
### 6. Import and wire
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
summer_import_from_url(url="<fileUrl>", path="res://sprites/slime.png")
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
For a `Sprite2D`:
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
summer_set_resource_property(
|
|
104
|
+
nodePath="/root/Game/Slime/Sprite2D",
|
|
105
|
+
resourceProperty="texture",
|
|
106
|
+
value="res://sprites/slime.png"
|
|
107
|
+
)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Confirm `Filter: Nearest` is set in the import dock OR project-wide.
|
|
111
|
+
|
|
112
|
+
## Prompt patterns
|
|
113
|
+
|
|
114
|
+
| Goal | Prompt that works | Why |
|
|
115
|
+
|---|---|---|
|
|
116
|
+
| Item icon (32×32) | `pixel art iron sword icon, 32x32, NES palette, hard outline, 3-tone shading, no AA, sharp edges, transparent background, three-quarter view` | Three-quarter view reads better than pure side at 32px |
|
|
117
|
+
| Character sprite (64×64) | `pixel art knight character sprite, 64x64, PICO-8 palette, hard 1px outline, 3-tone shading, front-facing idle pose, no AA, sharp edges, transparent background` | Specifying "idle pose" prevents action poses that don't tile into a sheet |
|
|
118
|
+
| Pixel portrait (128×128) | `pixel art portrait of a young witch, 128x128, custom muted fantasy palette, hard outline, 4-tone shading, bust framing, looking forward, no AA, no blur, transparent background` | Higher resolution allows 4-tone shading; 32px is too small for that |
|
|
119
|
+
| Tileset (16×16/tile) | `pixel art top-down tileset, grass-to-dirt transition, 16x16 per tile, 3x3 grid layout, NES palette, hard outline between tiles, 3-tone shading, no AA, sharp edges` | Tilesets render best in a labeled grid layout |
|
|
120
|
+
| Background object (64×64) | `pixel art mossy boulder, 64x64, fantasy palette, hard outline, 3-tone shading, no AA, transparent background, three-quarter view` | Background props benefit from three-quarter for depth |
|
|
121
|
+
| GB-style asset (Game Boy) | `pixel art skeleton enemy, 32x32, Game Boy 4-color green palette (#0f380f, #306230, #8bac0f, #9bbc0f), hard 1px outline, 2-tone shading, no AA` | Naming the 4 hex codes locks the palette |
|
|
122
|
+
|
|
123
|
+
### Bad prompts (and why)
|
|
124
|
+
|
|
125
|
+
| Bad | Failure mode |
|
|
126
|
+
|---|---|
|
|
127
|
+
| `8-bit sword` | "8-bit" is interpreted loosely. Returns a smooth render of a sword with vague pixel feel. Specify resolution + palette + "no AA" explicitly. |
|
|
128
|
+
| `pixel art knight, photorealistic` | Conflicting directives. Model averages and gives you neither. |
|
|
129
|
+
| `pixel art at 32x32` (no negative_prompt) | Model adds soft edges and gradient shading. Always add negative prompt for AA / blur / gradients. |
|
|
130
|
+
| `pixel sprite walk cycle` | Walk cycles need consistent frames — single-prompt sprite sheets fail. Route to `summer:2d-assets/sprite-sheet`. |
|
|
131
|
+
| `cute pixel art` | "Cute" without subject is undefined. Specify what. |
|
|
132
|
+
|
|
133
|
+
## Anti-patterns
|
|
134
|
+
|
|
135
|
+
- **Skipping the downscale.** The model returns a 1024×1024 pixel-style image. If you import that as a 1024 texture, the "pixels" are actually 32-pixel blocks of soft color. Downscale to true target resolution OR set `Filter: Nearest` so the up-rendering doesn't smooth.
|
|
136
|
+
- **No `Filter: Nearest`.** Default Godot texture filtering is bilinear. Pixel art bilinearly filtered looks like garbage. Set it on import or project-wide.
|
|
137
|
+
- **No negative prompt.** Without `blurry, anti-aliasing, gradients, soft edges` in the negative, ~50% of generations are off-style.
|
|
138
|
+
- **Inconsistent palette across the cast.** Pick a named palette (PICO-8, NES, custom hex list) and re-use across every asset in the project. Different palettes = the project doesn't read as one game.
|
|
139
|
+
- **Generating walk-cycle frames as one image.** Sprite sheets via single-prompt are unreliable. Route to `summer:2d-assets/sprite-sheet`.
|
|
140
|
+
|
|
141
|
+
## Edge cases
|
|
142
|
+
|
|
143
|
+
- **User wants animated pixel sprites.** Generate base sprite here, then per-frame variants via img2img with the base as `referenceImageUrl`. For more than 2-3 frames, route to `summer:2d-assets/sprite-sheet` (and read its caveats).
|
|
144
|
+
- **User wants the entire game in pixel art.** Set `Project Settings → Rendering → Textures → Default Texture Filter: Nearest` once. Saves you from re-setting it on every import.
|
|
145
|
+
- **User wants a high-res "pixel art" portrait that's not actually pixelated** (faux-pixel-aesthetic at full resolution). That's `summer:2d-assets/character-portrait` with a "pixel art aesthetic" prompt — not this skill.
|
|
146
|
+
- **User specifies a palette like "Sweetie-16" or "Endesga-32" and the model ignores it.** Name the hex codes explicitly. Palette names alone are unreliable below the top 5-10 famous ones.
|
|
147
|
+
- **Tilesets need to tile cleanly.** Pixel-art tile-edge cleanliness from raw generation is poor. Generate the tile grid, then manually fix edge seams in Aseprite. The AI gets you 80% there.
|
|
148
|
+
|
|
149
|
+
## Fallback (no MCP)
|
|
150
|
+
|
|
151
|
+
Print the call:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
summer_generate_image(
|
|
155
|
+
prompt="<pixel art prompt with full anchor>",
|
|
156
|
+
model="nano-banana-2",
|
|
157
|
+
style="pixel",
|
|
158
|
+
options={ image_size: "square_hd", negative_prompt: "blurry, smooth gradients, anti-aliasing" }
|
|
159
|
+
)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Tell the user to run via the Summer dashboard, downscale in Aseprite/GIMP to true target resolution with nearest-neighbor, then `summer_import_from_url` (or drop into `res://sprites/`) and set `Filter: Nearest`.
|
|
163
|
+
|
|
164
|
+
If MCP is offline entirely: open Aseprite or Piskel and hand-author the asset. For pixel art at small resolutions, hand-authoring is often faster than fixing a generation.
|
|
165
|
+
|
|
166
|
+
## Handoff
|
|
167
|
+
|
|
168
|
+
After the asset is wired:
|
|
169
|
+
|
|
170
|
+
- **More assets in the same style** → re-invoke this skill, re-use the pixel anchor.
|
|
171
|
+
- **Animation frames for the sprite** → `summer:2d-assets/sprite-sheet` with the base sprite as anchor.
|
|
172
|
+
- **Pixel UI** → re-invoke with UI subjects (icons, button frames) at appropriate resolution.
|
|
173
|
+
- **Tilemap setup** → `summer:scene-composition` for `TileMap` / `TileMapLayer` wiring.
|
|
174
|
+
|
|
175
|
+
## See also
|
|
176
|
+
|
|
177
|
+
- `summer:2d-assets/sprite-sheet` — animated pixel frames.
|
|
178
|
+
- `summer:2d-assets/character-portrait` — high-res counterpart.
|
|
179
|
+
- `summer:asset-pipeline/asset-strategy` — meta-router.
|
|
180
|
+
- `_shared/mcp-tools-reference.md` — `summer_generate_image` schema.
|