design-level · git:20260911.b4df358 · 2026-09-11 · sha256 3918117167e16c7d

design-level git:20260911.b4df358A

Immutable. This exact content never changes and is served at /api/v1/blob/3918117167e16c7d.

---
name: design-level
description: "Design a single level — layout, pacing, encounters, secrets, reward gating — outputs a level design doc and a node-tree skeleton for summer_create_scene."
license: MIT
compatibility: [Cursor, Claude Code, Windsurf, Codex]
category: level-design
user-invocable: true
allowed-tools: Read Grep Glob Write Edit summer_get_scene_tree summer_create_scene summer_open_scene summer_add_node summer_set_prop summer_save_scene summer_get_script_errors
paths: ["**/*.tscn", "**/*.gd", ".summer/**", "levels/**"]
---

# /design-level — Design One Level

## Overview

A level is a controlled sequence of player experiences in physical space. Layout, pacing, encounters, secrets, and reward gating must work together — a "fun layout" with a flat pacing curve still feels boring. This skill walks the six design beats of a single level and drops a node-tree skeleton ready for `summer_create_scene`.

**Core principle:** A level has a *pacing curve* and a *teaching arc*. If you can't draw the tension graph and name what the player learned by the end, the level isn't designed yet.

## Steps

### 1. Pin the level type

Ask exactly one question:

> What kind of level? Pick one: tutorial / hub / combat encounter / boss / exploration / puzzle / stealth / platforming-challenge / mixed.

Each type has different beats. Don't blend types in v1 — a "boss room with stealth and puzzles" is three levels poorly squeezed into one.

### 2. Read context

If `.summer/GameSoul.md` exists, read it. The level must serve the brief's core loop and the three mechanics.

```
Read .summer/GameSoul.md
```

If `.summer/mechanics/` exists, list the mechanics. Quote them back:

> Brief says mechanics are: dash, parry, double-jump. This level should *exercise* at least one and ideally combine two.

### 3. Define the teaching / experience goal

Ask plain:

> What does the player know by the end of this level that they didn't at the start?

Tutorial-level answer: "How to dash." Combat-encounter answer: "That parrying converts damage to mana, and that big enemies need parry, not dodge." Exploration answer: "That this region's secrets are hidden behind double-jumpable gaps."

If the user can't answer, the level has no purpose. Say it:

> If there's no answer to that question, the level is filler. Either give it a teaching goal, give it a *failure-state* goal (the player must die here to progress), or merge it into the next level.

### 4. Sketch the pacing curve

Draw it as text. Five beats, intensity 0-10:

```
Intro    Build    Peak    Release    Hook
 2  →    5    →   8   →    3      →   6
```

For a 5-minute encounter level:

| Beat | Duration | Intensity | Player feels | Designer plants |
|---|---|---|---|---|
| Intro | 30s | 2 | Calm, oriented | Visual landmark for the goal direction |
| Build | 90s | 5 | Tension rising, small pressure | First weak enemy / first puzzle clue |
| Peak | 60s | 8 | Stakes high, mistakes hurt | Main encounter / hardest fight |
| Release | 60s | 3 | Catharsis, loot | Reward + breath room |
| Hook | 30s | 6 | Curiosity for next | Visible-but-locked secret or path |

Show the curve. Ask:

> Pacing above. Does the peak land where you want, or does the level need a second wave?

### 5. List encounters and secrets

Encounters = explicit player tests (combat, puzzle, platforming). Secrets = optional rewards that respect the pacing curve.

State them flat. For a combat encounter level:

```
Encounters (in player-traversal order):
1. E1 — Tutorial enemy (1 weak grunt) at 0:30, in the open atrium. Teaches the basic attack.
2. E2 — Forced parry (mid-tier enemy with telegraphed wind-up) at 1:30, in a corridor with no dodge room. Teaches parry.
3. E3 — Mixed wave (2 grunts + 1 parry-required) at 3:00, in the peak arena. Tests both.
4. E4 — Mini-boss at 4:00 in the chamber. Combines.

Secrets (3 total — one per beat after intro):
- S1 (build beat): Behind a breakable wall in the corridor, holds 50 currency. Teaches "walls can break".
- S2 (peak beat): Visible from the arena, accessible only via parrying off an enemy. Rewards mastery.
- S3 (hook beat): Locked door, key in a future level. Plants curiosity for next level.
```

