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

ConditionValue
TriggerComposer's Aspirations.love_reactions_received crosses SCHOOL_THRESHOLD
Threshold3 total Love reactions across the composer's career
FrequencyOne-shot — fires only on the transition from below to at-or-above 3
WhenDuring 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

FieldTypeDescription
composerStringName of the elf who became a school
love_countu8The 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 -- SchoolFormed is 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 CulturalEvent and 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

FieldTypeDescription
genreStringName of the genre family invented (e.g., "Jazz")
inventorStringName 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 Founder tag 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_system runs 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):

  1. Take the last 5 revel archives (MOVEMENT_REVEL_WINDOW). For every Love reaction in that window, record which compositions each elf loved, skipping a composer's own love of their own work (self-love never counts).
  2. Build a co-love graph over elves: an edge connects two elves when they share at least 3 loved compositions (MOVEMENT_MIN_SHARED_LOVES).
  3. 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).
  4. 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.
  5. 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.
  6. Naming: "The {founder's first word} {flavour} School", where the flavour is the founding composition's first CompositionProperty if it has one, else its genre (e.g. "The Liriel Manifesto School").

Event Payload

FieldTypeDescription
nameStringName of the movement (e.g., "The Liriel Manifesto School")
member_countu32Number of founding members at crystallization
founderOption<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 founder field 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:

StageEventScopeTrigger
1. Recognition of a single composerSchoolFormedOne composer3+ Love reactions
2. Recognition of a genre breakthroughGenreInventedOne genre familyFirst anachronistic of its family
3. Recognition of a coherent audience factionMovementCrystallizedGroup of 3+ elvesShared 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.

  • Revels, where Love reactions are tallied, SchoolFormed is emitted, and every archived performance feeds movement_detection_system's co-love window. The intended trigger site for GenreInvented would 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 SchoolFormed display 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 GenreInvented emission. 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.