Revels

Overview

Revels are the cultural heartbeat of an elven settlement -- communal gatherings where compositions are performed, audience reactions are evaluated, relationships form, and the settlement's aesthetic identity evolves. They are the primary way that art connects to the social fabric: a single revel can boost morale, trigger creative blocks, form new fandoms, and shift the aesthetic landscape of the entire community.

Revels are scheduled by the Curator (or the Dummy Curator's rule-based logic) and require a Feast Hall, food, compositions, and enough available elves.


How It Works

Scheduling Requirements

The Dummy Curator schedules a revel when all of the following are true:

RequirementCondition
Feast HallAt least one built
CompositionsAt least one exists in the settlement portfolio
Available elves>= 5 elves not in creative block
Food>= 5 (or >= 15 in Winter)
Cooldown>= 400 ticks since last revel ended

The LLM Curator uses the same information but makes its own judgment call. The player can also influence revel timing through messages to the curator.

Source: src/sim/curator/dummy.rs, revel scheduling logic

Lifecycle Phases

A revel progresses through three phases, each with a fixed tick duration:

None --> Gathering (5 ticks) --> Performing (5 ticks per piece) --> Aftermath (5 ticks) --> None

Phase 1: Gathering (5 ticks)

During gathering, elves walk toward the Feast Hall. Elves are directed to the hall each tick until they arrive or the phase ends:

  • Elves with a creative block are excluded from attendance
  • Attendance is capped at the settlement's capacity
  • Elves who arrive at the hall receive the RevelAttending marker
  • Attending elves skip the normal behavior tree for the revel's duration

At the end of the gathering phase, food is consumed:

Food consumed = min(attendee_count, available_food)

If there is not enough food for everyone, all attendees receive a "Sparse feast" mood modifier: -3 for 100 ticks.

Source: crates/er-sim/src/sim/systems/revel.rs, revel_tick_system, Gathering phase

Phase 2: Performing (5 ticks per composition)

Compositions are performed one at a time, newest first. Each performance takes 5 ticks to complete. At the end of each 5-tick window, audience evaluation runs.

For each audience member and each composition:

  1. The audience member's aesthetic position determines evaluation weights
  2. A weighted score is computed from the composition's mastery, originality, and emotional dimensions
  3. A social modifier is applied (+5 for social axis > 0.7, -3 for social axis < 0.3)
  4. Discontented elves receive a -5 penalty to their score
  5. The score maps to a reaction tier
Score RangeReaction
0-24Dislike
25-50Indifferent
51-75Enjoy
76-100Love

See Aesthetic Position for the full weight formulas.

Source: src/sim/art.rs, evaluate_audience

Phase 3: Aftermath (5 ticks)

The aftermath phase is a brief wind-down:

  • RevelAttending markers are removed from all elves
  • The revel zone is detected from attendee positions
  • Average audience score is computed across all performances and reactions
  • Great/boring revel satisfaction spikes are applied (see below)
  • The revel is archived to history with full reaction data
  • last_revel_tick is recorded (starts the cooldown timer)

Source: crates/er-sim/src/sim/systems/revel.rs, revel_tick_system, Aftermath phase


Values & Formulas

Mood Effects

Audience reactions produce mood modifiers:

ReactionMood EffectDuration
Dislike-3 ("Disliked {name}")50 ticks
IndifferentNo effect--
Enjoy+3 ("Enjoyed {name}")50 ticks
Love+6 ("Loved {name}")100 ticks

Satisfaction Spikes

Revels directly affect elf satisfaction, which drives the departure system:

EventSpike
Love reaction (per composition)+15 to that audience member
Great revel (avg score > 60)+10 to all attendees
Boring revel (avg score < 30)-10 to all attendees

These are buffered as "spikes" consumed by the satisfaction system on its next tick, so they integrate properly with the satisfaction recomputation.

Source: crates/er-sim/src/sim/systems/revel.rs, revel satisfaction spike logic in revel_tick_system

Inspiration Boost

A Love reaction boosts the audience member's dominant inspiration channel by +5 (capped at 100 per channel).

Source: crates/er-sim/src/sim/systems/revel.rs, revel_tick_system Love reaction handler

Aesthetic Drift

Every composition heard at a revel nudges all audience members' aesthetic positions toward the composition's aesthetic snapshot:

Drift rate: 0.005 per axis per composition heard

A revel with 4 performances applies up to 4 drift increments per attendee. See Aesthetic Position for details.

Source: crates/er-sim/src/sim/systems/aesthetics.rs, AUDIENCE_DRIFT_RATE = 0.005

Fandom Formation

When an elf has a Love reaction to a composition (and is not the composer), the reaction is recorded in their Fandom memory. Each elf tracks up to 5 fan relationships, pruning the weakest if capacity is exceeded.

When a new fandom forms (first Love reaction for that composer), a FandomFormed event is emitted and archived as a revel incident.

See Fandom for how fan proximity then boosts composer inspiration, strengthens relationships, and emits FanRequest events over time.

Source: crates/er-sim/src/sim/components.rs, Fandom; crates/er-sim/src/sim/systems/fandom.rs, fandom_system; crates/er-sim/src/sim/systems/revel.rs, fandom emission in revel_tick_system

Prestige Update

When a composer's work receives a Love reaction at a revel, their last_love_tick is set to the current tick. This is the heartbeat of the prestige system -- it resets the decay clock.

The prestige score itself is computed every 50 ticks by the prestige_system from three inputs:

Prestige = (recent_loves x 5.0) + (fans x 10.0) + (compositions x 2.0) - decay

InputWeightSource
Recent Love reactionsx 5.0Count of Love reactions in the last 5 revels
Fan countx 10.0Number of elves with a Fandom entry for this composer
Portfolio sizex 2.0Total compositions in the elf's portfolio
Decay-1.0 per 50-tick cycleApplied when no Love reaction received in the last 200 ticks

The score is clamped to 0--100 and mapped to a tier:

TierScore Range
Unknown0--15
Emerging16--35
Established36--55
Renowned56--80
Legendary81--100

Prestige feeds into satisfaction at a weight of x 0.15 (max +15 at score 100). High-prestige elves also shape the settlement's aesthetic center with up to 3x weight (at prestige 100), making them cultural anchors whose taste disproportionately defines the community norm.

Tier changes emit PrestigeChanged events and are visible in the revel recap.

Source: crates/er-sim/src/sim/systems/prestige.rs, prestige_system; crates/er-sim/src/sim/components.rs, PrestigeTier::from_score

Performance Incidents

Two types of incidents can occur during a revel performance and are archived with the revel record:

PublicCritique

A PublicCritique fires when a rival of the composer gives a Dislike reaction to the performance, stacking an additional -4 mood on the composer (80 ticks) and granting +2 rivalry inspiration to the critic. The total mood hit on the composer is -7 (-3 Dislike + -4 PublicCritique). The incident is also recorded in the revel archive as PerformanceIncident::PublicCritique.

For the full mechanic — when rivalries form, how the conflict system runs, escalation/reconciliation, and how PublicCritique interacts with ego crises — see Rivalries → Public Critique.

Source: crates/er-sim/src/sim/systems/revel.rs, revel_tick_system -- PublicCritique logic.

FandomFormed

When a Love reaction creates a new fan relationship (first Love for that composer), a FandomFormed incident is recorded. See Fandom Formation above for details.


Ego Crisis

When a composer's own work receives a majority negative reception (more than half of audience reactions are Dislike or Indifferent), the composer suffers an ego crisis:

EffectValue
Satisfaction spike-30

This is separate from (and stacks with) individual Dislike mood penalties and PublicCritique penalties. A composer who is publicly criticized by a rival and gets majority negative reception takes:

  • -3 mood (Dislike reaction)
  • -4 mood (PublicCritique)
  • -30 satisfaction spike (ego crisis)

Ego crises are a significant blow. Combined with the -10 "boring revel" spike (if avg score < 30), a disastrous revel can push a composer toward departure.

Source: crates/er-sim/src/sim/systems/revel.rs, revel_tick_system -- ego crisis at majority negative check.

Dislike Accumulation

When an audience member Dislikes 2 or more performances in a single revel, they receive an additional satisfaction spike:

-20 satisfaction (on top of the per-performance Dislike mood penalties)

This punishes consistently bad revels more than a single weak performance.

Source: crates/er-sim/src/sim/systems/revel.rs, revel_tick_system -- dislike_counts tracking.

School Formation

When a composer accumulates 3 or more Love reactions across revels (tracked in their Aspirations), a SchoolFormed event fires. This marks the composer as a cultural attractor -- their aesthetic position becomes a gravitational center that pulls nearby non-friend elves toward it.

ParameterValue
Love reaction threshold3 total (lifetime, not per-revel)
School drift rate0.008 per axis per day
School influenceNon-friends only (friends already drift via friend drift)

The school drift system runs once per day (every DAY_LENGTH ticks). For each elf who is not a friend of the school composer and has fewer than 3 Love reactions themselves (i.e., is not a school-founder), their aesthetic position is nudged toward the school composer's aesthetic at a rate of 0.008 per axis per day.

Schools are how legendary composers reshape a settlement's entire aesthetic landscape. A composer with 5+ Love reactions acts as a constant aesthetic pull on every non-friend elf, slowly aligning the community toward their taste.

Source: crates/er-sim/src/sim/systems/aesthetics.rs, aesthetic_school_drift_system, SCHOOL_THRESHOLD = 3, SCHOOL_DRIFT_RATE = 0.008

Revel Absence

During the gathering phase, elves with extreme personality values may choose not to attend:

PersonalityConditionAbsence Reason
Cautiousboldness < 0.3"chose the forest over the fire"
Proudpride > 0.8"refused to attend"

These absences are logged as RevelAbsence events. Absent elves miss all performance effects (mood, satisfaction spikes, aesthetic drift, fandom formation) but also avoid negative outcomes from bad revels.

Source: crates/er-sim/src/sim/systems/revel.rs, revel_tick_system -- personality-driven absence events in Gathering phase.

Cooldown

After a revel ends, 400 ticks must pass before the next one can be scheduled. The first revel after settlement creation has its cooldown waived.

ParameterValue
Cooldown duration400 ticks
First revelCooldown waived
Food requirement (normal)>= 5
Food requirement (Winter)>= 15
Minimum elves5

Source: src/sim/curator/dummy.rs, cooldown check; src/sim/world.rs, last_revel_tick initialization


Revel Archive

Every completed revel is archived with:

  • Day number
  • Zone name (detected from attendee positions)
  • Attendee names
  • Full performance records with per-elf reactions and scores
  • Incidents (public critiques, fandom formations)

The archive computes an average score across all reactions and identifies the highlight (best-received performance by total reaction score sum).

Source: src/sim/components.rs, RevelArchive


Revel Types

Each revel has a type that determines its seasonal character. The type affects audience scoring through a seasonal appropriateness modifier -- holding the right revel in the right season boosts quality, while mismatched revels are penalized.

TypeLabelSeasonAppropriateness
StandardStandard RevelAny0 (neutral)
GardenWalkGarden WalkSpring+5 in Spring
GrandPerformanceGrand PerformanceSummer+5 in Summer, -8 in Winter
RetrospectiveRetrospectiveAutumn+5 in Autumn, -3 in Spring
ChamberPerformanceChamber PerformanceWinter+5 in Winter, -3 in Summer
SpontaneousSpontaneous RevelAny (weather-triggered)0 (neutral)

The curator selects from each season's natural options when scheduling. The seasonal appropriateness modifier is added to each audience member's score during the evaluation phase.

Source: crates/er-sim/src/sim/components.rs, RevelType::seasonal_options, RevelType::seasonal_appropriateness.

Seasonal Resonance

When a composition is performed, its seasonal property is checked against the current season. If they match, the audience responds more warmly. If they clash, the audience is slightly cooler.

ConditionScore Modifier
Composition's season matches current season+5
Composition's season does not match-1

These modifiers stack with the revel type's seasonal appropriateness. A Vernal composition performed at a Garden Walk in Spring receives both the +5 resonance bonus and the +5 GardenWalk-in-Spring appropriateness, for a total of +10 to every audience member's score. This is the core feedback loop that makes seasonal timing matter.

Conversely, a Hibernal composition at a summer Grand Performance gets -1 (mismatch) but the Grand Performance still provides +5 (it's in-season for its type). The combination is +4 -- not bad, just not as strong as a season-aligned performance.

Source: crates/er-sim/src/sim/art.rs, evaluate_audience -- seasonal resonance section.


Interactions

  • Compositions -- Performed newest-first; quality dimensions drive audience scores
  • Aesthetic Position -- Evaluation weights and audience drift
  • Inspiration -- Love reactions boost dominant channel; high inspiration prevents creative block
  • Satisfaction & Departure -- Great revels boost satisfaction, boring revels damage it
  • Needs & Mood -- Reactions generate mood modifiers; sparse feasts cause mood penalties
  • Relationships -- Fandom formation creates persistent social bonds
  • Buildings -- Feast Hall required; compositions require Workshop
  • Artistic Direction -- Direction influences which compositions are created before the revel
  • Romance -- Shared transcendence (both Loved the same piece) is the strongest romance catalyst (+8 warmth)
  • Arrivals -- Great revels (avg score >= 75) trigger the cultural event arrival channel (1-2 new elves)
  • Personality -- Extreme personality values can cause revel absences
  • Seasons & Weather -- Seasonal anchor events create revel windows; missing them applies mood penalties

Tips

  • Schedule revels when your best composers have recently finished new works. Compositions are performed newest-first, so recent high-quality pieces get heard.
  • Ensure adequate food before a revel. A "Sparse feast" mood penalty hits every attendee and can tank audience scores for the whole event.
  • Revels are the primary mechanism for settlement-wide aesthetic convergence. Without regular revels, elves drift apart culturally and satisfaction drops.
  • A revel with low average scores (< 30) actively harms the settlement through the -10 satisfaction spike. It is better to skip a revel than to hold one with only crude compositions.
  • Watch for discontented elves at revels -- they evaluate with a -5 penalty, making bad reactions even more likely. Addressing satisfaction before a revel improves outcomes.
  • The 400-tick cooldown means roughly one revel every 4 game days (with DAY_LENGTH=100). Winter's higher food requirement (15 vs 5) means you need well-stocked granaries to keep the revel cadence up.
  • Fandom is a powerful social mechanic. An elf who Loves a composer's work becomes a fan, which affects future proximity-seeking and inspiration. Legendary composers can reshape the settlement's culture through school drift.