### 6. Define reward gating

What's behind which gate? Levels feel cheap when they hand out rewards without respecting the difficulty curve.

| Reward | Gate | Why |
|---|---|---|
| Heal pickup | After E2 | Player just learned parry; reward + safety net before the peak |
| New ability unlock | After mini-boss | Mastery-pinned; player demonstrates parry before getting upgrade |
| Currency cache | Behind S1 (breakable wall) | Optional; rewards observation |
| Story note | At the calm intro | Free; orients the player to the level's narrative |

Ask:

> Reward gating above. Anything missing or mis-placed?

### 7. Define the layout primitives

Every level is built from a small vocabulary of spaces. Name them. Most levels need 4-6 distinct spaces, no more.

For a combat-encounter level:

```
Spaces (node-tree skeleton):
World (Node3D)
├── Geometry (Node3D)
│   ├── IntroAtrium (Node3D)         # open, calm, well-lit
│   ├── Corridor (Node3D)            # tight, forces parry
│   ├── PeakArena (Node3D)           # large, multiple cover, exit visible
│   └── BossChamber (Node3D)         # contained, single exit, dramatic lighting
├── Spawns (Node3D)
│   ├── PlayerSpawn (Node3D)         # marker
│   ├── E1_Spawn (Node3D)
│   ├── E2_Spawn (Node3D)
│   ├── E3_Wave_Spawns (Node3D)
│   └── MiniBoss_Spawn (Node3D)
├── Triggers (Node3D)
│   ├── E2_GateTrigger (Area3D)      # locks door behind player on entry
│   ├── PeakWaveTrigger (Area3D)
│   └── BossDoorTrigger (Area3D)
├── Pickups (Node3D)
│   ├── HealAfterE2 (Node3D)
│   └── CurrencyS1 (Node3D)
├── Secrets (Node3D)
│   ├── S1_BreakableWall (StaticBody3D)
│   ├── S2_ParryLedge (StaticBody3D)
│   └── S3_LockedDoor (StaticBody3D)
└── Lighting (Node3D)                # WorldEnvironment + DirectionalLight3D
```

Show the skeleton. Ask:

> Tree above. May I create the level scene `levels/<level-name>.tscn` with this skeleton?

### 8. Scaffold via MCP

**Preferred (Summer MCP):**

