@ericrisco/rsc 0.1.34 → 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.
Files changed (130) hide show
  1. package/README.md +28 -2
  2. package/manifest.json +241 -2
  3. package/package.json +1 -1
  4. package/scripts/lib/domains.js +1 -0
  5. package/scripts/lib/recommend.js +4 -0
  6. package/skills/agent-eval/SKILL.md +1 -1
  7. package/skills/analyze/SKILL.md +1 -1
  8. package/skills/brand-voice/SKILL.md +1 -1
  9. package/skills/brand-voice/references/voice-guide-template.md +14 -0
  10. package/skills/building-agents/SKILL.md +2 -2
  11. package/skills/competitor-watch/SKILL.md +9 -4
  12. package/skills/competitor-watch/references/tracker-schema.md +19 -0
  13. package/skills/constitution/references/constitution-template.md +10 -0
  14. package/skills/content-engine/SKILL.md +1 -1
  15. package/skills/content-engine/references/brief-and-pipeline.md +15 -1
  16. package/skills/course-builder/references/grounding-and-scoping.md +23 -0
  17. package/skills/course-storytelling/references/learner-grounding.md +22 -2
  18. package/skills/decision-records/SKILL.md +14 -1
  19. package/skills/decision-records/references/templates.md +20 -0
  20. package/skills/design/references/brand-grounding.md +11 -1
  21. package/skills/game-design/SKILL.md +170 -0
  22. package/skills/game-design/evals/README.md +13 -0
  23. package/skills/game-design/evals/cases.yaml +47 -0
  24. package/skills/game-design/references/mechanics-and-loops.md +78 -0
  25. package/skills/game-design/references/playtesting-and-scope.md +58 -0
  26. package/skills/game-design/references/progression-and-economy.md +70 -0
  27. package/skills/game-storytelling/SKILL.md +159 -0
  28. package/skills/game-storytelling/evals/README.md +28 -0
  29. package/skills/game-storytelling/evals/cases.yaml +51 -0
  30. package/skills/game-storytelling/references/branching-and-state.md +134 -0
  31. package/skills/game-storytelling/references/dialogue-tools.md +117 -0
  32. package/skills/game-storytelling/references/environmental-storytelling.md +71 -0
  33. package/skills/gamedev-multiplayer/SKILL.md +250 -0
  34. package/skills/gamedev-multiplayer/evals/README.md +12 -0
  35. package/skills/gamedev-multiplayer/evals/cases.yaml +44 -0
  36. package/skills/gamedev-multiplayer/references/godot-high-level-multiplayer.md +133 -0
  37. package/skills/gamedev-multiplayer/references/prediction-and-latency.md +104 -0
  38. package/skills/gamedev-multiplayer/references/unity-and-unreal-netcode.md +166 -0
  39. package/skills/gamedev-pathing/SKILL.md +242 -0
  40. package/skills/gamedev-pathing/evals/README.md +14 -0
  41. package/skills/gamedev-pathing/evals/cases.yaml +49 -0
  42. package/skills/gamedev-pathing/references/navmesh-workflow.md +110 -0
  43. package/skills/gamedev-pathing/references/search-algorithms.md +135 -0
  44. package/skills/gamedev-pathing/references/steering-and-avoidance.md +120 -0
  45. package/skills/gamedev-physics/SKILL.md +225 -0
  46. package/skills/gamedev-physics/evals/README.md +12 -0
  47. package/skills/gamedev-physics/evals/cases.yaml +54 -0
  48. package/skills/gamedev-physics/references/character-controllers.md +120 -0
  49. package/skills/gamedev-physics/references/determinism-and-queries.md +124 -0
  50. package/skills/gamedev-physics/references/layers-and-masks.md +115 -0
  51. package/skills/gamedev-shaders/SKILL.md +252 -0
  52. package/skills/gamedev-shaders/evals/README.md +14 -0
  53. package/skills/gamedev-shaders/evals/cases.yaml +45 -0
  54. package/skills/gamedev-shaders/references/effect-recipes.md +205 -0
  55. package/skills/gamedev-shaders/references/godot-shading-language.md +133 -0
  56. package/skills/gamedev-shaders/references/unity-and-unreal-shaders.md +169 -0
  57. package/skills/gamedev-shipping/SKILL.md +236 -0
  58. package/skills/gamedev-shipping/evals/README.md +9 -0
  59. package/skills/gamedev-shipping/evals/cases.yaml +55 -0
  60. package/skills/gamedev-shipping/references/mobile-and-desktop.md +127 -0
  61. package/skills/gamedev-shipping/references/stores-and-ci.md +162 -0
  62. package/skills/gamedev-shipping/references/web-export-headers.md +140 -0
  63. package/skills/godot/SKILL.md +319 -0
  64. package/skills/godot/evals/README.md +13 -0
  65. package/skills/godot/evals/cases.yaml +50 -0
  66. package/skills/godot/references/export-and-testing.md +102 -0
  67. package/skills/godot/references/gdscript-style.md +84 -0
  68. package/skills/godot/references/godot3-to-4-traps.md +89 -0
  69. package/skills/godot/references/nodes-scenes-resources.md +109 -0
  70. package/skills/harness/SKILL.md +3 -3
  71. package/skills/harness/references/daily-curation-automation.md +8 -6
  72. package/skills/harness/references/obsidian-scaffolding.md +16 -9
  73. package/skills/harness/references/wiki-article-template.md +31 -14
  74. package/skills/harness/references/wiki-index-template.md +7 -3
  75. package/skills/harness/references/wiki-protocol.md +120 -54
  76. package/skills/harness/references/wiki-worklog-template.md +5 -1
  77. package/skills/instagram-api/SKILL.md +8 -1
  78. package/skills/instagram-api/references/insights-metrics.md +8 -1
  79. package/skills/knowledge-ops/SKILL.md +9 -9
  80. package/skills/knowledge-ops/evals/cases.yaml +1 -1
  81. package/skills/knowledge-ops/references/gardening-playbook.md +18 -8
  82. package/skills/level-design/SKILL.md +175 -0
  83. package/skills/level-design/evals/README.md +35 -0
  84. package/skills/level-design/evals/cases.yaml +58 -0
  85. package/skills/level-design/references/blockout-to-art.md +118 -0
  86. package/skills/level-design/references/guidance-and-readability.md +152 -0
  87. package/skills/level-design/references/pacing-and-encounters.md +142 -0
  88. package/skills/linkedin-api/SKILL.md +10 -1
  89. package/skills/linkedin-strategy/SKILL.md +12 -0
  90. package/skills/linkedin-strategy/references/wiki-records.md +27 -1
  91. package/skills/marketing/references/brand-grounding.md +22 -2
  92. package/skills/medium-strategy/SKILL.md +12 -0
  93. package/skills/medium-strategy/references/wiki-records.md +39 -1
  94. package/skills/medium-writing/SKILL.md +19 -0
  95. package/skills/plan/references/plan-template.md +12 -1
  96. package/skills/roast-me/tools/adapters/__pycache__/__init__.cpython-312.pyc +0 -0
  97. package/skills/roast-me/tools/adapters/__pycache__/base.cpython-312.pyc +0 -0
  98. package/skills/roast-me/tools/adapters/__pycache__/claude.cpython-312.pyc +0 -0
  99. package/skills/roast-me/tools/adapters/__pycache__/codex.cpython-312.pyc +0 -0
  100. package/skills/roast-me/tools/adapters/__pycache__/gemini.cpython-312.pyc +0 -0
  101. package/skills/roast-me/tools/adapters/__pycache__/registry.cpython-312.pyc +0 -0
  102. package/skills/shortform-packaging/SKILL.md +7 -2
  103. package/skills/shortform-packaging/references/package-templates.md +13 -2
  104. package/skills/shortform-strategy/SKILL.md +30 -6
  105. package/skills/shortform-strategy/references/learning-loop-template.md +9 -1
  106. package/skills/specify/references/spec-template.md +12 -1
  107. package/skills/tiktok-api/SKILL.md +6 -2
  108. package/skills/tiktok-api/references/wiki-schema.md +38 -4
  109. package/skills/unity/SKILL.md +282 -0
  110. package/skills/unity/evals/README.md +8 -0
  111. package/skills/unity/evals/cases.yaml +43 -0
  112. package/skills/unity/references/build-and-platforms.md +65 -0
  113. package/skills/unity/references/input-system.md +102 -0
  114. package/skills/unity/references/lifecycle-deep-dive.md +75 -0
  115. package/skills/unreal/SKILL.md +270 -0
  116. package/skills/unreal/evals/README.md +12 -0
  117. package/skills/unreal/evals/cases.yaml +45 -0
  118. package/skills/unreal/references/blueprint-cpp-parity.md +109 -0
  119. package/skills/unreal/references/gameplay-framework.md +95 -0
  120. package/skills/unreal/references/packaging.md +83 -0
  121. package/skills/verify/SKILL.md +11 -1
  122. package/skills/youtube-api/SKILL.md +7 -2
  123. package/skills/youtube-api/references/wiki-schema.md +25 -4
  124. package/skills/youtube-packaging/SKILL.md +10 -2
  125. package/skills/youtube-packaging/references/description-and-chapters.md +70 -2
  126. package/skills/youtube-strategy/SKILL.md +9 -2
  127. package/skills/youtube-strategy/references/wiki-records.md +39 -6
  128. package/skills/youtube-strategy/scripts/verify.sh +4 -0
  129. package/skills/youtube-thumbnails/SKILL.md +10 -5
  130. package/skills/youtube-thumbnails/references/experiment-log-format.md +28 -2
