hayao 0.4.1 → 0.4.2

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 (110) hide show
  1. package/design/00-process/README.md +49 -0
  2. package/design/00-process/composition.md +148 -0
  3. package/design/00-process/core-loop.md +146 -0
  4. package/design/00-process/intent-to-brief.md +128 -0
  5. package/design/00-process/pillars.md +139 -0
  6. package/design/00-process/refine-and-handoff.md +156 -0
  7. package/design/00-process/the-twist.md +108 -0
  8. package/design/10-anchors/README.md +99 -0
  9. package/design/10-anchors/age-of-empires.md +103 -0
  10. package/design/10-anchors/baba-is-you.md +127 -0
  11. package/design/10-anchors/balatro.md +132 -0
  12. package/design/10-anchors/celeste.md +136 -0
  13. package/design/10-anchors/civilization.md +101 -0
  14. package/design/10-anchors/dead-cells.md +125 -0
  15. package/design/10-anchors/factorio.md +100 -0
  16. package/design/10-anchors/hades.md +127 -0
  17. package/design/10-anchors/into-the-breach.md +125 -0
  18. package/design/10-anchors/it-takes-two.md +104 -0
  19. package/design/10-anchors/loop-hero.md +131 -0
  20. package/design/10-anchors/nuclear-throne.md +130 -0
  21. package/design/10-anchors/outer-wilds.md +107 -0
  22. package/design/10-anchors/overcooked.md +102 -0
  23. package/design/10-anchors/peggle.md +133 -0
  24. package/design/10-anchors/reigns.md +99 -0
  25. package/design/10-anchors/return-of-the-obra-dinn.md +108 -0
  26. package/design/10-anchors/rimworld.md +101 -0
  27. package/design/10-anchors/shadow-of-mordor.md +106 -0
  28. package/design/10-anchors/slay-the-spire.md +127 -0
  29. package/design/10-anchors/starcraft.md +98 -0
  30. package/design/10-anchors/stardew-valley.md +103 -0
  31. package/design/10-anchors/tetris.md +122 -0
  32. package/design/10-anchors/vampire-survivors.md +122 -0
  33. package/design/20-genres/README.md +62 -0
  34. package/design/20-genres/action-adventure.md +126 -0
  35. package/design/20-genres/auto-battler.md +121 -0
  36. package/design/20-genres/bullet-hell.md +123 -0
  37. package/design/20-genres/city-builder.md +124 -0
  38. package/design/20-genres/coop-chaos.md +124 -0
  39. package/design/20-genres/deckbuilder.md +122 -0
  40. package/design/20-genres/exploration.md +131 -0
  41. package/design/20-genres/farming-sim.md +122 -0
  42. package/design/20-genres/grid-puzzle.md +126 -0
  43. package/design/20-genres/horde-survival.md +128 -0
  44. package/design/20-genres/incremental.md +120 -0
  45. package/design/20-genres/match3.md +120 -0
  46. package/design/20-genres/metroidvania.md +132 -0
  47. package/design/20-genres/narrative-decisions.md +122 -0
  48. package/design/20-genres/physics-arcade.md +124 -0
  49. package/design/20-genres/precision-platformer.md +127 -0
  50. package/design/20-genres/racing.md +126 -0
  51. package/design/20-genres/rhythm.md +125 -0
  52. package/design/20-genres/roguelike.md +122 -0
  53. package/design/20-genres/rts.md +169 -0
  54. package/design/20-genres/stealth.md +125 -0
  55. package/design/20-genres/survival-horror.md +124 -0
  56. package/design/20-genres/tactics.md +123 -0
  57. package/design/20-genres/tower-defense.md +120 -0
  58. package/design/30-systems/README.md +69 -0
  59. package/design/30-systems/accessibility.md +110 -0
  60. package/design/30-systems/boss-design.md +126 -0
  61. package/design/30-systems/build-diversity.md +120 -0
  62. package/design/30-systems/collectibles.md +108 -0
  63. package/design/30-systems/combat-model.md +113 -0
  64. package/design/30-systems/coop-and-competition.md +118 -0
  65. package/design/30-systems/counter-systems.md +115 -0
  66. package/design/30-systems/crafting.md +115 -0
  67. package/design/30-systems/difficulty-and-dda.md +114 -0
  68. package/design/30-systems/economy.md +117 -0
  69. package/design/30-systems/emergent-systems.md +114 -0
  70. package/design/30-systems/encounter-design.md +107 -0
  71. package/design/30-systems/enemy-ai.md +121 -0
  72. package/design/30-systems/enemy-archetypes.md +117 -0
  73. package/design/30-systems/faction-asymmetry.md +144 -0
  74. package/design/30-systems/grace.md +124 -0
  75. package/design/30-systems/mastery-curve.md +116 -0
  76. package/design/30-systems/meta-progression.md +114 -0
  77. package/design/30-systems/onboarding.md +115 -0
  78. package/design/30-systems/procgen-design.md +118 -0
  79. package/design/30-systems/progression.md +120 -0
  80. package/design/30-systems/resource-loops.md +112 -0
  81. package/design/30-systems/reward-schedules.md +124 -0
  82. package/design/30-systems/save-and-checkpoint.md +113 -0
  83. package/design/30-systems/session-structure.md +113 -0
  84. package/design/30-systems/skill-trees.md +111 -0
  85. package/design/30-systems/status-effects.md +111 -0
  86. package/design/30-systems/tech-tree.md +112 -0
  87. package/design/30-systems/telegraphs.md +106 -0
  88. package/design/30-systems/unit-rosters.md +123 -0
  89. package/design/40-worldbuilding/README.md +49 -0
  90. package/design/40-worldbuilding/aesthetic-direction.md +155 -0
  91. package/design/40-worldbuilding/faction-identity.md +136 -0
  92. package/design/40-worldbuilding/naming-and-tone.md +130 -0
  93. package/design/40-worldbuilding/narrative-delivery.md +129 -0
  94. package/design/40-worldbuilding/theme-vectors.md +134 -0
  95. package/design/40-worldbuilding/worldbuilding-scaffold.md +132 -0
  96. package/design/50-patterns/README.md +54 -0
  97. package/design/50-patterns/anti-frustration.md +121 -0
  98. package/design/50-patterns/emergence.md +121 -0
  99. package/design/50-patterns/feedback-loops.md +121 -0
  100. package/design/50-patterns/juice-choreography.md +124 -0
  101. package/design/50-patterns/mastery-and-flow.md +121 -0
  102. package/design/50-patterns/pacing-and-tension.md +120 -0
  103. package/design/50-patterns/readability.md +121 -0
  104. package/design/50-patterns/risk-reward.md +120 -0
  105. package/design/CONTRIBUTING.md +183 -0
  106. package/design/INDEX.md +133 -0
  107. package/design/README.md +86 -0
  108. package/design/_TEMPLATE.md +69 -0
  109. package/design/index.json +2720 -0
  110. package/package.json +2 -1