`summer_create_scene` takes `path`, `rootName`, and a mandatory safety gate.
There is no `root_type` or `root_name` argument. The tool refuses to run unless
`allow_temporary_scene_mutation` is explicitly true, because of how it works: it
opens the currently-open scene (or the project's main scene) as a template,
removes every child, renames the root, saves-as to the new path, then reopens
the original. Ask the user before setting the flag.

The consequence to plan around: **the new scene's root node type is copied from
the template's root**, not chosen by you. Create levels from a scene whose root
is already `Node3D`, or fix the root afterwards in the editor.

```
summer_create_scene(path="res://levels/level_01.tscn", rootName="World", allow_temporary_scene_mutation=true)
summer_add_node(scenePath="res://levels/level_01.tscn", parent="./World", type="Node3D", name="Geometry")
summer_add_node(parent="./World/Geometry", type="Node3D", name="IntroAtrium")
summer_add_node(parent="./World/Geometry", type="Node3D", name="Corridor")
summer_add_node(parent="./World/Geometry", type="Node3D", name="PeakArena")
summer_add_node(parent="./World/Geometry", type="Node3D", name="BossChamber")
summer_add_node(parent="./World", type="Node3D", name="Spawns")
summer_add_node(parent="./World/Spawns", type="Node3D", name="PlayerSpawn")
summer_add_node(parent="./World/Spawns", type="Node3D", name="E1_Spawn")
# ... and so on
summer_add_node(parent="./World", type="Node3D", name="Triggers")
summer_add_node(parent="./World/Triggers", type="Area3D", name="E2_GateTrigger")
# ... etc.
summer_add_node(parent="./World", type="Node3D", name="Lighting")
summer_add_node(parent="./World/Lighting", type="WorldEnvironment", name="WorldEnvironment")
summer_add_node(parent="./World/Lighting", type="DirectionalLight3D", name="Sun")
summer_save_scene(scenePath="res://levels/level_01.tscn")
```

Every `summer_add_node` above takes the same required
`scenePath="res://levels/level_01.tscn"`; it is elided after the first line only
to keep the tree readable. A call without `scenePath` is rejected by the tool
schema. Better still, send the whole block as one `summer_batch(scenePath=...,
ops=[...])` so the user can undo the skeleton with a single Ctrl+Z.

This is a **skeleton, not playable geometry**. Markers and Area3Ds, no meshes, no enemy scripts. Implementation in subsequent sessions / templates.

**Fallback (no MCP):** Print the `.tscn` file contents for the user to save manually.

### 9. Save the level design doc

Always write the design doc — it's the artifact that drives implementation. Path: `.summer/levels/<level-name>.md`.

```markdown
# Level: <Name>

**Type:** combat encounter
**Duration target:** 5 min
**Teaching goal:** Player learns parry and that parrying mid-tier enemies is required, not optional.

**Pacing curve:** 2 → 5 → 8 → 3 → 6
**Beats:** Intro (30s) | Build (90s) | Peak (60s) | Release (60s) | Hook (30s)

## Encounters
- E1 — Tutorial grunt @ 0:30 (IntroAtrium)
- E2 — Forced parry @ 1:30 (Corridor)
- E3 — Mixed wave @ 3:00 (PeakArena)
- E4 — Mini-boss @ 4:00 (BossChamber)

## Secrets
- S1 — Breakable wall (Corridor) → 50 currency
- S2 — Parry-ledge (PeakArena) → cosmetic
- S3 — Locked door (BossChamber) → next level

## Reward Gating
- Heal pickup after E2
- Ability unlock after mini-boss

## Spaces
1. IntroAtrium — open, calm
2. Corridor — tight, forces parry
3. PeakArena — large with cover
4. BossChamber — contained, dramatic

## Open questions
<list anything the user couldn't answer>
```

Ask:

> May I create `.summer/levels/<level-name>.md` with this design doc?

### 10. Route to the next step

End with:

> Skeleton + design doc saved. Next:
> - `/design-mechanic` to design any mechanics this level requires that aren't designed yet.
> - `/design-npc` to design the enemies (E1-E4) in detail.
> - `/art-direction` if the visual style isn't pinned yet.
> - Or open `levels/<level-name>.tscn` and start blocking out geometry.

## Common mistakes

| Mistake | Fix |
|---|---|
| No teaching goal | Every level teaches something or fails. State it explicitly. |
| Flat pacing curve | If intensity stays at 5 the whole time, you have a hallway, not a level. |
| Too many spaces | 4-6 distinct spaces max. More fragments the player's mental map. |
| Encounters not tied to mechanics | E2 should *require* parry, not just allow it. Forced use teaches; optional use doesn't. |
| Secrets ignore the pacing curve | Don't put a major secret in the calm intro — players aren't curious yet. |
| Reward gating too generous | Free heals before the peak deflate the peak. Gate them after the test. |
| Blending level types | Stealth + puzzle + boss in one level = three half-baked levels. Pick one. |
| Building geometry before the skeleton | Skeleton-first lets you iterate on layout cheaply. Geometry comes after the design is locked. |
| Calling SetResourceProperty before the property holds a resource | Explicit `resource is null` error, not a silent drop. Assign the resource first (`summer_set_prop key="mesh" value="BoxMesh"`), then set its sub-properties. Scene-embedded sub_resources are fully supported targets. |

## Collaborative protocol

This skill creates a new scene file (`.tscn`) and a design doc (`.md`). Group writes per phase. Always ask before `summer_create_scene`.

## Want a working starter?

This is a workflow that produces a skeleton scene. For runnable level examples, see:

- `summer create 3d-fps-old-school` ships a sample arena.
- `summer create 3d-third-person-controller` gives a jump-capable character to test level layouts against.

The skeleton this skill produces is meant to be filled in via `/design-mechanic`, gridmap blockout, or a template merge.

## See also

- `scene-and-project/brainstorm-game/SKILL.md` — produces `.summer/GameSoul.md`
- `gameplay-mechanics/design-mechanic/SKILL.md` — designs the verbs the level exercises
- `ai-and-npcs/design-npc/SKILL.md` — designs the enemies the encounters reference
- `rendering-and-lighting/3d-lighting/SKILL.md` — sets the lighting in `WorldEnvironment` + lights
- `rendering-and-lighting/art-direction/SKILL.md` — defines the visual style the level expresses