Cultural Movements
When a settlement's artistic life crosses certain thresholds, the simulation emits cultural milestone events: visible signals in the event feed that something larger than any single composition or elf has happened. These events mark when a composer's audience grows large enough to constitute a "school," when a genre is invented for the first time, or when a movement of like-minded elves crystallizes around shared loves.
This page covers three colony-level events:
- SchoolFormed — a composer crosses 3 cumulative Love reactions. Implemented.
- GenreInvented — a settlement's first anachronistic composition. Defined but not yet emitted.
- MovementCrystallized: coalescence of co-loving elves into a named movement. Implemented.
All three are EventPriority::Notable -- they appear in the event feed and
revel recap but do not pause the game. Their reach extends well beyond
individual elves: each marks a moment where the colony's culture has, in some
small or large way, taken on a new shape.
Source: crates/er-sim/src/sim/events.rs, variants SchoolFormed,
GenreInvented, MovementCrystallized; priority classification in
CulturalEvent::priority.
SchoolFormed
A composer becomes a "school" the moment their cumulative count of Love reactions received as a composer crosses 3. From that moment forward, they are an aesthetic attractor: nearby non-friend elves slowly drift toward their taste direction (see School Drift).
Formation Conditions
| Condition | Value |
|---|---|
| Trigger | Composer's Aspirations.love_reactions_received crosses SCHOOL_THRESHOLD |
| Threshold | 3 total Love reactions across the composer's career |
| Frequency | One-shot — fires only on the transition from below to at-or-above 3 |
| When | During revel processing, immediately after a composition's audience reactions are tallied |
The check is "was below threshold and is now at-or-above" -- so if a composer gets two Love reactions in one performance and they were already at 1, the event fires once for the threshold crossing, not twice.
Event Payload
| Field | Type | Description |
|---|---|---|
composer | String | Name of the elf who became a school |
love_count | u8 | The composer's total Love reactions at the moment of formation (>= 3) |
Display
"{composer} has become a legendary school ({love_count} loves)"
⚠ Terminology warning: The display string says "legendary school," but the threshold is just 3 Love reactions -- a very low bar. This is not related to the Legendary prestige tier (which requires score 81+). A school composer can be a brand-new arrival with an Unknown prestige tier and a single hit performance. See the aesthetic position page for further discussion of this naming collision.
Player Significance
A SchoolFormed event tells the player: this composer's work is now influencing
other elves' aesthetic positions. Concretely:
- Non-friend elves within 5 Manhattan tiles of the school composer drift toward the direction of the composer's aesthetic (relative to 0.5) by 0.008 per axis per day.
- The composer's prestige score gets the same fan and
Love-reaction inputs it always did --
SchoolFormedis a separate, parallel signal, not a prestige driver. - Schools tend to cluster: a school composer who keeps performing accumulates fans, the fans drift toward them aesthetically, and over time a coherent "movement" emerges around the school's chosen axis directions.
The event is the cue to start watching that part of the settlement for cultural identity formation.
Source: crates/er-sim/src/sim/systems/revel.rs -- emission at the
was_below && asp.love_reactions_received >= SCHOOL_THRESHOLD branch around
line 371; crates/er-sim/src/sim/systems/aesthetics.rs -- school drift
behavior keyed to the same SCHOOL_THRESHOLD = 3 constant.
GenreInvented
A GenreInvented event would mark the moment a settlement composes its first
anachronistic piece in a given genre family -- a cultural shock event
celebrating that someone broke from the traditional and natural genres into
something new (Jazz, Rock, Blues, Free Verse, and similar genre families
described in the compositions reference).
⚠ Status: defined but not currently emitted. The event variant exists in
CulturalEventand would render in the event feed if produced, but no system in the codebase constructs it today. The 2026-03-16 art-data-files PRD explicitly defers it ("GenreInvented event deferred (noted as TODO)").
Intended Formation Conditions
Per the original game-mechanics specification:
"When an anachronistic piece is the settlement's first, emit
GenreInvented."
The intended trigger is a per-settlement "first anachronistic genre" recognition: the system would need to track which genre families have been performed at least once in the settlement's history and fire the event the first time a composition lands in a previously-unseen anachronistic family.
Event Payload
| Field | Type | Description |
|---|---|---|
genre | String | Name of the genre family invented (e.g., "Jazz") |
inventor | String | Name of the elf whose composition triggered the event |
Display (when implemented)
"{inventor} invented a new genre: {genre}!"
Why It's Worth Implementing
Anachronistic genres carry strong aesthetic signal -- they are the colony's break from tradition, the moment innovation overtakes inheritance. A first emission would be a real cultural milestone worth marking in feeds, and could plausibly factor into:
- Arrival mechanics (new wanderers attracted by cultural novelty -- see the reputation-based arrival design noted in earlier handoffs).
- Aspiration progress for innovation-leaning elves.
- A potential
Foundertag for the inventing composer (analogous to colony founders).
See the follow-up beads for the open implementation issue.
Source: crates/er-sim/src/sim/events.rs -- variant declaration only.
Original design: docs/plans/2026-03-14-game-mechanics-spec.md line ~540 and
docs/brainstorms/2026-03-16-art-data-files.md line ~63.
MovementCrystallized
A MovementCrystallized event marks the formation of a named cultural
movement: a coherent group of elves bound together by shared aesthetic loves,
strong enough to constitute a recognizable artistic faction within the colony.
Status: implemented (Revel-mcyt / Revel-jbo).
movement_detection_systemruns after every revel and can crystallize a new movement, populate its founder, and trigger the "of the Morning Choir" epithet for that founder. The mood-bonus and revel-scoring downstream effects sketched in the original spec are not implemented; see Not Yet Wired below.
Formation Conditions
movement_detection_system (crates/er-sim/src/sim/systems/movements.rs)
runs once per revel, right after that revel's archive lands (world.rs slot
8b, gated on a RevelEnded event having fired that tick):
- Take the last 5 revel archives (
MOVEMENT_REVEL_WINDOW). For everyLovereaction in that window, record which compositions each elf loved, skipping a composer's own love of their own work (self-love never counts). - Build a co-love graph over elves: an edge connects two elves when they
share at least 3 loved compositions (
MOVEMENT_MIN_SHARED_LOVES). - Take connected components of that graph (union-find over the sorted elf
name list, for determinism). Keep components with at least 3 members
(
MOVEMENT_MIN_MEMBERS). - Within a qualifying component, the cluster works are the compositions
loved by at least 2 of its members. The founding composition is the
cluster work with the smallest
Composition.id; the founder is that composition's composer. A component whose cluster works don't resolve to any known composition is skipped. - Dedup: a component is skipped if an existing movement already has the same founding composition, or shares at least half (rounded up) of its members with an existing movement.
- Naming:
"The {founder's first word} {flavour} School", where the flavour is the founding composition's firstCompositionPropertyif it has one, else its genre (e.g. "The Liriel Manifesto School").
Event Payload
| Field | Type | Description |
|---|---|---|
name | String | Name of the movement (e.g., "The Liriel Manifesto School") |
member_count | u32 | Number of founding members at crystallization |
founder | Option<String> | The elf whose founding composition seeded the movement |
Display
"A cultural movement has formed: '{name}' ({member_count} members), founded by {founder}"
Downstream Effects
- Morning Choir epithet: the founder named in the event's
founderfield earns "of the Morning Choir" via the epithet reactor (systems::epithets_reactor_system), same tick the movement crystallizes. - Persistence: every crystallized movement is appended to
GameWorld.movements: Vec<CulturalMovement>(name, founder, sorted member names, founding composition id/name, founded tick),#[serde(default)]so old saves load with an empty list.
The mood bonus ("Part of a movement" +2 morale per 200 ticks), the revel scoring modifier (+3/-2 for aligned/opposed elves), and patron favorite-a-movement interaction sketched in the original game-mechanics specification are not implemented by Revel-mcyt/Revel-jbo. See Not Yet Wired.
Source: crates/er-sim/src/sim/systems/movements.rs, function movement_detection_system
and the MOVEMENT_REVEL_WINDOW / MOVEMENT_MIN_MEMBERS / MOVEMENT_MIN_SHARED_LOVES
constants; crates/er-sim/src/sim/world.rs, slot 8b call site and
GameWorld::detect_movements_now; crates/er-sim/src/sim/systems/epithets.rs,
the "of the Morning Choir" trigger arm. Original design:
docs/plans/2026-03-14-game-mechanics-spec.md lines ~600-606 and
docs/prd/elf-revel-prd.md lines ~118-122.
Not Yet Wired
The following effects were part of the original specification but remain unimplemented after Revel-mcyt/Revel-jbo:
- Mood bonus: aligned elves getting "Part of a movement" +2 morale per 200 ticks.
- Revel scoring modifier: movement-aligned compositions scoring +3 from aligned elves and -2 from opposed elves at revels.
- Patron interaction: the human director favoriting or disfavoring movements.
If you're picking one of these up, file a bead against Revel-jbo's parent epic rather than reopening movement detection itself.
How These Events Interact
SchoolFormed and MovementCrystallized fire today; GenreInvented does not
yet. All three were designed as stages of cultural emergence at
increasing scale:
| Stage | Event | Scope | Trigger |
|---|---|---|---|
| 1. Recognition of a single composer | SchoolFormed | One composer | 3+ Love reactions |
| 2. Recognition of a genre breakthrough | GenreInvented | One genre family | First anachronistic of its family |
| 3. Recognition of a coherent audience faction | MovementCrystallized | Group of 3+ elves | Shared multi-composition loves across a 5-revel window |
A fully populated cultural-emergence pipeline lets a player watch their colony progress through these stages: a single compelling composer becomes a school, and eventually like-minded audience members coalesce into a recognizable movement around a founding composition, earning its founder "of the Morning Choir" along the way. Only the genre-breakthrough stage remains unimplemented.
Related Systems
- Revels, where Love reactions are tallied,
SchoolFormedis emitted, and every archived performance feedsmovement_detection_system's co-love window. The intended trigger site forGenreInventedwould also live here or in adjacent revel-processing logic. - Aesthetic Position — School Drift -- the simulation effect of becoming a school: nearby non-friends drift toward the school's aesthetic direction.
- Compositions -- genre families, including the anachronistic
family relevant to
GenreInvented. - Prestige -- a parallel reputation system for
composers; the Legendary prestige tier is unrelated to the "school"
threshold despite the shared word in the
SchoolFormeddisplay string. - Fandom -- per-elf fan tracking; fandom contributes to prestige independently of school formation.
Follow-up Work
MovementCrystallized detection shipped via Revel-mcyt/Revel-jbo; the
remaining unimplemented design intent on this page is:
- Revel-ris: implement
GenreInventedemission. Track first-seen genre families per settlement, fire on first anachronistic composition. - The movement mood bonus, revel-scoring modifier, and patron favoriting described in Not Yet Wired above, tracked against Revel-jbo's parent epic.
These are noted as TODO in the original PRD and game-mechanics spec. If
you're considering implementing GenreInvented, see
docs/plans/2026-03-14-game-mechanics-spec.md (~lines 540-606) for the
original spec.