@@ -0,0 +1,123 @@
1
+ ---
2
+ id: system-unit-rosters
3
+ title: Unit Rosters — a legible roster
4
+ kind: system
5
+ tags: [units, roster, roles, tiers, diversity, rts, redundancy]
6
+ summary: A roster of units whose roles are legible and distinct — every unit earns its slot, overlap is intentional, and redundancy is culled.
7
+ use-when: You have a set of units/troops/pieces the player commands and need each to have a clear, non-redundant job.
8
+ composes-with: [system-counter-systems, system-faction-asymmetry, system-enemy-archetypes, system-combat-model, system-tech-tree]
9
+ anchors: [anchor-starcraft, anchor-age-of-empires]
10
+ verify-with: docs/FUN.md#9-rts-lite
11
+ ---
12
+
13
+ # Unit Rosters — a legible roster
14
+
15
+ **What it is.** The **cast of pieces** the player fields — the units of an RTS, the
16
+ troops of an auto-battler, the summons of a tactics game — organized so every one has
17
+ a *readable job* and *earns its slot*. A roster is the vocabulary that
18
+ [[system-counter-systems]] connects and [[system-faction-asymmetry]] differentiates.
19
+
20
+ **Player fantasy / why it's fun.** "I know exactly what each of these does, and I'm
21
+ choosing the right mix." A legible roster makes composition a pleasure — you read
22
+ the enemy, pick your answer, and the units do what their silhouette promised.
23
+
24
+ ## When to use / when NOT
25
+
26
+ | Use a designed roster when… | Skip when… |
27
+ |---|---|
28
+ | Player fields multiple unit types | One avatar / one active unit |
29
+ | Composition is a decision | Units are just reskinned HP bars |
30
+ | Counters/tech/factions need pieces | The "roster" is enemies only ([[system-enemy-archetypes]]) |
31
+
32
+ ## The role alphabet
33
+
34
+ Most rosters are built from a small set of **functional roles**. Legibility comes
35
+ from each unit reading as *one* role, not a blur of three.
36
+
37
+ | Role | Job | Reads as |
38
+ |---|---|---|
39
+ | **Frontline / tank** | absorb, hold the line | big, slow, tough |
40
+ | **DPS / line** | deal the damage | mid, fragile-ish |
41
+ | **Skirmisher** | fast, harass, flank | small, quick, hits-and-runs |
42
+ | **Artillery / siege** | range, area, anti-clump | long range, slow, glass |
43
+ | **Support** | heal/buff/detect | non-combat, force-multiplier |
44
+ | **Specialist** | one job (anti-air, cloak, transport) | the answer to a specific threat |
45
+
46
+ A roster is *legible* when a new player can name each unit's role from its
47
+ silhouette and speed alone — the [[pattern-readability]] test applied to the army.
48
+
49
+ ## Tiers vs. sidegrades
50
+
51
+ | Structure | What it is | Watch for |
52
+ |---|---|---|
53
+ | **Tiers** | later units strictly stronger (T1→T3) | early units become dead weight — give them a lasting niche (cost, speed) |
54
+ | **Sidegrades** | same tier, different role, no strict winner | the healthiest for diversity |
55
+ | **Tech gates** | roster unlocks via [[system-tech-tree]] | pace the reveal; no unlock deserts (FUN.md §14 logic) |
56
+
57
+ Prefer sidegrades within a tier and *role* differences across tiers. A pure linear
58
+ tier ladder quietly kills half the roster.
59
+
60
+ ## Tuning levers
61
+
62
+ | Lever | Does | Healthy range |
63
+ |---|---|---|
64
+ | **Roster size** | how many units | enough for a matrix, few enough to hold in the head (~6–12 per side) |
65
+ | **Role coverage** | each role represented | no gap the counter-matrix needs filled |
66
+ | **Overlap** | two units, similar job | intentional (a cheap and a premium tank) — not accidental |
67
+ | **Cost curve** | resource/time per unit | maps to power; no unit both cheapest and best |
68
+ | **Skill expression** | micro reward per unit | some reward control (skirmishers), some don't (tanks) |
69
+
70
+ ## Overlap vs. redundancy — the culling rule
71
+
72
+ - **Overlap** is two units doing a similar job *for a reason*: a cheap disposable
73
+ tank and an expensive durable one give the player a real cost/quality choice.
74
+ - **Redundancy** is two units doing the same job with no distinguishing decision —
75
+ one strictly dominates or they're interchangeable. **Cull it.** Every unit must
76
+ answer "when would I build *this* over its neighbor?" If it can't, merge or cut.
77
+
78
+ The test: remove a unit. If no strategy got weaker, it was redundant.
79
+
80
+ ## How it wires to Hayao
81
+
82
+ - **Roles are proven by duels.** Pure state + `world.rng` → clone the world, run the
83
+ unit in its intended matchup, read the result (FUN.md law 7). Assert the tank
84
+ *tanks* and the counter unit *counters* (FUN.md §9 NvN edges).
85
+ - **Mass command needs flow fields** — one BFS per goal tile, cached outside
86
+ `world.state`, gives the whole roster wall-aware pathing (FUN.md §9). Grep
87
+ [`docs/API.md`](../../docs/API.md) for `astarGrid`/`floodFill` before citing.
88
+ - **Export behavioural tolerances** (arrival radius, aggro range) as API so tests
89
+ share the sim's constants (FUN.md §9) — the roster's numbers live in one place.
90
+ - **Redundancy is a lint.** The "remove-a-unit, did any strategy weaken?" check is a
91
+ skill-delta test (FUN.md law 2) you can script.
92
+
93
+ ## Fails when…
94
+
95
+ - **Silhouette lies.** A "tank" that dies fast, a "skirmisher" that's slow — the read
96
+ breaks and composition becomes memorization ([[pattern-readability]]).
97
+ - **Redundant units.** Dead slots the player never builds; the roster looks bigger
98
+ than it plays.
99
+ - **A dominant unit.** One piece answers everything — the roster collapses to a spam
100
+ ([[system-build-diversity]] and [[system-counter-systems]] both die).
101
+ - **Tier rot.** Early units strictly obsolete by mid-game, so half the cast is a
102
+ museum. Give each a lasting niche.
103
+
104
+ ## Verify
105
+
106
+ - **[FUN.md §9](../../docs/FUN.md)** — every counter edge wins its NvN duel; commander
107
+ bot wins; walled units route around; ms/step at peak.
108
+ - **[FUN.md law 2](../../docs/FUN.md)** — the redundancy lint: removing a unit weakens
109
+ some strategy; a mixed roster beats a mono spam.
110
+ - Determinism: golden hash of a scripted battle across the roster.
111
+
112
+ ## Composes with
113
+
114
+ - [[system-counter-systems]] — the matrix that connects the pieces into decisions.
115
+ - [[system-faction-asymmetry]] — each faction is a distinct roster over shared roles.
116
+ - [[system-enemy-archetypes]] — the enemy-side vocabulary; rosters and archetypes rhyme.
117
+ - [[system-tech-tree]] — how the roster reveals over a match.
118
+
119
+ ## See also
120
+
121
+ - [`docs/FUN.md`](../../docs/FUN.md) §9 — mass under command; duels as the balance test.
122
+ - [[anchor-starcraft]], [[anchor-age-of-empires]] — legible rosters with role clarity.
123
+ - [`sandboxes/pathfinding-demo`](../../sandboxes/pathfinding-demo) — the pathing the roster shares.
@@ -0,0 +1,49 @@
1
+ # 40-worldbuilding — theme, lore, faction, look
2
+
3
+ The **SHAPE** stage's fiction half. Once the mechanic and the twist are set,
4
+ these six kits give the design a *world* and a *look* — a setting that recolours
5
+ the systems, the minimum viable lore that holds it together, factions that read
6
+ at a glance, names in the house register, an art brief that survives the vision
7
+ judge, and a way to tell the story with almost no text. Design here; **prove the
8
+ look** in [`docs/JUDGE.md`](../../docs/JUDGE.md) and the `npm run palette` /
9
+ `npm run feel` gates. The house aesthetic is **Kentō woodblock / Miyazaki-16** —
10
+ elegant ink-and-washi craft, AA-verified — a consistent starting point, never a
11
+ cage.
12
+
13
+ The golden rule of the section: **the fiction must rhyme with the mechanic.** A
14
+ theme, faction, or name that could be swapped out with zero mechanical change is
15
+ a skin — bend deeper.
16
+
17
+ | id | title | summary |
18
+ |---|---|---|
19
+ | [world-theme-vectors](theme-vectors.md) | Theme Vectors | Choosing a setting that *recolours* the systems, not skins them; theme as a twist vector — pick where fiction and mechanic rhyme. |
20
+ | [world-worldbuilding-scaffold](worldbuilding-scaffold.md) | Worldbuilding Scaffold | From a setting to a coherent world — premise, rules, stakes, role, fantasy; the minimum viable lore a small game needs. |
21
+ | [world-faction-identity](faction-identity.md) | Faction Identity | Making sides feel distinct in fiction — silhouette, values, colour, motif; the fiction companion to `system-faction-asymmetry`. |
22
+ | [world-naming-and-tone](naming-and-tone.md) | Naming & Tone | Names, voice, register; the Kentō one-word restraint (lanternway, rootward, tarnholm, kintsugi) and text that trusts the player. |
23
+ | [world-aesthetic-direction](aesthetic-direction.md) | Aesthetic Direction | Briefing the Kentō woodblock look — palette, contrast, depth, silhouette — to pass the readability + six-axis JUDGE bars. |
24
+ | [world-narrative-delivery](narrative-delivery.md) | Narrative Delivery | Environmental / systemic / embedded storytelling with little text; show-don't-tell; let the systems author the story. |
25
+
26
+ ## The through-line
27
+
28
+ ```
29
+ theme-vectors ─▶ worldbuilding-scaffold ─▶ naming-and-tone
30
+ │ │ │
31
+ └──▶ aesthetic-direction ◀── faction-identity
32
+
33
+ └──▶ narrative-delivery ──▶ (JUDGE / palette / feel)
34
+ ```
35
+
36
+ Pick the theme, scaffold the world, name it, brief the look (splitting factions
37
+ by hue and silhouette if there are sides), then let place and systems tell the
38
+ story. Every arrow ends where the proof playbook begins.
39
+
40
+ ## See also
41
+
42
+ - [`00-process/the-twist`](../00-process/the-twist.md) — theme is one of its six
43
+ vectors; this section is the deep dive on the fiction half.
44
+ - [`30-systems/faction-asymmetry`](../30-systems/faction-asymmetry.md) — the
45
+ mechanical partner to `world-faction-identity`.
46
+ - [`50-patterns/readability`](../50-patterns/readability.md) — the salience floor
47
+ every aesthetic brief must clear.
48
+ - [`docs/JUDGE.md`](../../docs/JUDGE.md) · `docs/CONVENTIONS.md` (Kentō palette) —
49
+ where the look is proven.
@@ -0,0 +1,155 @@
1
+ ---
2
+ id: world-aesthetic-direction
3
+ title: Aesthetic Direction — briefing the Kentō woodblock look
4
+ kind: worldbuilding
5
+ tags: [art-direction, palette, kento, woodblock, readability, contrast, look, judge]
6
+ summary: Art direction — the Kentō woodblock palette and how to brief a look that passes the readability + JUDGE bars (findable avatar, depth, one-world colour).
7
+ use-when: You need to turn a theme into a concrete visual brief — palette, contrast, depth, silhouette — that survives the vision judge.
8
+ composes-with: [world-theme-vectors, world-faction-identity, world-naming-and-tone]
9
+ verify-with: docs/JUDGE.md
10
+ ---
11
+
12
+ # Aesthetic Direction — briefing the Kentō woodblock look
13
+
14
+ **What it is.** The **art brief**: the palette, contrast rules, depth plan, and
15
+ silhouette language that give a game one coherent look. The house default is
16
+ **Kentō woodblock / Miyazaki-16** — a small set of traditional-Japanese hues,
17
+ AA-gated, that reads as elegant ink-and-washi craft. This module is how you brief
18
+ a look that clears both the [[pattern-readability]] floor and the six-axis vision
19
+ judge (`docs/JUDGE.md`), not just how to pick pretty colours.
20
+
21
+ **Player fantasy / why it's fun.** The look is the *first* thing the player
22
+ believes about the world — before a single mechanic fires. A frame that reads as
23
+ *shipped, not debug* earns trust; a flat grey grid loses it in a second.
24
+
25
+ ## The Kentō palette
26
+
27
+ Import `KENTO`, `MEADOW` (light), `DUSK` (dark) from `@hayao`
28
+ ([`docs/API.md`](../../docs/API.md)). It fuses the site's washi/sumi ink tokens
29
+ with landscape hues loosely from Miyazaki-16. **Eight named accents**, each with
30
+ a `Deep` tone for light grounds and a bright tone for dark:
31
+
32
+ | Hue | Name | Reads as |
33
+ |---|---|---|
34
+ | vermilion | **shu** | alarm, aggression, sacred |
35
+ | persimmon | **kaki** | warmth, harvest, rust |
36
+ | ochre-gold | **ko** | wealth, age, earth |
37
+ | pine green | **matsu** | life, growth, calm |
38
+ | teal-cyan | **asagi** | water, cool, clarity |
39
+ | indigo | **ai** | night, order, depth |
40
+ | wisteria violet | **fuji** | magic, dusk, mystery |
41
+ | dusty rose | **saku** | tenderness, transience |
42
+
43
+ Neutrals run from shell-white *gofun* → *washi* → *kinako* → *stone* → body-ink
44
+ *sumiSoft* → *sumi* → deepest *kuro*/*yohaku*. Pick **5–6 hues plus a ground** per
45
+ game; alpha/tone variants via `withAlpha`/`mix` are welcome. **Every pairing is
46
+ WCAG-AA verified — `npm run palette` is the gate.** The engine stays
47
+ palette-agnostic; Kentō is a consistent starting point, never a restriction
48
+ (`docs/CONVENTIONS.md`).
49
+
50
+ ## Vectors / options — dialing the look to the theme
51
+
52
+ The palette is fixed-ish; the *composition* is where you express theme:
53
+
54
+ | Lever | Poles | Serves |
55
+ |---|---|---|
56
+ | **Ground** | light `MEADOW` (washi) ↔ dark `DUSK` (sumi/kuro) | daytime/cosy ↔ night/dread; sets the whole mood |
57
+ | **Accent count** | 2 (austere) ↔ 6 (rich) | tension of a lean frame vs a busy world |
58
+ | **Value range** | wide (ink→shell) ↔ narrow | drama & focal points ↔ flat/foggy atmosphere |
59
+ | **Line weight** | heavy ink outline ↔ soft edge | woodblock boldness ↔ painterly softness |
60
+ | **Light** | flat ambient ↔ `LightLayer`+`PointLight` pools | even scene ↔ carved-out focal depth |
61
+
62
+ Warm accents (*shu*, *kaki*, *ko*) push a scene toward harvest/dread/desperation;
63
+ cool accents (*asagi*, *ai*, *fuji*) toward night/order/calm. Let the theme's
64
+ register from [[world-theme-vectors]] pick the corner.
65
+
66
+ ## Method
67
+
68
+ 1. **Choose the ground** (`MEADOW` vs `DUSK`) from the theme's tone. This decision
69
+ colours everything after it.
70
+ 2. **Pick 5–6 accents** by *meaning*, not prettiness — one alarm hue, one focal
71
+ hue for the avatar, the rest for world & factions
72
+ ([[world-faction-identity]]). Reserve the highest-contrast pairing for the
73
+ player so the avatar out-contrasts the scenery (JUDGE axis 1).
74
+ 3. **Plan depth in three layers** — background / midground / foreground — *before*
75
+ placing anything. Emptiness (objects floating in a void) is the JUDGE's most
76
+ common failure (axis 2). Grade a sky, pin a horizon, layer ridges.
77
+ 4. **Give interactables an ink edge.** Pickups/actors carry a dark outline
78
+ (`stroke: KENTO.sumi` on light, `KENTO.gofun` rim on dark) plus a glow/pulse —
79
+ contrast lives in the *edge*, not the fill (`docs/CONVENTIONS.md`).
80
+ 5. **Set the silhouette language** — the shape rules that make avatar, enemies,
81
+ and pickups readable as black shapes ([[pattern-readability]]).
82
+ 6. **If lit, own the light.** A real `LightLayer` + `PointLight` carves a focal
83
+ point out of ambient dark; but multiply-lighting lowers contrast, so the
84
+ Kentō AA guarantee holds only *pre*-lighting — judge lit contrast from the
85
+ rendered PNG, and let the `lightingIssues` feel-gate (`npm run feel`) own it.
86
+ 7. **Render and judge.** Run `npm run judge <slug>`, *look* at the pixels, fix
87
+ every high-severity finding cosmetically (the golden hash must stay
88
+ unchanged), re-render until it reads shipped.
89
+
90
+ ## The JUDGE bar — brief to pass all six axes
91
+
92
+ | Axis | The brief that passes it |
93
+ |---|---|
94
+ | **Readability** | Avatar on the reserved high-contrast pairing; threats warm-loud, pickups ink-edged |
95
+ | **Depth & composition** | Three real layers; a focal point; breathing room — never a void |
96
+ | **Palette harmony** | Every hue from the *one* Kentō set; a controlled value range, not all mid-tone |
97
+ | **Juice restraint** | Particles/shake that *punctuate*; nothing seizure-bright ([[pattern-juice-choreography]]) |
98
+ | **Motion clarity** | The eye tracks the important thing frame to frame |
99
+ | **Chrome & finish** | HUD framed as DOM overlay; consistent margins; nothing clipped; the title invites |
100
+
101
+ ## Worked example — *lanternway*'s neighbourhood
102
+
103
+ **Theme:** a keeper walking into the dusk (elegiac, small-scale).
104
+
105
+ - **Ground:** `DUSK` — a graded night sky, pinned horizon, layered ridges (the
106
+ depth the JUDGE demands; the updrift lesson in `docs/JUDGE.md`).
107
+ - **Accents:** *ko* (warm lantern glow, the focal/avatar hue) against *ai*/*fuji*
108
+ night; *shu* reserved for danger only. Five hues, one world.
109
+ - **Light:** each lantern is a `PointLight` pool carving warmth out of the dark —
110
+ depth *and* the mechanic in one visual. Contrast judged from the PNG.
111
+ - **Edges:** lanterns and the keeper carry a *gofun* rim so they read against the
112
+ dark ground.
113
+ - **Result:** a frame that reads as an atmospheric ascent, not a debug void —
114
+ the exact gap the vision judge exists to close.
115
+
116
+ ## Aesthetic hook
117
+
118
+ *This whole module is the aesthetic hook.* The one thing to internalise: **Kentō
119
+ gives you harmony and AA for free, but not depth or contrast-under-light** — those
120
+ you compose per scene and *prove from the rendered pixels*, never from the hexes
121
+ (`docs/JUDGE.md` axis 2). Design in the palette; judge in the PNG.
122
+
123
+ ## Traps
124
+
125
+ - **The debug void.** Objects on a flat grey field. Plan three layers first;
126
+ emptiness is the #1 judge failure.
127
+ - **Palette clash.** Reaching outside the Kentō set for "one perfect blue."
128
+ Break the one-world rule and every frame muddies. Swap the *whole* palette or
129
+ stay in it.
130
+ - **Contrast from hexes.** Trusting `npm run palette` AA under a `LightLayer` —
131
+ multiply kills it. Judge lit scenes from the PNG; let `lightingIssues` gate it.
132
+ - **Fill without edge.** An accent shape flat on a same-family floor vanishes.
133
+ Ink outline + glow on anything interactive.
134
+ - **Mid-tone mush.** All hues at one value = no focal point. Reserve the widest
135
+ value range for what matters most.
136
+ - **Skipping the judge.** "Passes the gates" ≠ "looks shipped." Run
137
+ `npm run judge` and actually look.
138
+
139
+ ## Composes with
140
+
141
+ - [[world-theme-vectors]] — supplies the register that picks the palette's corner.
142
+ - [[world-faction-identity]] — each faction's owning hue is assigned from this
143
+ set; silhouette rules are briefed here.
144
+ - [[pattern-readability]] — the salience floor this brief must clear.
145
+ - [[pattern-juice-choreography]] — feedback that punctuates without smothering
146
+ (JUDGE axis 4).
147
+
148
+ ## See also
149
+
150
+ - [`docs/JUDGE.md`](../../docs/JUDGE.md) — the six-axis rubric this module briefs
151
+ to; the `/judge` loop (`.claude/skills/judge/`).
152
+ - `docs/CONVENTIONS.md` "Default palette is Kentō" — the palette, the ink-edge
153
+ rule, DOM chrome, and the `npm run palette` AA gate.
154
+ - [`docs/API.md`](../../docs/API.md) — `KENTO`, `MEADOW`, `DUSK`, `withAlpha`,
155
+ `mix`, `LightLayer`, `PointLight`.
@@ -0,0 +1,136 @@
1
+ ---
2
+ id: world-faction-identity
3
+ title: Faction Identity — making sides feel distinct in fiction
4
+ kind: worldbuilding
5
+ tags: [faction, identity, silhouette, motif, colour, values, fiction, asymmetry]
6
+ summary: Making factions feel distinct in FICTION — silhouette, values, colour, motif; the fiction companion to system-faction-asymmetry's mechanical difference.
7
+ use-when: Your design has two or more sides/factions and you need them to read as different worlds at a glance, not palette-swaps.
8
+ composes-with: [world-aesthetic-direction, world-naming-and-tone, world-theme-vectors]
9
+ anchors: [anchor-starcraft, anchor-shadow-of-mordor]
10
+ verify-with: docs/JUDGE.md
11
+ ---
12
+
13
+ # Faction Identity — making sides feel distinct in fiction
14
+
15
+ **What it is.** [[system-faction-asymmetry]] makes factions play differently.
16
+ This module makes them *feel* like different peoples. A faction reads when its
17
+ **silhouette, values, colour, and motif** all say the same thing — so a player
18
+ knows which side they're looking at from one frame, and knows what that side
19
+ *believes* from one unit. Mechanical asymmetry without fictional identity is a
20
+ stat-sheet; fictional identity without asymmetry is a costume.
21
+
22
+ **Player fantasy / why it's fun.** Players don't main a faction for its numbers;
23
+ they main it because it's *theirs*. Identity is what they're loyal to. A distinct
24
+ faction is a distinct fantasy: the swarm, the disciplined line, the desperate
25
+ salvagers.
26
+
27
+ ## The four identity channels
28
+
29
+ Every faction needs a coherent answer on all four. When they agree, the faction
30
+ is legible; when they clash, it's noise.
31
+
32
+ | Channel | The question | Read at a glance? |
33
+ |---|---|---|
34
+ | **Silhouette** | Could you name the faction from a black shape? | Yes — shape is the fastest read |
35
+ | **Values** | What does this people believe / fear / want? | Slower — read through behaviour & lore |
36
+ | **Colour** | Which Kentō hue *owns* this faction? | Yes — one accent per side |
37
+ | **Motif** | The repeated visual/verbal signature (a shape, a word, a ritual) | Yes — the thing that recurs |
38
+
39
+ The strongest factions **map a value onto a mechanic onto a look** in one line:
40
+ *the disciplined line* believes in order → fights in formation (mechanic) →
41
+ straight silhouettes, indigo *ai* (look). Change any one and the other two feel
42
+ wrong.
43
+
44
+ ## Vectors / options — where to source contrast
45
+
46
+ Pick a *primary axis of difference* and let all four channels express it:
47
+
48
+ | Contrast axis | Faction A pole | Faction B pole | Expresses through |
49
+ |---|---|---|---|
50
+ | **Order ↔ chaos** | rigid, geometric, few | teeming, organic, many | silhouette density; formation vs swarm |
51
+ | **Growth ↔ decay** | living, verdant, *matsu* | rusted, salvaged, *kaki*/*ko* | material & motif |
52
+ | **Sky ↔ earth** | tall, pale, airy | low, heavy, grounded | silhouette height; ground vs flight |
53
+ | **Old ↔ new** | weathered, ritual, ink | sharp, forged, bright | tone & naming register |
54
+ | **Predator ↔ prey** | angular, forward, few | rounded, defensive, many | shape language; posture |
55
+
56
+ Two factions should sit at *opposite poles of the same axis* — that's what makes
57
+ them read as a pair rather than two unrelated design docs. StarCraft's three sit
58
+ on order↔chaos↔hybrid; each is a clean silhouette and a clean fantasy.
59
+
60
+ ## Method
61
+
62
+ 1. **Pick the contrast axis** that matches your mechanical asymmetry
63
+ ([[system-faction-asymmetry]]). If Faction A masses cheap units and B fields
64
+ few elites, your axis is *chaos ↔ order* — build fiction on that.
65
+ 2. **Write each faction's value in one sentence** — what they believe and fear.
66
+ This drives naming ([[world-naming-and-tone]]) and behaviour.
67
+ 3. **Assign one owning hue per faction** from the Kentō set. One accent each,
68
+ never shared — colour is the fastest faction read (see hook).
69
+ 4. **Design the silhouette rule.** A shape language each faction obeys:
70
+ straight-and-tall vs low-and-organic. Test it as black shapes — if you can't
71
+ tell them apart in silhouette, neither can the player mid-fight.
72
+ 5. **Choose the motif** — one recurring signature (a broken-lantern crest, a word
73
+ that only they use, a ritual gesture). It appears on units, HUD, and lore.
74
+ 6. **Cross-check the triangle.** Value ↔ mechanic ↔ look must agree for each
75
+ faction. A "peaceful" faction with the aggressive kit is a contradiction the
76
+ player feels but can't name.
77
+
78
+ ## Worked example
79
+
80
+ **Axis:** growth ↔ decay, on a drowned-coast world.
81
+
82
+ | | The Tidewardens | The Wracksalvage |
83
+ |---|---|---|
84
+ | **Value** | *keep the light; hold the line* | *take what the sea gives; owe nothing* |
85
+ | **Silhouette** | tall, straight lanterns & robes | low, hunched, jury-rigged hulls |
86
+ | **Colour** | indigo *ai* + shell *gofun* | persimmon *kaki* + rust *ko* |
87
+ | **Motif** | the unbroken flame | the scavenged hook |
88
+ | **Mechanic** | few, durable, defensive (holds ground) | many, cheap, opportunistic (swarms wrecks) |
89
+
90
+ You can tell them apart as black shapes; you can tell them apart by a single
91
+ hue; and each look *is* the mechanic. That's a legible pair.
92
+
93
+ ## Aesthetic hook
94
+
95
+ Colour is the fastest faction read the JUDGE has an axis for (palette harmony).
96
+ Give each faction **one owning accent** from Kentō's eight — indigo *ai* reads as
97
+ disciplined and cool, persimmon *kaki* and rust *ko* as desperate and warm, pine
98
+ *matsu* as living, vermilion *shu* as aggressive. Because all eight belong to one
99
+ harmonised set (`npm run palette`, AA-gated), factions can be *distinct* without
100
+ *clashing* — the whole frame stays one world, which is exactly the JUDGE's
101
+ palette-harmony bar (`docs/JUDGE.md` axis 3). Keep silhouette contrast doing the
102
+ heavy lifting so the sides read even where their pooled sprites share a lit
103
+ scene — contrast lives in the *edge and shape*, not only the fill
104
+ (`docs/CONVENTIONS.md`). Pair with [[world-aesthetic-direction]] to brief the
105
+ look and [[pattern-readability]] to keep both sides salient in a crowd.
106
+
107
+ ## Traps
108
+
109
+ - **Palette-swap factions.** Same silhouette, different hue. Players read them as
110
+ the same side in two colours. Silhouette first, colour second.
111
+ - **Look that fights the mechanic.** A "gentle" faction with a hyper-aggressive
112
+ kit. The triangle (value ↔ mechanic ↔ look) must close.
113
+ - **Shared accent.** Two factions on the same hue are indistinguishable at
114
+ distance. One owning accent each.
115
+ - **Motif overload.** Five crests and three slogans dilute the one that matters.
116
+ One motif per faction, repeated.
117
+ - **Fiction with no mechanical asymmetry.** If the sides play identically, the
118
+ identity is a costume — pair with [[system-faction-asymmetry]] or drop to one
119
+ faction.
120
+
121
+ ## Composes with
122
+
123
+ - [[system-faction-asymmetry]] — the mechanical difference this module dresses;
124
+ they must be authored together.
125
+ - [[world-aesthetic-direction]] — turns each faction's colour/silhouette rule
126
+ into a briefed, JUDGE-passing look.
127
+ - [[world-naming-and-tone]] — faction names and the words only they use.
128
+ - [[pattern-readability]] — keeps competing factions salient in a busy frame.
129
+
130
+ ## See also
131
+
132
+ - [`docs/JUDGE.md`](../../docs/JUDGE.md) — readability & palette-harmony axes:
133
+ can you find and name each side instantly, in one world's colours?
134
+ - [[anchor-starcraft]] — three rosters, one balance, three unmistakable
135
+ silhouettes. [[anchor-shadow-of-mordor]] — factions of *individuals* whose
136
+ identity is emergent memory.
@@ -0,0 +1,130 @@
1
+ ---
2
+ id: world-naming-and-tone
3
+ title: Naming & Tone — the Kentō house restraint
4
+ kind: worldbuilding
5
+ tags: [naming, tone, voice, register, restraint, copy, evocative, ux-text]
6
+ summary: Names, voice, and register — the Kentō house restraint of one-word evocative titles (lanternway, rootward, tarnholm, kintsugi) and text that trusts the player.
7
+ use-when: You need to name the game, its places, factions, and mechanics — and set the voice for the little text a small game shows.
8
+ composes-with: [world-worldbuilding-scaffold, world-faction-identity, world-narrative-delivery]
9
+ verify-with: none
10
+ ---
11
+
12
+ # Naming & Tone — the Kentō house restraint
13
+
14
+ **What it is.** The **name** is the smallest, most-seen piece of worldbuilding —
15
+ the title on the first screen, the word on every place and mechanic. **Tone** is
16
+ the register of every string the game shows. The house style is *restraint*: one
17
+ evocative word over a compound sentence, an implied world over an explained one,
18
+ text that trusts the player to feel it. The examples name themselves in a breath
19
+ — *lanternway*, *rootward*, *tarnholm*, *kintsugi* — and say almost nothing else.
20
+
21
+ **Player fantasy / why it's fun.** A good name is a whole world compressed. Say
22
+ *rootward* and the player already feels down, inward, growing. The name does the
23
+ worldbuilding the text doesn't have to.
24
+
25
+ ## The house rule: one evocative word
26
+
27
+ The Hayao lean is a **single coined or weathered word** that implies a direction
28
+ or a place. It reads on a title screen, survives in a URL, and carries a mood
29
+ without a subtitle.
30
+
31
+ | Name | How it's built | What it implies at a glance |
32
+ |---|---|---|
33
+ | **lanternway** | lantern + way (a path) | a lit route through dark; keeping, walking |
34
+ | **rootward** | root + -ward (toward) | descent, growth, inward, earth |
35
+ | **tarnholm** | tarn (mountain lake) + holm (island) | a cold, small, isolated place |
36
+ | **kintsugi** | the craft of gold-mending broken pottery | repair as beauty; breakage that heals |
37
+
38
+ The technique: **fuse two small, concrete morphemes** (a thing + a direction, or
39
+ a place + a place), or **borrow a real craft/place word** with the right weather
40
+ on it. Avoid the fantasy-generator failure modes below.
41
+
42
+ ## Vectors / options — dialing the register
43
+
44
+ Pick a register and hold it across *every* string, from the title to the
45
+ game-over line:
46
+
47
+ | Register | Feels like | Naming source | Fits themes |
48
+ |---|---|---|---|
49
+ | **Weathered / folk** | old, worn, quiet | real archaic words; place-suffixes (-holm, -mere, -fen) | stewardship, seasonal, elegiac |
50
+ | **Coined-compound** | crafted, precise | two morphemes fused (root+ward) | most house games; clean & ownable |
51
+ | **Craft-loan** | elegant, specific | a real craft term (kintsugi, kentō) | Japanese-craft register; on-brand |
52
+ | **Mythic** | grand, absolute | invented proper nouns, capitalised | large-scale, conqueror-agency worlds |
53
+ | **Plain / wry** | modern, light | ordinary words, a little dry | cosy, comedic, or tonal-twist games |
54
+
55
+ The house default sits in the first three. Mythic and wry are available but pull
56
+ *away* from the Kentō register — use them deliberately, matched to the theme.
57
+
58
+ ## Method
59
+
60
+ 1. **Name the game last, from the fantasy.** Once [[world-worldbuilding-scaffold]]
61
+ has the premise and role, the name is the compression of that feeling — not a
62
+ thing you pick first and rationalise.
63
+ 2. **Try the fuse.** Combine two concrete morphemes from the world (its material,
64
+ its direction, its place). Or borrow one weathered real word. Say it aloud.
65
+ 3. **Set one register** and write a *tone sheet* — 3–4 example strings (a title,
66
+ a prompt, a win line, a loss line) that fix the voice. Everything else matches.
67
+ 4. **Name places and factions in the same grammar.** If the game is *lanternway*,
68
+ its places are *the Duskmere*, *the Last Lamp* — not *Region 3*. Factions
69
+ inherit their value's register ([[world-faction-identity]]).
70
+ 5. **Name mechanics in-world where you can.** "Kindle," "mend," "ward" over
71
+ "activate," "repair," "buff." An in-fiction verb teaches and immerses at once.
72
+ 6. **Cut adjectives.** The house voice is nouns and verbs. If a string needs three
73
+ adjectives to land, the name or the scene isn't doing its job.
74
+
75
+ ## Worked example
76
+
77
+ **World:** the drowned-coast keeper from [[world-worldbuilding-scaffold]].
78
+
79
+ - **Title tries:** *saltway* (too plain), *The Last Keeper of Ys* (too much
80
+ subtitle), **lanternway** (fuse: lantern + way — a lit path; keeps the house
81
+ grammar). Ship the one-word fuse.
82
+ - **Places:** *the Duskmere* (the drowning marsh), *the Far Lamp* (the last
83
+ lantern). Not "Level 5."
84
+ - **Mechanics:** *kindle* (light), *ward* (hold the dark). In-world verbs.
85
+ - **Tone sheet:** title *"lanternway."* · prompt *"the path ahead is dark."* ·
86
+ win *"the far lamp holds."* · loss *"the dark has the road."* Four strings,
87
+ one weathered voice, no adjectives to spare.
88
+
89
+ ## Aesthetic hook
90
+
91
+ Tone is set by the **Kentō** register itself: the palette is *elegant Japanese
92
+ craft* (the name *kentō* — 見当 — is the woodblock registration mark that aligns
93
+ each colour pass), so the copy should share that restraint — spare, concrete,
94
+ unhurried. Text is a **DOM overlay** in the house style, not `Text` nodes drawn
95
+ into the scene (`docs/CONVENTIONS.md`), which frees the voice from HUD clutter:
96
+ say less, and set it in the serif the JUDGE renders true (`docs/JUDGE.md` fonts).
97
+ A title screen with one word in ink on washi *invites* (JUDGE chrome axis) far
98
+ better than a paragraph of lore. Match the naming register to the palette
99
+ register: weathered names for the woodblock look; save the neon-mythic voice for
100
+ a deliberately swapped palette.
101
+
102
+ ## Traps
103
+
104
+ - **Fantasy-generator soup.** *Zephyrvale of the Thornwilds*. Apostrophes,
105
+ double-vowels, and stacked proper nouns read as generated. One clean word beats
106
+ a compound epic.
107
+ - **Subtitle crutch.** If the name needs *": A Tale of…"* to make sense, the name
108
+ isn't carrying its weight.
109
+ - **Register drift.** A weathered title over jokey button text (or vice versa)
110
+ breaks the spell. One register, everywhere.
111
+ - **UI-verb naming.** "Activate ability," "consume resource." Name it in-world or
112
+ the fiction leaks out through the buttons.
113
+ - **Adjective pile-up.** The house voice trusts the noun. Three adjectives means
114
+ the scene isn't showing what the words are telling.
115
+
116
+ ## Composes with
117
+
118
+ - [[world-worldbuilding-scaffold]] — the premise and role the name compresses.
119
+ - [[world-faction-identity]] — faction names inherit the register and the value.
120
+ - [[world-narrative-delivery]] — tone governs every string the world shows, and
121
+ restraint here is what lets the *systems* speak.
122
+
123
+ ## See also
124
+
125
+ - [`docs/JUDGE.md`](../../docs/JUDGE.md) — chrome & finish: a spare, well-set
126
+ title *invites*; a wall of lore doesn't.
127
+ - `docs/CONVENTIONS.md` — menus/titles/HUD are DOM overlays; Kentō is the house
128
+ palette and *kentō* the registration-mark namesake.
129
+ - Example titles *lanternway*, *rootward*, *tarnholm*, *kintsugi* — the restraint
130
+ in one word (reference the *technique*, not the words themselves).