@ericrisco/rsc 0.1.35 → 0.1.36
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/README.md +8 -2
- package/manifest.json +241 -2
- package/package.json +1 -1
- package/scripts/lib/domains.js +1 -0
- package/scripts/lib/recommend.js +4 -0
- package/skills/game-design/SKILL.md +170 -0
- package/skills/game-design/evals/README.md +13 -0
- package/skills/game-design/evals/cases.yaml +47 -0
- package/skills/game-design/references/mechanics-and-loops.md +78 -0
- package/skills/game-design/references/playtesting-and-scope.md +58 -0
- package/skills/game-design/references/progression-and-economy.md +70 -0
- package/skills/game-storytelling/SKILL.md +159 -0
- package/skills/game-storytelling/evals/README.md +28 -0
- package/skills/game-storytelling/evals/cases.yaml +51 -0
- package/skills/game-storytelling/references/branching-and-state.md +134 -0
- package/skills/game-storytelling/references/dialogue-tools.md +117 -0
- package/skills/game-storytelling/references/environmental-storytelling.md +71 -0
- package/skills/gamedev-multiplayer/SKILL.md +250 -0
- package/skills/gamedev-multiplayer/evals/README.md +12 -0
- package/skills/gamedev-multiplayer/evals/cases.yaml +44 -0
- package/skills/gamedev-multiplayer/references/godot-high-level-multiplayer.md +133 -0
- package/skills/gamedev-multiplayer/references/prediction-and-latency.md +104 -0
- package/skills/gamedev-multiplayer/references/unity-and-unreal-netcode.md +166 -0
- package/skills/gamedev-pathing/SKILL.md +242 -0
- package/skills/gamedev-pathing/evals/README.md +14 -0
- package/skills/gamedev-pathing/evals/cases.yaml +49 -0
- package/skills/gamedev-pathing/references/navmesh-workflow.md +110 -0
- package/skills/gamedev-pathing/references/search-algorithms.md +135 -0
- package/skills/gamedev-pathing/references/steering-and-avoidance.md +120 -0
- package/skills/gamedev-physics/SKILL.md +225 -0
- package/skills/gamedev-physics/evals/README.md +12 -0
- package/skills/gamedev-physics/evals/cases.yaml +54 -0
- package/skills/gamedev-physics/references/character-controllers.md +120 -0
- package/skills/gamedev-physics/references/determinism-and-queries.md +124 -0
- package/skills/gamedev-physics/references/layers-and-masks.md +115 -0
- package/skills/gamedev-shaders/SKILL.md +252 -0
- package/skills/gamedev-shaders/evals/README.md +14 -0
- package/skills/gamedev-shaders/evals/cases.yaml +45 -0
- package/skills/gamedev-shaders/references/effect-recipes.md +205 -0
- package/skills/gamedev-shaders/references/godot-shading-language.md +133 -0
- package/skills/gamedev-shaders/references/unity-and-unreal-shaders.md +169 -0
- package/skills/gamedev-shipping/SKILL.md +236 -0
- package/skills/gamedev-shipping/evals/README.md +9 -0
- package/skills/gamedev-shipping/evals/cases.yaml +55 -0
- package/skills/gamedev-shipping/references/mobile-and-desktop.md +127 -0
- package/skills/gamedev-shipping/references/stores-and-ci.md +162 -0
- package/skills/gamedev-shipping/references/web-export-headers.md +140 -0
- package/skills/godot/SKILL.md +319 -0
- package/skills/godot/evals/README.md +13 -0
- package/skills/godot/evals/cases.yaml +50 -0
- package/skills/godot/references/export-and-testing.md +102 -0
- package/skills/godot/references/gdscript-style.md +84 -0
- package/skills/godot/references/godot3-to-4-traps.md +89 -0
- package/skills/godot/references/nodes-scenes-resources.md +109 -0
- package/skills/level-design/SKILL.md +175 -0
- package/skills/level-design/evals/README.md +35 -0
- package/skills/level-design/evals/cases.yaml +58 -0
- package/skills/level-design/references/blockout-to-art.md +118 -0
- package/skills/level-design/references/guidance-and-readability.md +152 -0
- package/skills/level-design/references/pacing-and-encounters.md +142 -0
- package/skills/roast-me/tools/adapters/__pycache__/__init__.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/base.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/claude.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/codex.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/gemini.cpython-312.pyc +0 -0
- package/skills/roast-me/tools/adapters/__pycache__/registry.cpython-312.pyc +0 -0
- package/skills/unity/SKILL.md +282 -0
- package/skills/unity/evals/README.md +8 -0
- package/skills/unity/evals/cases.yaml +43 -0
- package/skills/unity/references/build-and-platforms.md +65 -0
- package/skills/unity/references/input-system.md +102 -0
- package/skills/unity/references/lifecycle-deep-dive.md +75 -0
- package/skills/unreal/SKILL.md +270 -0
- package/skills/unreal/evals/README.md +12 -0
- package/skills/unreal/evals/cases.yaml +45 -0
- package/skills/unreal/references/blueprint-cpp-parity.md +109 -0
- package/skills/unreal/references/gameplay-framework.md +95 -0
- package/skills/unreal/references/packaging.md +83 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Mechanics, verbs, loops, and feel — deep dive
|
|
2
|
+
|
|
3
|
+
Engine-agnostic. This expands the SKILL.md sections on loops, MDA, verbs, and feel. No engine APIs — when a pattern needs code, it belongs to `godot` / `unity` / `unreal`.
|
|
4
|
+
|
|
5
|
+
## MDA in practice
|
|
6
|
+
|
|
7
|
+
Mechanics → Dynamics → Aesthetics is a lens, not a pipeline you fill in once.
|
|
8
|
+
|
|
9
|
+
- **Mechanics** — the rules, entities, and numbers you literally author: gravity value, damage table, spawn rules, win condition.
|
|
10
|
+
- **Dynamics** — the runtime behavior that emerges when players push on the mechanics: kiting, rushing, turtling, economy hoarding. You do not write dynamics; you *provoke* them with mechanics.
|
|
11
|
+
- **Aesthetics** — the emotional response the player actually has. This is the only layer they experience directly.
|
|
12
|
+
|
|
13
|
+
You author left-to-right but must **reason right-to-left**: start from the feeling you want, hypothesize a dynamic that would produce it, then author the mechanic that produces that dynamic. Playtest to see whether the real dynamic matches the intended one — it usually doesn't the first time.
|
|
14
|
+
|
|
15
|
+
### The eight aesthetics (name the one you want)
|
|
16
|
+
|
|
17
|
+
| Aesthetic | The feeling | Example games |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| Sensation | Sense-pleasure, "game as toy" | *Tetris*, rhythm games, *Katamari* |
|
|
20
|
+
| Fantasy | Make-believe, inhabiting a role | *Skyrim*, flight sims |
|
|
21
|
+
| Narrative | Drama unfolding | *Disco Elysium*, *The Last of Us* |
|
|
22
|
+
| Challenge | Obstacle course, mastery | *Celeste*, *Dark Souls*, *Trackmania* |
|
|
23
|
+
| Fellowship | Social framework, cooperation | *It Takes Two*, MMOs, *Among Us* |
|
|
24
|
+
| Discovery | Exploring the unknown | *Outer Wilds*, *Subnautica* |
|
|
25
|
+
| Expression | Self-discovery, creation | *Minecraft*, *The Sims*, *Animal Crossing* |
|
|
26
|
+
| Submission | Pastime, relaxation, "flow-off" | idle games, *Stardew Valley* farming |
|
|
27
|
+
|
|
28
|
+
Most games target **two or three**, weighted. Writing them down settles arguments: a feature that serves none of your chosen aesthetics is a cut candidate, however cool.
|
|
29
|
+
|
|
30
|
+
## Verbs are the game
|
|
31
|
+
|
|
32
|
+
The player's verb set — the actions available — is the truest description of a design. "A game about jumping and stomping" (Mario) says more than any feature list.
|
|
33
|
+
|
|
34
|
+
- **Depth over breadth.** A few verbs that interact combinatorially (chess: six piece-moves) yield more game than dozens of isolated ones. Interaction between verbs is where mastery and emergence live.
|
|
35
|
+
- **Verb economy test.** Before adding anything, ask: does this add a *new verb*, *deepen an existing verb's interactions*, or merely *add a number*? Numbers rarely add game.
|
|
36
|
+
- **Emergence vs progression** (Juul's distinction):
|
|
37
|
+
- *Emergent* games — simple rules, vast possibility space (chess, poker, *Spelunky*, roguelikes). Cheap to build, huge replay, hard to control the experience.
|
|
38
|
+
- *Progression* games — designer places a sequence of challenges (linear campaigns). Total authorial control, expensive per minute of play, low replay.
|
|
39
|
+
- Most games blend: an emergent core loop inside a progression frame.
|
|
40
|
+
|
|
41
|
+
## Loop layering, in detail
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
INPUT ─▶ [ moment-to-moment verb ] ─▶ immediate feedback ─▶ (repeat, seconds)
|
|
45
|
+
│ accrues into
|
|
46
|
+
[ session goal / run ] ─▶ session payoff ─▶ (minutes–1h)
|
|
47
|
+
│ funds
|
|
48
|
+
[ meta progression ] ─▶ lasting change ─▶ (across sessions)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
- **Moment-to-moment must be intrinsically fun.** Test: strip every goal, reward, and score — is the raw act of doing the verb still satisfying? If not, fix this before anything else. This is Bungie's "30 seconds of fun" — perfect the small loop, and the game is that loop repeated in varied contexts.
|
|
52
|
+
- **Session loop needs a shape.** Setup → rising tension → climax → resolution → hook. A run that just stops has no payoff; a run that ends on "so close" pulls the next one.
|
|
53
|
+
- **Meta loop is the return reason.** It converts session output (currency, XP, mastery, unlocks) into durable change. If the meta gives only numeric inflation and no new *choices or verbs*, players feel the grind without the growth.
|
|
54
|
+
- **Reward funding is the health check.** Each layer's reward should create desire for the next layer. Diagnose a "not fun" game by asking which loop is starved:
|
|
55
|
+
- Flat moment-to-moment → nothing above can save it.
|
|
56
|
+
- Empty meta → "great for an hour, then I bounced."
|
|
57
|
+
- Meta with no moment-to-moment joy → "I grind and don't know why."
|
|
58
|
+
|
|
59
|
+
## Feedback loops (system dynamics)
|
|
60
|
+
|
|
61
|
+
Distinct from "player feedback." These are the amplifying/damping loops in your systems.
|
|
62
|
+
|
|
63
|
+
- **Positive feedback loop** — success makes further success easier (rich-get-richer). Accelerates games to a conclusion and rewards early leads. Good for *ending* a game; dangerous if unchecked mid-game (snowball, runaway leader, blowouts).
|
|
64
|
+
- **Negative feedback loop** — success makes further success harder, or trailing players get help (catch-up, rubber-banding, escalating cost of dominance, *Mario Kart* items). Keeps games close and tense; overdone it punishes skill and feels unfair.
|
|
65
|
+
- **Design move:** use negative feedback to keep the mid-game close and positive feedback to force a decisive end — so games stay tense but still *end*.
|
|
66
|
+
|
|
67
|
+
## Game feel / juice as design intent
|
|
68
|
+
|
|
69
|
+
Feel is the moment-to-moment made tactile. Decide it here; the engine implements it.
|
|
70
|
+
|
|
71
|
+
- **Responsiveness first.** Immediate, legible reaction to every input beats visual fidelity. Perceived input latency destroys feel.
|
|
72
|
+
- **Juice vocabulary** — specify the *intent* and *trigger*, not the code:
|
|
73
|
+
- *Hit-stop / hit-pause* — freeze a few frames on impact to sell weight.
|
|
74
|
+
- *Screenshake* — amplitude scaled to significance; gratuitous shake reads as noise.
|
|
75
|
+
- *Anticipation & follow-through*, *squash-and-stretch* — animation principles that telegraph intent and add weight.
|
|
76
|
+
- *Particles, easing/tweening curves, layered SFX* — reinforce the action's magnitude.
|
|
77
|
+
- **Hidden generosity.** Coyote time (jump slightly after leaving a ledge), input buffering (queue an input landing a hair early), and forgiveness windows make a game feel *fair* and responsive without the player knowing why. These are design decisions with real numbers (frames/ms) — specify them; the engine skill wires them.
|
|
78
|
+
- **Boundary:** keyframes, curves, shader passes, and timing code are engine work. Here you produce a table of "action → intended feel → effect → trigger."
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Prototyping, playtesting, scope, and docs — deep dive
|
|
2
|
+
|
|
3
|
+
Engine-agnostic. Expands the SKILL.md sections on prototyping, playtesting, scope, and documenting design.
|
|
4
|
+
|
|
5
|
+
## The prototyping ladder
|
|
6
|
+
|
|
7
|
+
Climb only as far as each rung earns. Each rung is cheaper to change than the next.
|
|
8
|
+
|
|
9
|
+
1. **Riskiest-assumption first.** Name the single thing that, if it doesn't work, sinks the game (Is the core verb fun? Does the economy hold? Is the twist readable?). Prototype *that*, not the easy parts.
|
|
10
|
+
2. **Paper / cards.** Best for rules, turn order, economies, and card/board interactions. Simulate the loop by hand; you can rebalance in seconds with a pencil.
|
|
11
|
+
3. **Greybox / blockout.** Untextured, programmer-art mechanics running in the engine. Proves *feel* and moment-to-moment fun. If it isn't fun in greybox, art will not make it fun — this is the single most expensive lesson to learn late.
|
|
12
|
+
4. **Vertical slice.** One polished, representative sliver — one level or one loop at final quality — proving the game is worth finishing and showing what "done" looks like. Prefer this over a broad, shallow map of half-built features.
|
|
13
|
+
|
|
14
|
+
**Find the fun before you buy the art.** Art and audio are the most expensive assets and the hardest to change; commit them only after the mechanic underneath is proven.
|
|
15
|
+
|
|
16
|
+
## Playtesting
|
|
17
|
+
|
|
18
|
+
- **Watch, don't coach.** Say as little as possible. The instant you explain a control, you have destroyed the first-time-user signal you can never recapture from that tester.
|
|
19
|
+
- **Behavior over opinion.** Players are unreliable at diagnosing *what* is wrong and reliable at signaling *that* something is. When a tester says "the jump is fine" but dies to the same gap ten times, believe the deaths. Weight actions over words.
|
|
20
|
+
- **Protocols:**
|
|
21
|
+
- *Think-aloud* — tester narrates their thoughts live; surfaces confusion and mental model mismatches.
|
|
22
|
+
- *First-time-user (FTUE)* — a fresh tester with zero explanation; the harshest and most valuable test of onboarding.
|
|
23
|
+
- *Post-play interview* — ask open questions ("what would you tell a friend about this?"), never leading ones.
|
|
24
|
+
- **What to measure:**
|
|
25
|
+
- *Qualitative* — struggle points, boredom points, quit points, "aha" moments, emotional reactions.
|
|
26
|
+
- *Quantitative* — completion rate per section, time-per-section, death heatmaps, failure counts, and retention: **D1 / D7 / D30** (fraction returning 1/7/30 days later). Retention is the honest verdict on whether the loops hook.
|
|
27
|
+
- **Cadence:** test early, test ugly, test often. A rough test this week beats a polished one next month. Rotate testers — a tester can only be first-time once.
|
|
28
|
+
|
|
29
|
+
## Killing your darlings
|
|
30
|
+
|
|
31
|
+
- Cut any mechanic that does not serve the core loop or a design pillar — regardless of how clever it is or how long it took. A pile of unrelated clever mechanics is not a game.
|
|
32
|
+
- Signs a darling must die: it needs its own tutorial, it only shines in one contrived spot, playtesters ignore it, or defending it starts with "but it was hard to build" (sunk cost is not a design argument).
|
|
33
|
+
|
|
34
|
+
## Scope: the #1 indie killer
|
|
35
|
+
|
|
36
|
+
More indie games die of scope than of bad ideas, weak talent, or poor tools. The failure mode is always the same: a feature list that outruns the finish line.
|
|
37
|
+
|
|
38
|
+
- **Cut features, not quality.** A finished small game beats an unfinished ambitious one, every time. Shrinking scope preserves polish; cutting polish to keep scope produces a large mediocre thing nobody finishes.
|
|
39
|
+
- **Define "the one thing."** State in one sentence what the game is *about* and protect it. Everything that doesn't serve it is a candidate for the cut list.
|
|
40
|
+
- **Vertical slice over horizontal sprawl.** Build one loop end-to-end at quality before widening. A deep narrow slice ships; a wide shallow map of stubs does not.
|
|
41
|
+
- **A public cut list.** Keep an explicit "not doing" list next to the feature list. Naming what's *out* is as important as naming what's in — it ends the "wouldn't it be cool if…" spiral.
|
|
42
|
+
- **Budget by the finish, not the ambition.** Estimate remaining work against real available time; when they don't fit, the variable you move is scope, not the ship date and not sleep.
|
|
43
|
+
|
|
44
|
+
## Documenting design: the living one-pager
|
|
45
|
+
|
|
46
|
+
A 100-page design bible is stale the day after it's written and read by no one. Replace it with a living one-pager that grows only where a real decision needs recording.
|
|
47
|
+
|
|
48
|
+
One-page design doc contents:
|
|
49
|
+
|
|
50
|
+
- **Hook / fantasy** — one sentence: what is the player's power fantasy or core experience?
|
|
51
|
+
- **Pillars** — 2–4 short phrases (e.g. "tense stealth", "readable chaos", "no dead ends"). These are decision filters: every feature must serve a pillar or it is cut.
|
|
52
|
+
- **Core loop** — the moment-to-moment → session → meta chain in a few lines.
|
|
53
|
+
- **Verbs** — the actions the player has.
|
|
54
|
+
- **Target aesthetic** — the named MDA emotion(s), weighted.
|
|
55
|
+
- **MVP / vertical-slice scope** — the smallest thing worth building and playing.
|
|
56
|
+
- **Out of scope** — the explicit cut list.
|
|
57
|
+
|
|
58
|
+
Keep it a communication tool, not an archive: a versioned wiki page beats a locked document. Prune it as decisions settle; link deeper notes only where they earn their space.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Progression, economy, and balance — deep dive
|
|
2
|
+
|
|
3
|
+
Engine-agnostic. Expands the SKILL.md sections on progression, economy, difficulty, and balancing. All math here fits in a spreadsheet; no engine APIs.
|
|
4
|
+
|
|
5
|
+
## Progression pacing
|
|
6
|
+
|
|
7
|
+
- **Two parallel curves: difficulty and novelty.** Boredom comes from either flatlining. When difficulty must plateau (a rest area), spike novelty (a new mechanic, a set-piece); when novelty must pause, nudge difficulty. Never let both go flat at once.
|
|
8
|
+
- **Teach → test → twist.** Introduce a mechanic safely, test it under mild pressure, then combine it with an earlier mechanic. This is how you build *layered* mastery instead of a pile of unrelated tutorials.
|
|
9
|
+
- **Gate to control cognitive load.** Unlocks pace how many systems the player juggles at once. Front-loading every verb overwhelms; drip-feeding lets each verb be learned before the next.
|
|
10
|
+
- **Unlock quality bar.** Each unlock should add a **verb** or a **meaningful choice**, not just +N%. A stat bump is progression felt as grind; a new option is progression felt as growth.
|
|
11
|
+
|
|
12
|
+
## Economy: currencies, faucets, sinks
|
|
13
|
+
|
|
14
|
+
- **Currency taxonomy:**
|
|
15
|
+
- *Soft currency* — earned through play, spent freely (gold, scrap). Drives the core economy loop.
|
|
16
|
+
- *Hard / premium currency* — scarce or bought, gates high-value or aspirational items.
|
|
17
|
+
- *Time / energy* — a pacing gate (stamina systems); a sink on session length.
|
|
18
|
+
- *Prestige* — meta-currency earned by resetting progress; funds the long meta.
|
|
19
|
+
- **One currency, one job.** Every currency must have a distinct **sink** it exists to feed. If two currencies buy the same things, merge them. Currency without a sink is clutter and inflates.
|
|
20
|
+
|
|
21
|
+
### Faucets and sinks
|
|
22
|
+
|
|
23
|
+
- **Faucet** = anything that *creates* currency (quest rewards, drops, passive income).
|
|
24
|
+
- **Sink** = anything that *destroys* it (shop costs, upgrades, repairs, consumables, taxes/fees).
|
|
25
|
+
- The economy is healthy when total faucet output and total sink demand track each other over the play arc.
|
|
26
|
+
|
|
27
|
+
Core identity to model in a sheet:
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
net_income_rate = faucet_rate − sink_rate
|
|
31
|
+
time_to_afford = cost / net_income_rate
|
|
32
|
+
|
|
33
|
+
# escalating sink — the standard way to keep pace with rising income:
|
|
34
|
+
cost(n) = base × growth^n
|
|
35
|
+
# growth ≈ 1.07–1.15 for idle/incremental; higher = steeper wall
|
|
36
|
+
# solve for growth by pinning two target prices, or for base by pinning the first cost
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Tune `time_to_afford` against desired pacing (e.g. "a new tier every ~2 sessions"). Sweep the parameters in a spreadsheet before touching the engine.
|
|
40
|
+
|
|
41
|
+
### Runaway and inflation
|
|
42
|
+
|
|
43
|
+
- **Symptom:** `net_income_rate` grows faster than `cost(n)` → currency piles up, prices feel free, the late game trivializes. Or the reverse: sinks outpace faucets → progress stalls, players feel taxed.
|
|
44
|
+
- **Fixes for over-supply:** escalating/exponential sinks (`growth` above), consumable sinks (currency spent every session, not banked), soft/hard caps, and **prestige resets** that trade accumulated progress for a permanent multiplier and re-open the curve.
|
|
45
|
+
- **Multiplayer economies** add faucet leaks (duping, botting, gold farming) and player-to-player trade that can concentrate wealth — audit total money supply over time, not just per-player rates.
|
|
46
|
+
|
|
47
|
+
## Difficulty and balancing
|
|
48
|
+
|
|
49
|
+
### The curve
|
|
50
|
+
|
|
51
|
+
- **Sawtooth, not a straight ramp.** A rising baseline with peaks (bosses, gauntlets) and valleys (recovery, reward rooms). The valleys make the peaks legible and let the player breathe.
|
|
52
|
+
- **Flow channel** (Csikszentmihalyi via game design): keep perceived challenge tracking the player's rising skill, in the band between boredom (too easy for current skill) and anxiety (too hard). As skill grows, challenge must grow with it.
|
|
53
|
+
- **Perceived ≠ actual.** Telegraphing, readability, and generosity (see feel) change *perceived* difficulty without changing the numbers. A fair-feeling hard game keeps players; an unfair-feeling easy one loses them.
|
|
54
|
+
|
|
55
|
+
### Tuning knobs
|
|
56
|
+
|
|
57
|
+
- **Find the few high-leverage variables** — usually damage, health, spawn rate/density, resource cost, cooldown/duration. Most balance lives in a handful of them.
|
|
58
|
+
- **Change one at a time.** Chasing a symptom by moving five knobs makes cause un-attributable. Move one, retest, record.
|
|
59
|
+
- **Data-driven.** Put tunables in data (tables/config/spreadsheets), never hard-coded constants, so designers iterate without a rebuild and numbers are diffable and A/B-able. This skill decides *which* values are tunable and their ranges; the engine skill (`godot`/`unity`/`unreal`) builds the loader.
|
|
60
|
+
|
|
61
|
+
### Dominant strategies and intransitive balance
|
|
62
|
+
|
|
63
|
+
- **Dominant strategy** = an option that strictly beats the alternatives in most situations. It collapses the meta: every rational player converges on it and all other choices die.
|
|
64
|
+
- **Detect it:** watch playtests and telemetry for pick-rate/win-rate outliers, and for "solved" openings. High pick + high win = nerf target.
|
|
65
|
+
- **Fix toward intransitivity:** aim for rock-paper-scissors — every option is beaten by *some* other option, none beats all. Nerf the outlier or buff its counters; prefer many small changes over one sweeping one.
|
|
66
|
+
- **Symmetry vs asymmetry:** symmetric balance (mirror factions) is easy to make fair but flat; asymmetric balance (distinct factions/classes) is rich but must be balanced by *outcome parity* (equal win-rates), not by identical stats.
|
|
67
|
+
|
|
68
|
+
### Difficulty options & accessibility
|
|
69
|
+
|
|
70
|
+
- Decouple **challenge** from **exclusion**. Difficulty modes, assist toggles (aim assist, slow-mo, invulnerability), and separate sliders for enemy damage vs enemy health widen the audience without diluting the intended experience for those who want it. Accessibility is design, not charity — it grows the reachable player base.
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: game-storytelling
|
|
3
|
+
description: "Use when designing a game's STORY as an interactive system: premise, theme and narrative pillars; branching narrative and meaningful choice; dialogue trees with state and flags; quests, objectives and fail states; worldbuilding; environmental and systemic storytelling; and keeping story in harmony with play (avoiding ludonarrative dissonance). Engine-agnostic — it designs the narrative graph, variables and beats, then hands the wiring to the engine skill. Triggers: 'write my game's story/premise', 'branching narrative', 'dialogue system/tree', 'quest structure', 'worldbuilding', 'meaningful choices', 'illusion of choice', 'Ink/Yarn Spinner/Twine/articy narrative', 'story keeps fighting the gameplay'. NOT core mechanics, systems or balance (that's game-design); NOT spatial/level layout or encounter placement (that's level-design); NOT the actual dialogue-node code, save format or plugin wiring inside an engine (that's godot/unity/unreal)."
|
|
4
|
+
tags: [game, narrative, story, dialogue, quest, branching, worldbuilding]
|
|
5
|
+
recommends: [game-design, level-design]
|
|
6
|
+
profiles: [full]
|
|
7
|
+
origin: risco
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Game Storytelling — Narrative Design (engine-agnostic)
|
|
11
|
+
|
|
12
|
+
*Design the story as a system the player operates, not a script they watch. This skill owns the narrative graph — premise, pillars, branches, choices, dialogue state, quests, and the storytelling embedded in the world — and hands the runtime wiring to the engine skill.*
|
|
13
|
+
|
|
14
|
+
You produce **design artifacts**: a premise/theme/pillars doc, a branch topology, a state/flag table, dialogue in a portable format (Ink/Yarn/Twee/articy), quest specs, and environmental beats. You do **not** write engine node code, save-serialization, or plugin glue — that is `godot`/`unity`/`unreal`. A mechanic question (what the player *does*, economy, balance) is `game-design`; where things sit in space is `level-design`.
|
|
15
|
+
|
|
16
|
+
## Fires on / When NOT
|
|
17
|
+
|
|
18
|
+
Use when the request is about: a game's story or premise; branching or non-linear narrative; a dialogue system, tree, or conversation logic; quests, objectives, or mission structure; worldbuilding/lore for a game; meaningful choice vs. the illusion of choice; environmental or systemic storytelling; or story that "fights" the gameplay (ludonarrative dissonance).
|
|
19
|
+
|
|
20
|
+
Do NOT use (delegate or decline):
|
|
21
|
+
|
|
22
|
+
- Core loop, verbs, systems, progression, economy, difficulty, or balance → **game-design**.
|
|
23
|
+
- Spatial layout, encounter placement, sightlines, blockout, pacing *of a space* → **level-design**.
|
|
24
|
+
- Implementing the dialogue runner, save/serialize of story state, or wiring Ink/Yarn/articy into a build → the engine skill (**godot/unity/unreal**).
|
|
25
|
+
- Prose fiction, a screenplay, or a novel with no interactive/branching structure → general writing.
|
|
26
|
+
- Marketing copy, store page, or trailer script → **marketing**.
|
|
27
|
+
|
|
28
|
+
Story is a **system in service of play**. When you catch yourself designing a great scene the mechanics can't honor, reconcile it (see Ludonarrative harmony) rather than ship the dissonance.
|
|
29
|
+
|
|
30
|
+
## Premise, theme, and pillars (do this first)
|
|
31
|
+
|
|
32
|
+
Nail these before a single branch or line of dialogue. They are the constraint that keeps a branching story from sprawling into incoherence.
|
|
33
|
+
|
|
34
|
+
1. **Premise** — one sentence: *who*, in *what world*, wants *what*, against *what*. If it doesn't fit in a sentence, the story isn't decided yet.
|
|
35
|
+
2. **Theme** — the question the game argues about (loyalty vs. survival, cost of power). Theme is the filter for every choice; a choice that doesn't press on it is decoration.
|
|
36
|
+
3. **Narrative pillars** — 3–5 non-negotiables the story must always deliver (e.g. "every companion can die," "the player is never the chosen one"). Pillars kill scope arguments later.
|
|
37
|
+
4. **Tone & POV** — register (grim, wry, mythic), narrative distance (silent, voiced, ensemble), tense/person for text.
|
|
38
|
+
5. **Story-in-service-of-play** — write pillars so they are *expressed through the verbs the player already has*. If the theme is "trust is earned," the game needs a trust mechanic, not a paragraph asserting it.
|
|
39
|
+
|
|
40
|
+
### Ludonarrative harmony (avoid dissonance)
|
|
41
|
+
|
|
42
|
+
Dissonance is when the story says one thing and the mechanics say the opposite (the "caring family man" who murders a thousand henchmen). Diagnose and fix, in order:
|
|
43
|
+
|
|
44
|
+
- **Verb audit.** List what the player *does* most. Does the dominant verb match the theme and the protagonist's values? If the loop is "kill," a pacifist narrative is dissonant.
|
|
45
|
+
- **Reward audit.** What does the game *reward*? Rewards are the loudest narrative voice — if you reward hoarding but preach generosity, players believe the reward.
|
|
46
|
+
- **Fix by moving the cheaper piece.** Usually re-frame the narrative to match the mechanic rather than re-engineering the mechanic — but flag to **game-design** when only a mechanic change resolves it.
|
|
47
|
+
- **Failure & death.** Reconcile the fiction of losing (respawn, checkpoint, permadeath) with the story; unexplained respawns are the most common silent dissonance.
|
|
48
|
+
|
|
49
|
+
## Narrative structures for interactivity
|
|
50
|
+
|
|
51
|
+
Pick a topology deliberately; most games mix them. Full trade-offs, diagrams, and containment math → `references/branching-and-state.md`.
|
|
52
|
+
|
|
53
|
+
| Structure | Shape | Player agency | Author cost | Use when |
|
|
54
|
+
| --- | --- | --- | --- | --- |
|
|
55
|
+
| **Linear** | one path, story beats gated by progress | low (pacing only) | low | story-driven, cinematic, tight authorship |
|
|
56
|
+
| **Branching (tree)** | choices split, rarely rejoin | high, expensive | explodes fast | short, choice-showcase, replay-driven |
|
|
57
|
+
| **Hub-and-spoke** | central hub, self-contained spokes, return | medium (order + selection) | moderate, scales | quests/missions, RPGs, episodic |
|
|
58
|
+
| **Foldback / string-of-pearls** | branches diverge then **reconverge** at beats | feels high, stays bounded | moderate | the workhorse for long branching stories |
|
|
59
|
+
| **Environmental** | story embedded in space & objects, player-assembled | interpretive | front-loaded | immersive sims, exploration, "show don't tell" |
|
|
60
|
+
| **Systemic / emergent** | story generated by rules + player, not scripted | very high, uncurated | design not writing | sims, roguelikes, sandbox; the "anecdote factory" |
|
|
61
|
+
|
|
62
|
+
The pragmatic default for a story-heavy game is **foldback**: let choices matter locally, then reconverge on load-bearing beats so you author a bounded number of scenes. Pure trees are a trap (see below).
|
|
63
|
+
|
|
64
|
+
## Branching & choice
|
|
65
|
+
|
|
66
|
+
A choice is **meaningful** only if the player can (a) form an intent, (b) foresee a plausible consequence, and (c) later *see the consequence land*. Missing any leg makes it noise. Meaningful choice vs. the deliberate, defensible **illusion of choice**, plus state modeling and the combinatorial-explosion fix → `references/branching-and-state.md`.
|
|
67
|
+
|
|
68
|
+
- **Meaningful choice** changes state that the game later reads back to the player (a door, a death, a line, an ending). Track it with a **flag/variable**, not a duplicated scene.
|
|
69
|
+
- **Illusion of choice** (options that reconverge to the same outcome) is a legitimate tool for *expression and tone* — but never sell a fake choice as consequential; players feel the betrayal and stop trusting every future choice.
|
|
70
|
+
- **State & flags** are the spine. Model story state as named variables (`met_the_witch`, `reputation >= 3`, `betrayed_ally`). Gate content on state; don't copy-paste branches.
|
|
71
|
+
- **The combinatorial-explosion trap.** N independent binary choices imply 2^N futures — unauthorable past a handful. Contain it with:
|
|
72
|
+
- **Reconvergence (bottlenecks)** — funnel branches back to shared beats; the space between bottlenecks stays small.
|
|
73
|
+
- **Gates** — require a flag/level/item to open content, pruning the live branch set.
|
|
74
|
+
- **State over structure** — one scene that reads flags and swaps lines beats ten near-duplicate scenes.
|
|
75
|
+
- **Locality** — most choices affect only the current scene ("weave"); reserve the few loud choices for global state.
|
|
76
|
+
|
|
77
|
+
## Dialogue systems
|
|
78
|
+
|
|
79
|
+
Every dialogue tool reduces to the same four primitives — design against these, then let the engine skill wire the chosen tool. Deep tool comparison, a "pick one" guide, and the same conversation shown in Ink / Yarn / Twee → `references/dialogue-tools.md`.
|
|
80
|
+
|
|
81
|
+
- **Node** — a unit of content (a line, a passage, a knot) with an id you can jump to.
|
|
82
|
+
- **Condition** — boolean over story state that gates a node, option, or line (`if hasKey`, `if trust > 2`).
|
|
83
|
+
- **Variable** — the story state read/written by nodes (flags, counters, enums, inventory).
|
|
84
|
+
- **Effect** — a side effect a node fires (set a flag, give an item, start a quest, emit an engine event).
|
|
85
|
+
|
|
86
|
+
Tools (pointers — do not author engine glue here):
|
|
87
|
+
|
|
88
|
+
- **Ink** (inkle) — writer-first scripting language: knots/stitches, diverts `->`, once-only `*` / sticky `+` choices, gathers, weave, `VAR`, `LIST`, tunnels, threads, tags. Great for prose-heavy branching; runs via `inkjs` or engine integrations.
|
|
89
|
+
- **Yarn Spinner** (v3.x, current) — node-based, Twine-friendly: `<<set $var to x>>`, `<<if>>`, `<<jump>>`, commands, functions, markup. First-class Unity; Godot (C# beta, GDScript alpha); Unreal in progress.
|
|
90
|
+
- **Twine** — visual node editor, publishes standalone HTML; scripting depends on the **story format** (Harlowe, SugarCube, Snowman, Chapbook). Twee is its text form — a good neutral interchange.
|
|
91
|
+
- **articy:draft X** — heavyweight visual narrative DB (flow/dialogue fragments, hubs, conditions, instructions, entities); free Unity/Unreal importers and a **Generic Engine Export** (JSON) for anything else.
|
|
92
|
+
|
|
93
|
+
Author in one of these formats and keep dialogue **portable**; engine binding is a separate step owned by the engine skill.
|
|
94
|
+
|
|
95
|
+
## Quests & objectives
|
|
96
|
+
|
|
97
|
+
A quest is a small state machine plus presentation. Spec each quest with:
|
|
98
|
+
|
|
99
|
+
- **Trigger** — what activates it (talk to X, enter zone, flag set).
|
|
100
|
+
- **Objective(s)** — ordered or parallel steps; each a condition over world/story state.
|
|
101
|
+
- **States** — `unavailable → available → active → (step states) → complete / failed`, modeled explicitly. Ambiguous quest state is the #1 quest bug.
|
|
102
|
+
- **Tracking & presentation** — what the player sees (journal, marker, count). Design the *reveal*: don't show a marker for a step the player shouldn't know yet.
|
|
103
|
+
- **Rewards & consequences** — the flags/items/state the quest writes on completion *and* on failure.
|
|
104
|
+
- **Fail states** — decide per quest: can it fail, and is failure a dead-end, a branch, or lost content? **Failing forward** (failure opens a different path) beats a hard fail; **soft-locking the game** is a defect — always leave an escape.
|
|
105
|
+
- **Nesting & dependencies** — main/side/hidden; prerequisite flags; mutual exclusivity (faction A locks B). Track dependencies as gates, per the branching rules above.
|
|
106
|
+
|
|
107
|
+
## Environmental & systemic storytelling (show, don't tell)
|
|
108
|
+
|
|
109
|
+
Deliver story *through the world* so the player assembles it and feels ownership. Technique catalog, diegetic-vs-non-diegetic delivery, and the "anecdote factory" → `references/environmental-storytelling.md`.
|
|
110
|
+
|
|
111
|
+
- **Show, don't tell.** Prefer a scene the player reads (a skeleton clutching a locked door) over a paragraph narrating it. Text-dumps are the fallback, not the default.
|
|
112
|
+
- **Environmental storytelling** — set dressing, aftermath/traces, spatial sequencing, object placement, and readable item descriptions that imply events without narrating them. Coordinate with **level-design** for the space itself.
|
|
113
|
+
- **Systemic / emergent storytelling** — let rules + player generate stories you didn't script ("that time my colonist starved defending the fridge"). You design the *conditions and vocabulary* for stories, not the stories — a **game-design** collaboration.
|
|
114
|
+
- **Diegetic first.** Prefer in-world delivery (signage, barks, world change) over HUD/narrator; reserve non-diegetic (menus, codex, narrator) for what the world genuinely can't carry.
|
|
115
|
+
|
|
116
|
+
## Delivery: pacing, VO, localization-readiness
|
|
117
|
+
|
|
118
|
+
- **Pace the text.** Match line length to the moment; long paragraphs in combat go unread. Chunk to the display (one box-screen), respect reading speed, never block play with unskippable text.
|
|
119
|
+
- **VO considerations** *(design-side, not recording — that's audio/engine)* — write for the ear (contractions, short clauses); budget line counts early (VO is expensive and near-frozen once recorded); keep a **stable line ID** on every spoken line; don't splice recorded fragments across variables (gender/number/name concatenation breaks in most languages).
|
|
120
|
+
- **Localization-readiness** *(so the loc pipeline can do its job)* — externalize all player-facing text to string tables keyed by stable id; **never concatenate** sentences or embed grammar in code (gender/plural/word-order differ per language — use full templated strings with ICU-style placeholders); allow +30–40% text expansion; keep variables as named tokens (`{playerName}`), not positional; leave translator notes per line.
|
|
121
|
+
|
|
122
|
+
## Anti-patterns / rationalizations → STOP
|
|
123
|
+
|
|
124
|
+
| Rationalization | Reality / Fix |
|
|
125
|
+
| --- | --- |
|
|
126
|
+
| "I'll just branch it, players love choices" | Pure trees explode (2^N). Use foldback + gates; reconverge on beats. |
|
|
127
|
+
| "This choice feels huge" (but nothing reads it back) | If no later node reads the flag, the choice is noise. Show the consequence or cut it. |
|
|
128
|
+
| "Both options lead to the same scene, that's fine" | Only if it's expression, not stakes. Never sell a fake choice as consequential. |
|
|
129
|
+
| "The story explains why he's a mass murderer" | Words don't beat verbs. Fix the ludonarrative dissonance, don't narrate around it. |
|
|
130
|
+
| "Add an audio log to explain the backstory" | Text-dump is the fallback. Try to *show* it environmentally first. |
|
|
131
|
+
| "We'll localize later, just hardcode the strings" | Concatenation and hardcoded text break loc. Externalize to keyed string tables now. |
|
|
132
|
+
| "The quest can't be failed, simpler that way" | Sometimes; but soft-locking the game on a missed step is a defect — leave an escape. |
|
|
133
|
+
| "Let me wire this Ink file into Unity real quick" | Not this skill. Author portable narrative; hand wiring to the engine skill. |
|
|
134
|
+
|
|
135
|
+
## Related skills
|
|
136
|
+
|
|
137
|
+
- **game-design** — the verbs, systems, economy, and balance the story must serve; call it when resolving dissonance needs a *mechanic* change, or when designing systemic/emergent story conditions.
|
|
138
|
+
- **level-design** — the spatial layout and encounter flow environmental storytelling lives inside; co-own set-dressing narrative.
|
|
139
|
+
- **godot / unity / unreal** — the engine that wires the dialogue runner, quest state, save/serialize, and Ink/Yarn/articy plugins. Author portable; they implement.
|
|
140
|
+
- **marketing** — store page, premise pitch, trailer copy (external-facing, not in-game narrative).
|
|
141
|
+
|
|
142
|
+
## Checklist
|
|
143
|
+
|
|
144
|
+
- [ ] Premise (one sentence), theme, and 3–5 narrative pillars are written and agreed; every pillar is expressible through an existing player verb (no assert-only themes).
|
|
145
|
+
- [ ] Verb + reward audit done; any ludonarrative dissonance is fixed or escalated to game-design.
|
|
146
|
+
- [ ] A topology is chosen deliberately (default: foldback), not accidental tree sprawl; combinatorial explosion is contained (reconvergence + gates + locality) so the branch count is authorable.
|
|
147
|
+
- [ ] Story state is modeled as named variables/flags; content gates on state, not duplicated scenes.
|
|
148
|
+
- [ ] Every "meaningful" choice writes a flag some later node reads back to the player; no fake choice is sold as consequential.
|
|
149
|
+
- [ ] Dialogue authored in a portable format (Ink/Yarn/Twee/articy); engine wiring left to the engine skill.
|
|
150
|
+
- [ ] Each quest has explicit states, tracking, rewards/consequences, and a defined fail behavior (no silent soft-locks).
|
|
151
|
+
- [ ] Environmental/diegetic delivery preferred over text-dumps and non-diegetic narration where the world can carry it.
|
|
152
|
+
- [ ] All player-facing text externalized to keyed string tables; no concatenation; variables are named tokens; +30–40% expansion allowed.
|
|
153
|
+
- [ ] VO lines have stable IDs, are written for the ear, and the script is locked before recording is proposed.
|
|
154
|
+
|
|
155
|
+
## References
|
|
156
|
+
|
|
157
|
+
- `references/branching-and-state.md` — topologies + diagrams, meaningful vs. illusory choice, state modeling, and the combinatorial-explosion containment kit.
|
|
158
|
+
- `references/dialogue-tools.md` — Ink/Yarn/Twine/articy compared, the four primitives, a "pick one" guide, and the same conversation in three formats.
|
|
159
|
+
- `references/environmental-storytelling.md` — show-don't-tell catalog, diegetic vs. non-diegetic delivery, systemic/emergent storytelling and the anecdote factory.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Eval harness — `game-storytelling`
|
|
2
|
+
|
|
3
|
+
Agent-run eval, not a shell script. A human or judge-agent drives a Claude Code
|
|
4
|
+
agent and scores its behaviour against `cases.yaml`. There is no automated grader.
|
|
5
|
+
|
|
6
|
+
`cases.yaml` has three blocks: `should_trigger` (7), `should_not_trigger` (5),
|
|
7
|
+
and `capability` (2 scenarios with `must_include` rubrics).
|
|
8
|
+
|
|
9
|
+
## A. Triggering accuracy
|
|
10
|
+
|
|
11
|
+
Assert the skill fires on real narrative-design work (premise/pillars, branching
|
|
12
|
+
and choice, dialogue-tool authoring, quests, environmental storytelling,
|
|
13
|
+
ludonarrative harmony) and stays quiet on near-misses that belong to `game-design`
|
|
14
|
+
(mechanics/balance), `level-design` (spatial layout), the engine skill (dialogue
|
|
15
|
+
runner + save wiring), `marketing` (store/trailer copy), or plain prose fiction.
|
|
16
|
+
Load only this skill, run each prompt in a fresh session for 3–5 trials, and score
|
|
17
|
+
`should_trigger` as fire / `should_not_trigger` as don't-fire (bonus: routes to the
|
|
18
|
+
named `route_to`). Pass bar: ≥90% correct decisions across all trials.
|
|
19
|
+
|
|
20
|
+
## B. Capability uplift
|
|
21
|
+
|
|
22
|
+
Run each `capability` scenario WITH vs WITHOUT the skill and score against its
|
|
23
|
+
`must_include` rubric. The branching scenario checks the containment kit (2^N
|
|
24
|
+
framing, foldback/reconvergence, gates, state-over-structure, real-vs-illusory
|
|
25
|
+
choice) and engine-agnostic hand-off; the dissonance scenario checks the verb/
|
|
26
|
+
reward audit and cheaper-piece fix. Pass bar: WITH the skill covers ≥80% of rubric
|
|
27
|
+
points and clearly beats the baseline (which typically skips the explosion math,
|
|
28
|
+
conflates fake stakes with real choice, and writes engine code instead of a graph).
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
skill: game-storytelling
|
|
2
|
+
|
|
3
|
+
should_trigger:
|
|
4
|
+
- prompt: "I'm making a narrative RPG and I want the whole story to branch based on player choices, but I'm terrified it'll balloon into thousands of scenes I can't write. How should I structure it?"
|
|
5
|
+
why: "Branching narrative + the combinatorial-explosion fear — the skill's core containment guidance (foldback, gates, reconvergence, state-over-structure). Structure of the narrative graph, not engine code."
|
|
6
|
+
- prompt: "Help me write the premise, theme, and pillars for my game before I start on any of the actual story content."
|
|
7
|
+
why: "Premise/theme/narrative-pillars foundation — the skill's 'do this first' section. Explicitly narrative-design groundwork, not mechanics or balance."
|
|
8
|
+
- prompt: "My dialogue in Ink feels like it has a hundred fake choices that all lead to the same line. How do I make the choices actually matter?"
|
|
9
|
+
why: "Meaningful choice vs. illusion of choice, in a portable dialogue format (Ink). The skill owns choice design and state; it is not Ink-engine wiring."
|
|
10
|
+
- prompt: "Players say my game's story doesn't match the gameplay — the character is supposed to be a pacifist healer but the whole loop is shooting enemies. What do I do?"
|
|
11
|
+
why: "Ludonarrative dissonance — the verb/reward audit and reconciliation is a flagship section. Non-obvious phrasing but squarely narrative-vs-mechanics harmony."
|
|
12
|
+
- prompt: "I need to design the quest structure for my game — how objectives are tracked, what happens on failure, and how side quests unlock. Can you help lay that out?"
|
|
13
|
+
why: "Quests & objectives: states, tracking, fail states, dependencies. The skill owns the quest state machine as a design artifact."
|
|
14
|
+
- prompt: "How can I tell the backstory of this abandoned station through the environment instead of dumping it all in audio logs?"
|
|
15
|
+
why: "Environmental / show-don't-tell storytelling — the skill's environmental section, preferring diegetic delivery over text-dumps."
|
|
16
|
+
- prompt: "Which tool should I use to author a branching dialogue tree — Yarn Spinner, Twine, or articy? And how do I keep it localization-ready?"
|
|
17
|
+
why: "Dialogue-tool selection (tools as pointers) plus localization-readiness — both explicit skill sections. Choosing/authoring the narrative, not wiring the runner into an engine."
|
|
18
|
+
|
|
19
|
+
should_not_trigger:
|
|
20
|
+
- prompt: "Design the combat system for my game — how melee combos, stamina, and damage scaling should work and feel balanced."
|
|
21
|
+
route_to: "game-design"
|
|
22
|
+
why: "Core mechanics, systems, and balance — what the player DOES. The skill explicitly defers verbs/systems/economy/balance to game-design."
|
|
23
|
+
- prompt: "Lay out the blockout for this level — where the cover, sightlines, enemy spawns, and the sniper perch go."
|
|
24
|
+
route_to: "level-design"
|
|
25
|
+
why: "Spatial layout and encounter placement. The skill defers the geometry of a space (even story-bearing space) to level-design."
|
|
26
|
+
- prompt: "Wire my Ink story file into Unity — set up the InkRunner, bind the choices to UI buttons, and serialize the story state into my save system."
|
|
27
|
+
route_to: "unity"
|
|
28
|
+
why: "Engine integration: dialogue runner, UI binding, save/serialize. The skill authors portable narrative and hands wiring to the engine skill (here, unity)."
|
|
29
|
+
- prompt: "Write me a short story / novella set in my game's universe — just prose fiction, no choices or branching."
|
|
30
|
+
route_to: "none"
|
|
31
|
+
why: "Linear prose fiction with no interactive/branching structure is general creative writing, not interactive narrative design; the skill scopes to story-as-system."
|
|
32
|
+
- prompt: "Write the Steam store description and the launch trailer voiceover script to market my game."
|
|
33
|
+
route_to: "marketing"
|
|
34
|
+
why: "External-facing marketing copy, not in-game narrative. The skill defers store/trailer copy to marketing."
|
|
35
|
+
|
|
36
|
+
capability:
|
|
37
|
+
- scenario: "A dev says: 'My branching RPG has about 12 major player choices and I want them all to matter, but I can't author 4000 scenes. And several of my choices feel fake — they lead to the same outcome.' Design the narrative structure."
|
|
38
|
+
must_include:
|
|
39
|
+
- "Names the combinatorial-explosion problem explicitly (roughly 2^N futures for N independent binary choices) as why 12 free choices is unauthorable"
|
|
40
|
+
- "Recommends a foldback / string-of-pearls topology with reconvergence (bottlenecks) so branches rejoin on load-bearing beats"
|
|
41
|
+
- "Uses gates and state-over-structure: model choices as named flags/variables and have one scene read the flag and swap lines, instead of duplicating scenes"
|
|
42
|
+
- "Distinguishes meaningful choice (a flag some later node reads back to the player) from illusion of choice, and says you may fake the outcome but never sell fake stakes as consequential"
|
|
43
|
+
- "Keeps a small budget of global/persistent choices (collapsed into summary variables for endings) while most choices stay local/weave"
|
|
44
|
+
- "Stays engine-agnostic: produces the narrative graph and a state/flag model, and hands runner/save wiring to the engine skill rather than writing engine code"
|
|
45
|
+
- scenario: "A dev says: 'Reviewers complain the story doesn't fit the game. My protagonist is written as a compassionate doctor, but the core loop is mowing down hundreds of soldiers.' Diagnose and fix."
|
|
46
|
+
must_include:
|
|
47
|
+
- "Identifies this as ludonarrative dissonance: the mechanics/verbs contradict the story the game tells"
|
|
48
|
+
- "Runs a verb audit (the dominant verb is 'kill', which contradicts 'compassionate doctor') and a reward audit (what the game rewards is the loudest narrative voice)"
|
|
49
|
+
- "Prefers fixing the cheaper piece — usually re-framing the narrative to match the mechanic — while flagging to game-design when only a mechanic change can resolve it"
|
|
50
|
+
- "Addresses reconciling failure/death fiction (respawns/checkpoints) with the story rather than leaving it unexplained"
|
|
51
|
+
- "Frames story as a system in service of play, not a layer of words bolted on to excuse the mechanics"
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Branching & state — topologies, choice, and containment
|
|
2
|
+
|
|
3
|
+
Deep dive for the SKILL's "Narrative structures" and "Branching & choice" sections. This is engine-agnostic: model the graph and the state here; the engine skill (`godot`/`unity`/`unreal`) serializes and runs it.
|
|
4
|
+
|
|
5
|
+
## The narrative topologies (ASCII)
|
|
6
|
+
|
|
7
|
+
**Linear** — one path; agency is over pace, not direction.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
A -> B -> C -> D -> E
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**Branching tree** — choices split and (in the pure case) never rejoin. Author cost doubles at each fork.
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
/-- B --< D
|
|
17
|
+
A --< \-- E
|
|
18
|
+
\-- C --< F
|
|
19
|
+
\-- G
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Hub-and-spoke** — a central hub; the player picks self-contained spokes and returns. Agency is over *order* and *selection*.
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
B
|
|
26
|
+
|
|
|
27
|
+
C --- HUB --- D (return to HUB after each spoke)
|
|
28
|
+
|
|
|
29
|
+
E
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Foldback / string-of-pearls** — branches diverge, then **reconverge** at load-bearing beats ("pearls"). The between-pearl space stays small, so total scenes stay authorable while choices feel consequential. This is the workhorse for long branching stories.
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
/-- b1 --\ /-- b3 --\
|
|
36
|
+
BEAT1 -- -- BEAT2 -- BEAT3 -> ...
|
|
37
|
+
\-- b2 --/ \-- b4 --/
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Gauntlet / branch-and-bottleneck** — like foldback but branches can *drop out* (fail forward) into the main line rather than each reaching the bottleneck.
|
|
41
|
+
|
|
42
|
+
Most shipped games are a **mix**: a foldback main line, hub-and-spoke for side content, environmental/systemic layered on top.
|
|
43
|
+
|
|
44
|
+
## Meaningful choice vs. the illusion of choice
|
|
45
|
+
|
|
46
|
+
A choice is **meaningful** only when all three legs hold:
|
|
47
|
+
|
|
48
|
+
1. **Intent** — the player understands the options well enough to *want* one (not a blind coin-flip, unless blindness is the point).
|
|
49
|
+
2. **Foreseeable consequence** — a plausible mental model of what each option does (even if the outcome surprises).
|
|
50
|
+
3. **Consequence that lands** — the game later *reads the choice back*: a changed line, a locked door, a dead character, a different ending. If nothing ever reads the flag, the choice was noise.
|
|
51
|
+
|
|
52
|
+
**Illusion of choice** — options that reconverge to the same outcome — is a legitimate, even essential tool, but only for the right job:
|
|
53
|
+
|
|
54
|
+
| Illusion is fine for… | Illusion is a betrayal when… |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| **Expression / roleplay** — *how* your character says a thing (tone, personality) with the same result | it's dressed up as a **stakes** decision ("save her or let her die" → she dies either way, unacknowledged) |
|
|
57
|
+
| **Pacing / tone** — letting the player set register without forking the plot | the player is told/led to believe it's consequential and later discovers it wasn't |
|
|
58
|
+
| **Onboarding** — safe practice choices before real ones | you fake many in a row; players learn choices don't matter and disengage from *all* of them |
|
|
59
|
+
|
|
60
|
+
Rule of thumb: **you may fake the outcome, never the stakes.** The moment a player catches a stakes-choice that didn't matter, they retroactively distrust every prior choice. Budget your few real, global choices and make them unmistakably land; let the many small choices be honest expression.
|
|
61
|
+
|
|
62
|
+
### Kinds of consequence (make at least some visible)
|
|
63
|
+
|
|
64
|
+
- **Immediate** — the next line/scene changes now (satisfying, cheap, local).
|
|
65
|
+
- **Delayed** — pays off hours later (powerful, needs a flag and a reminder so the player *connects* it).
|
|
66
|
+
- **Ambient** — world/NPC reactions, reputation, barks (cheap breadth; makes the world feel to be watching).
|
|
67
|
+
- **Ending-level** — the choice(s) route the finale. Track with a small set of summary flags, not the full history.
|
|
68
|
+
|
|
69
|
+
Delayed consequences only feel meaningful if the player can **attribute** them to the choice. Plant a callback ("because you spared him at the bridge…") or the payoff reads as random.
|
|
70
|
+
|
|
71
|
+
## State: model it as named variables
|
|
72
|
+
|
|
73
|
+
Story state is the spine of everything above. Model it explicitly; never encode meaning in duplicated scene copies.
|
|
74
|
+
|
|
75
|
+
| State type | Example | Use for |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| **Boolean flag** | `met_the_witch`, `betrayed_ally` | one-shot facts / gates |
|
|
78
|
+
| **Counter** | `civilians_saved`, `times_lied` | thresholds, tallies, tone tracking |
|
|
79
|
+
| **Enum / stage** | `witch_relationship = ally\|neutral\|enemy` | relationship / quest stages |
|
|
80
|
+
| **Scalar / reputation** | `town_rep = -3..+3` | gradient reactions, gated content |
|
|
81
|
+
| **Set / inventory** | `keys = {east, crypt}` | possession checks |
|
|
82
|
+
|
|
83
|
+
Guidelines:
|
|
84
|
+
|
|
85
|
+
- **Name for meaning, not mechanism** (`saved_the_child`, not `flag_37`). Future you and translators read these.
|
|
86
|
+
- **Write once, read many.** A single scene that reads flags and swaps lines beats N near-duplicate scenes.
|
|
87
|
+
- **Keep a state dictionary** — one table listing every variable, type, who sets it, who reads it. This is your single source of truth and your test plan.
|
|
88
|
+
- **Derive, don't duplicate.** Compute "is the player a villain" from counters at read time rather than maintaining a parallel flag that can desync.
|
|
89
|
+
- **Decide persistence with the engine skill.** *What* is saved (which variables survive a reload, a chapter, a new game+) is a design call you make; *how* it serializes is the engine skill's job.
|
|
90
|
+
|
|
91
|
+
### A portable state-gated scene (Ink-flavored, illustrative)
|
|
92
|
+
|
|
93
|
+
```ink
|
|
94
|
+
VAR spared_bandit = false
|
|
95
|
+
VAR town_rep = 0
|
|
96
|
+
|
|
97
|
+
=== gate_market ===
|
|
98
|
+
{ town_rep >= 2:
|
|
99
|
+
The guard nods you through. -> market
|
|
100
|
+
- else:
|
|
101
|
+
"Your kind isn't welcome." -> turned_away
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
=== bandit_reappears ===
|
|
105
|
+
{ spared_bandit:
|
|
106
|
+
The bandit you spared steps from the shadows — and returns the favor.
|
|
107
|
+
- else:
|
|
108
|
+
A stranger eyes you coldly and says nothing.
|
|
109
|
+
}
|
|
110
|
+
-> continue
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
One scene, two behaviors, driven by state — not two authored scenes.
|
|
114
|
+
|
|
115
|
+
## The combinatorial-explosion trap and how to contain it
|
|
116
|
+
|
|
117
|
+
**The math:** N *independent* binary choices imply 2^N reachable states; 10 such choices is 1024 futures — unauthorable, untestable. Left unchecked, branching narrative collapses under its own content cost. Contain it deliberately:
|
|
118
|
+
|
|
119
|
+
1. **Reconvergence (bottlenecks / foldback).** Funnel branches back to shared beats. Between two bottlenecks you only author the small local fan-out, not the global product. This is the single highest-leverage fix.
|
|
120
|
+
2. **Gates.** Require a flag/level/item/reputation to open content. Gating *prunes the live branch set* — most branches aren't reachable in a given playthrough, so you don't pay to author their full downstream.
|
|
121
|
+
3. **State over structure.** Replace divergent *scenes* with one scene that reads *variables*. You trade authored copies for conditional lines — linear content growth instead of exponential.
|
|
122
|
+
4. **Locality (weave).** Keep most choices' effects inside the current scene; let them evaporate at the next bottleneck. Reserve a *small, named budget* of choices for global, persistent state (the ones that reach the ending).
|
|
123
|
+
5. **Summary variables for endings.** Don't branch the finale on the full choice history; collapse it into a few axes (e.g. `mercy_score`, `faction`) and branch on those. Dozens of choices, a handful of endings.
|
|
124
|
+
6. **Orthogonal, not multiplied.** Prefer choices that affect *different* subsystems (one changes a relationship, one changes the map) over choices that all modify the same outcome and must be cross-authored.
|
|
125
|
+
|
|
126
|
+
### Testing a branching graph (design-side)
|
|
127
|
+
|
|
128
|
+
- **Reachability** — every node reachable from start under *some* valid state; flag orphans.
|
|
129
|
+
- **No dead ends / soft-locks** — every non-ending node has an exit; no state combination strands the player.
|
|
130
|
+
- **Gate satisfiability** — every gated node is reachable by *some* path that can satisfy its condition (a locked door with no obtainable key is a bug).
|
|
131
|
+
- **Flag hygiene** — every variable read is written somewhere first; no read-before-write.
|
|
132
|
+
- **Ending coverage** — enumerate the summary-variable combinations and confirm each maps to an intended ending.
|
|
133
|
+
|
|
134
|
+
Keep this list as the acceptance criteria you hand to the engine skill's implementation and QA.
|