@@ -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.
@@ -0,0 +1,117 @@
1
+ # Dialogue tools — the four primitives, a pick-one guide, and one conversation in three formats
2
+
3
+ Deep dive for the SKILL's "Dialogue systems" section. **Engine-agnostic:** author dialogue in a portable format here; the engine skill (`godot`/`unity`/`unreal`) wires the runner, presenter, save/serialize, and any plugin. Do not write engine binding code in this skill.
4
+
5
+ ## Every tool reduces to four primitives
6
+
7
+ Design against these, then map them onto whichever tool the project uses:
8
+
9
+ | Primitive | What it is | Ink | Yarn Spinner | Twine (Twee) | articy:draft X |
10
+ | --- | --- | --- | --- | --- | --- |
11
+ | **Node** | addressable unit of content | knot `=== name ===` / stitch `= name` | node with `title:` + `===` end | passage `:: Name` | flow / dialogue fragment |
12
+ | **Condition** | boolean over state gating content | `{ cond: ... }`, `{ cond: a \| b }` | `<<if $x>> ... <<endif>>` | `(if: $x)[...]` (Harlowe) / `<<if $x>>` (SugarCube) | condition node / expression on a pin |
13
+ | **Variable** | the story state read/written | `VAR x = 0`, `~ x = 1` | `<<set $x to 1>>` | `(set: $x to 1)` / `<<set $x = 1>>` | global variable in the variable set |
14
+ | **Effect** | side effect a node fires | `~ func()`, tags `#`, external funcs | `<<command>>`, functions, `<<set>>` | macros, `<<run>>` (SugarCube) | instruction node / script pin |
15
+
16
+ If you can express a conversation in these four primitives, it ports to any of the tools below.
17
+
18
+ ## The tools (pointers, current as of 2026)
19
+
20
+ ### Ink — inkle's narrative scripting language
21
+ - **Shape:** a writer-first *language* (not a visual editor). Text is the default; logic is woven in. Prose-heavy, highly expressive.
22
+ - **Core syntax:** knots `=== name ===`, stitches `= name`, diverts `-> name`, once-only choices `*`, sticky choices `+`, gathers `-`, weave (nested choices/gathers), `VAR`, `CONST`, `LIST` (state machines / multi-value), conditionals `{ }`, tunnels `-> x ->`, threads `<- x`, functions, tags `#`, glue `<>`.
23
+ - **Runtime:** compiles to JSON; run with **inkjs** (web/JS) or engine integrations (Unity's `ink-unity-integration`; community Godot integrations). **Inky** is the authoring editor with live preview.
24
+ - **Best for:** branching prose, interactive fiction, dialogue with lots of state and reincorporation. Weakest as a visual overview for non-writers.
25
+
26
+ ### Yarn Spinner — the friendly dialogue tool (v3.x current)
27
+ - **Shape:** node-based, screenplay-ish; friendlier to designers and non-programmers than raw Ink. Nodes edit well in a graph or plain text.
28
+ - **Core syntax:** node = header (`title: Name`) + `---` + body + `===`; options with `->`; `<<set $x to 1>>`, `<<if>>/<<elseif>>/<<else>>/<<endif>>`, `<<jump Node>>`, `<<declare>>`, custom `<<commands>>`, functions, and inline markup `[b]...[/b]`.
29
+ - **Runtime & engines:** first-class **Unity** support; **Godot** via official C# (beta) and GDScript (alpha) integrations; **Unreal** integration in progress for 2026. String tables export for localization are built in.
30
+ - **Best for:** game dialogue with a designer-writer split, VO line management, and Unity projects.
31
+
32
+ ### Twine — visual hypertext editor
33
+ - **Shape:** a **visual node editor** that publishes a self-contained HTML file. Lowest barrier to entry; excellent for prototyping and interactive fiction shipped as a web page.
34
+ - **Story formats matter:** scripting depends on the chosen format — **Harlowe** (default, macro-based `(set:)/(if:)`), **SugarCube** (`<<set>>/<<if>>`, save system, richer for games), **Snowman** (JS-forward), **Chapbook** (prose-forward). Pick the format for the job.
35
+ - **Twee** is Twine's plain-text form (`:: Passage` headers) — version-controllable and a good neutral interchange for design even if the game engine isn't Twine.
36
+ - **Best for:** prototyping branches fast, web-delivered IF, and design-time storyboarding. Not a drop-in engine dialogue runtime for a AAA build.
37
+
38
+ ### articy:draft X — visual narrative database (commercial)
39
+ - **Shape:** a heavyweight **narrative DB + flow editor**. Models flow fragments, dialogue fragments, hubs, conditions, instructions, plus a full entity/location/variable database and templates. Built for large teams and large scripts.
40
+ - **Pipeline:** free **Unity** and **Unreal** importers pull dialogues, entities, variables, and localization in cleanly; a **Generic Engine Export** produces JSON (+ optional assets) for any custom engine. Runs on Windows and macOS.
41
+ - **Best for:** big branching RPGs, teams that need a shared narrative database, template-driven content, and translation at scale. Overkill for a small project.
42
+
43
+ ## Pick one — a fast decision guide
44
+
45
+ | If… | Reach for |
46
+ | --- | --- |
47
+ | Prose-heavy IF, lots of state, writer-driven | **Ink** |
48
+ | Game dialogue, designer/writer split, Unity, VO + loc built in | **Yarn Spinner** |
49
+ | Rapid prototype, web-delivered, or teaching branching visually | **Twine** (SugarCube for game-like saves) |
50
+ | Large team, huge script, shared entity/variable DB, Unity/Unreal | **articy:draft X** |
51
+ | You just need a portable design artifact, engine undecided | **Twee** or an Ink file (both are plain text, diff-able) |
52
+
53
+ When the engine is fixed, let the **engine skill** confirm the best-supported integration; when it isn't, author in plain-text (Ink/Twee) so nothing locks you in.
54
+
55
+ ## The same conversation, three formats
56
+
57
+ A guard who lets you pass only if `has_pass` is true; otherwise you can bribe (needs `gold >= 10`) or leave.
58
+
59
+ **Ink**
60
+ ```ink
61
+ VAR has_pass = false
62
+ VAR gold = 0
63
+
64
+ === gate ===
65
+ The guard blocks the door.
66
+ { has_pass:
67
+ "Pass, citizen." -> town
68
+ }
69
+ * [Offer a bribe] { gold >= 10:
70
+ ~ gold = gold - 10
71
+ The guard pockets it. -> town
72
+ - else:
73
+ "You're ten short." -> gate
74
+ }
75
+ * [Leave] -> street
76
+ ```
77
+
78
+ **Yarn Spinner**
79
+ ```yarn
80
+ title: Gate
81
+ ---
82
+ The guard blocks the door.
83
+ <<if $has_pass>>
84
+ Guard: Pass, citizen.
85
+ <<jump Town>>
86
+ <<endif>>
87
+ -> Offer a bribe <<if $gold >= 10>>
88
+ <<set $gold = $gold - 10>>
89
+ The guard pockets it.
90
+ <<jump Town>>
91
+ -> Leave
92
+ <<jump Street>>
93
+ ===
94
+ ```
95
+
96
+ **Twee (SugarCube)**
97
+ ```twee
98
+ :: Gate
99
+ The guard blocks the door.
100
+ <<if $has_pass>>Guard: "Pass, citizen." [[Town]]<<else>>\
101
+ [[Offer a bribe->Bribe]]
102
+ [[Leave->Street]]
103
+ <</if>>
104
+
105
+ :: Bribe
106
+ <<if $gold gte 10>><<set $gold to $gold - 10>>The guard pockets it. [[Town]]\
107
+ <<else>>"You're ten short." [[Gate]]<</if>>
108
+ ```
109
+
110
+ Same four primitives (node / condition / variable / effect), three syntaxes. Design once; the engine skill binds it.
111
+
112
+ ## Delivery notes (design-side)
113
+
114
+ - **Barks vs. conversations** — short, interruptible one-liners (barks) need a priority + cooldown model so they don't stack or repeat; full conversations need focus/turn-taking. Design them as different node types.
115
+ - **Line IDs & loc** — every player-facing line carries a stable id and lives in a string table (see the SKILL's localization notes). Ink tags, Yarn's string-table export, and articy's loc columns all support this; use them.
116
+ - **Never concatenate** sentence fragments across variables for grammar (gender/plural/word order) — author full templated lines with named placeholders.
117
+ - **Presentation is the engine's job** — typewriter effect, portraits, camera, choice-timer UI, skip/auto — hand these to the engine skill; keep the dialogue content pure.
@@ -0,0 +1,71 @@
1
+ # Environmental & systemic storytelling — show, don't tell
2
+
3
+ Deep dive for the SKILL's "Environmental & systemic storytelling" section. The goal: deliver story *through the world and its rules* so the player assembles meaning and owns it, instead of being narrated at. Engine-agnostic; coordinate the *space* with `level-design` and the *rules* with `game-design`.
4
+
5
+ ## Why show over tell
6
+
7
+ Told information is received; discovered information is *earned*. A player who infers "someone died here defending this door" from a skeleton, a spent revolver, and claw marks believes it more, and remembers it longer, than the same fact in a text box. Reserve telling (codex, narrator, log dumps) for what the world genuinely cannot carry — precise numbers, distant history, abstract rules.
8
+
9
+ **Show-don't-tell ladder** (prefer the top; fall back only when needed):
10
+
11
+ 1. **Enacted** — it happens in front of the player through play (an ally sacrifices themselves in a scripted-but-interactive beat).
12
+ 2. **Environmental** — the world's state implies the event (aftermath, traces, arrangement).
13
+ 3. **Overheard / ambient** — barks, one-sided radio, NPCs talking to each other.
14
+ 4. **Readable in-world** — item descriptions, signage, graffiti, terminals that *belong* to the world.
15
+ 5. **Collectible logs** — audio logs, diaries, notes. Useful but the most "tell"-like; easy to overuse.
16
+ 6. **Non-diegetic** — narrator, codex, cutscene exposition, HUD text. Last resort.
17
+
18
+ ## Environmental storytelling — the technique catalog
19
+
20
+ - **Set dressing with intent.** Every prop can carry meaning: a single toy in a barracks, wedding photos in a looted home. Composition points the eye (leading lines, light, framing a key object) — coordinate with `level-design` and lighting.
21
+ - **Aftermath / the frozen moment.** Show the scene *after* the event and let the player reconstruct it: overturned table, blood trail, a meal half-eaten. The gap between "what I see" and "what happened" is the story.
22
+ - **Traces & evidence.** Bullet holes, scorch marks, footprints in dust, a barricade built from the wrong side. Physical cause-and-effect the player reads like a detective.
23
+ - **Spatial sequencing.** The *order* the player encounters space tells a story: descend from opulence into rot; a triumphant mural, then the mass grave behind it. The space is a sentence; its layout is the grammar (a `level-design` collaboration).
24
+ - **Object placement & juxtaposition.** Meaning from adjacency — a child's drawing pinned above a weapons cache; a prayer shrine facing a bricked-up window.
25
+ - **Readable descriptions.** Item and examine text that implies a life ("Dented canteen. Someone scratched three tally marks and stopped."). Small, optional, high-flavor; rewards curiosity without gating.
26
+ - **World-state change.** The strongest environmental beat: the space *changes* in response to the player or the plot (a hub burns, a garden regrows, a faction's banners replace another's). The player sees consequence written on the world.
27
+ - **Absence.** What's missing tells a story too — an empty crib, a cleared-out desk, a name scratched off a roster.
28
+
29
+ Guardrails:
30
+
31
+ - **Legibility vs. mystery.** Give enough signal that most players read the intended gist, with deeper layers for the attentive. If *no one* gets it, it's decoration, not storytelling; if it's spelled out, it's a text box.
32
+ - **Consistency = trust.** Once the world's props reliably mean things, players *read* every scene. One arbitrary/contradictory arrangement teaches them to stop looking.
33
+ - **Optional, not load-bearing.** Environmental story enriches; don't hide *required* plot solely in a missable detail. Critical beats need a guaranteed channel.
34
+
35
+ ## Diegetic vs. non-diegetic delivery
36
+
37
+ | | Diegetic (in-world) | Non-diegetic (outside the fiction) |
38
+ | --- | --- | --- |
39
+ | **Examples** | signage, barks, radio, environmental change, in-world terminals | narrator VO, codex/lore menu, HUD text, tutorial popups, cutscene title cards |
40
+ | **Feel** | immersive, earned, "the world tells me" | efficient, precise, "the game tells me" |
41
+ | **Use for** | mood, place, character, consequence, most story | exact numbers, dense history, rules the world can't show, accessibility |
42
+ | **Cost of overuse** | can be missed/ambiguous | breaks immersion; reads as a lecture |
43
+
44
+ **Diegetic first.** Push information into the world; drop to non-diegetic only for what the world can't carry. Note the honest exceptions: **accessibility** (subtitles, clear objective text, difficulty-scaled hints) and **usability** (a control prompt) are worth a non-diegetic cost — never sacrifice comprehension for purity.
45
+
46
+ ## Systemic & emergent storytelling — the anecdote factory
47
+
48
+ Scripted story is *authored*; systemic story is *generated* by rules + player + world state producing events no writer placed. The famous colonist who starved defending the fridge, the rival who keeps hunting you across a sandbox — nobody wrote those; the systems did.
49
+
50
+ You don't write these stories. You design the **conditions and vocabulary** that let them happen and be legible — an "anecdote factory." This is primarily a `game-design` collaboration; your narrative-design job is to make the output *readable as story*.
51
+
52
+ Design levers:
53
+
54
+ - **Legible actors** — entities with names, traits, memory, and relationships (a guard who remembers you spared him). Persistent identity turns a system event into a *character* moment.
55
+ - **Consequence that persists** — the world remembers and reflects actions (reputation, scars, changed factions), so events chain into arcs instead of resetting.
56
+ - **Readable causality** — the player can *see why* something happened (a needs/mood readout, a reaction bark, a kill-cam). An unexplained emergent event is just noise; a readable one is an anecdote.
57
+ - **Framing & capture** — surfacing tools (event log, photo mode, relationship screen, killfeed, end-of-run summary) that let the player *notice and retell* the story the systems produced. The retelling is the payoff.
58
+ - **Meaningful randomness** — variety within authored bounds (curated event pools, weighted tables) so runs differ without becoming incoherent.
59
+ - **Interacting systems** — emergence needs ≥2 systems that touch (fire + wind + wood; hunger + weather + AI). One system alone produces events, not stories.
60
+
61
+ Guardrails:
62
+
63
+ - **Coherence budget.** Pure emergence drifts into nonsense; pure authorship can't surprise. Set authored guardrails (tone, bounds, curated pools) inside which systems play.
64
+ - **Framing is half the work.** An emergent event the player never notices or can't interpret isn't a story. Invest in the surfacing/retelling tools as much as the simulation.
65
+ - **Name things.** Named actors, places, and factions convert anonymous system state into story the player cares about and repeats.
66
+
67
+ ## Where this hands off
68
+
69
+ - **`level-design`** — owns the physical space, blockout, sightlines, and encounter flow that environmental beats live inside. Co-own set-dressing that carries narrative.
70
+ - **`game-design`** — owns the systems whose interaction produces emergent story; you specify what must be *legible* and *persistent* for those events to read as narrative.
71
+ - **the engine skill** (`godot`/`unity`/`unreal`) — implements world-state changes, triggers, bark systems, event logs, and the persistence that makes consequence stick.