Rivalries
Not every bond is a friendship. Two elves who keep getting in each other's way — clashing aesthetics, repeated negative encounters, a public slight at the wrong revel — can drift into rivalry, and rivalry has its own social weather: arguments at close range, hostile critiques during performances, escalation into entrenched feud, and (sometimes) reconciliation back to acquaintance.
This page is the canonical home for the rivalry mechanic and the four cultural events it generates: RivalryArgument, PublicCritique, CompetitionEscalated, and RivalryReconciled. For the underlying relationship strength model — how any bond, including rivalry, is created and adjusted — see Relationships.
Overview
A relationship becomes a rivalry when its strength falls to -30 or below. Below that threshold, the bond is classified as RelationType::Rival, which unlocks four related behaviors:
- Mood penalties when the rivals are within 3 tiles of each other (handled by the social mood system — see Relationships → Mood Effects).
- Arguments triggered by the conflict system on rival proximity.
- Public critiques triggered when a rival in a revel audience Dislikes the composer's work.
- Escalation past -60 and reconciliation back above -30, each surfacing its own event.
Rivalries are not just costs — they fuel the rivalry inspiration channel, which can push elves toward composition properties like Manifesto, Obsessive, and Virtuosic. A well-tuned rivalry produces art the elves wouldn't otherwise make.
Source: crates/er-sim/src/sim/components.rs, Relationships::adjust — Rival classification at strength -128..=-30.
How Rivalries Form
Rivalries form through the same proximity-and-aesthetic-affinity machinery as friendships, just running in the negative direction. Two elves with strongly opposed aesthetics (4D distance > 0.9) working near each other receive a -2 per cycle penalty to their bond instead of a positive delta. After enough cycles of negative drift, the strength crosses -30 and the relationship reclassifies to Rival.
Other paths into rivalry:
- Argument deltas: each rivalry argument applies an additional -2 to both sides of the bond, deepening it.
- Composition disliked by an enemy: if a relationship was already negative, a Dislike reaction at a revel doesn't change the strength directly, but the social cost of the public critique makes future positive drift harder (the composer's mood drop reduces their willingness to be near the critic).
See Relationships → Formation Triggers for the full delta tables. The same machinery, just with negative aesthetic affinity producing rivalry instead of friendship.
Rival threshold: relationship strength <= -30 (and not a Partner — partnerships are protected from reclassification).
Source: crates/er-sim/src/sim/components.rs, Relationships::adjust — strength clamped to -100..100, kind reclassified unless Partner.
The Conflict System
Once a relationship is classified as Rival, it becomes visible to the conflict system, which runs every 10 ticks and scans all elf pairs for:
- Manhattan distance <= 3 (rivals must be near each other for anything to happen).
- Both sides classified as Rival (the rivalry must be mutual — strength check on at least one side).
- Per-pair cooldown elapsed (no two arguments between the same pair within
DAY_LENGTH × 3ticks — three game days).
When all three conditions are met, the system rolls a personality-modulated argument chance:
Argument chance = 10% + 15% × max(impulsivity_a, impulsivity_b)
Impulsivity is a personality axis on each elf, mapped through a sigmoid into a 0–1 multiplier. Two patient elves argue at base ~10% per check; a pair where one elf is highly impulsive argues at ~25% per check. Since the system runs every 10 ticks, effective per-tick rates are ~1–2.5%.
Source: crates/er-sim/src/sim/systems/social.rs, conflict_system — proximity at Manhattan <= 3, cooldown at day_length * 3, chance formula at 0.10 + 0.15 * impulsivity.max().
Argument Events (RivalryArgument)
When a check succeeds, the system emits a RivalryArgument event with both elf names and a topic derived from the pair's greatest aesthetic-axis disagreement:
| Greatest disagreement axis | Topic |
|---|---|
| structure | "form versus freedom" |
| tradition | "tradition versus innovation" |
| emotion | "emotion versus intellect" |
| social | "art's purpose in the community" |
If aesthetic data is missing for either elf, the topic falls back to "artistic direction".
Argument Effects
Both elves take immediate consequences:
| Effect | Value | Duration |
|---|---|---|
| Mood penalty (both) | -2 to -5 ("Argued with rival"), scaled by pride | 50–100 ticks (longer for proud elves) |
| Rivalry inspiration boost (both) | +3 | Permanent (capped at 100) |
| Relationship strength delta (both) | -2 | Permanent |
Pride modulation matters. A high-pride elf takes a deeper mood hit (down to -5) for a longer duration (up to 100 ticks). A humble elf brushes off the same insult with -2 mood for 50 ticks. The formula is mood = -2 - (pride × 3) and duration = 50 + (pride × 50).
Personality Crisis Triggers
Arguments can also kick a fragile elf into a personality crisis, surfaced by the PersonalityCrisis event:
- EgoWound: pride > 0.85 AND morale < 40 AND no existing wound → +150 ticks of "Wounded pride" (-8 mood) and an
EgoWoundcomponent. - LongPatienceBroken: patience > 0.85, 10% chance per qualifying argument → +50 ticks of "Patience shattered" (-5 mood) and a
LongPatienceBrokencomponent.
Argument priority in the event feed: Notable (worth reading, not pause-worthy).
Source: crates/er-sim/src/sim/systems/social.rs, conflict_system and argument_topic — mood/inspiration/strength deltas; pride scaling at lines 525–540; crisis triggers at lines 596–620.
Source: crates/er-sim/src/sim/events.rs, EventPriority — RivalryArgument is Notable.
Public Critique (PublicCritique)
Rivalry follows elves into the revel hall. When a composer performs at a revel, every audience member rolls an aesthetic reaction (Love / Enjoy / Indifferent / Dislike). If a rival of the composer rolls Dislike, the system emits a PublicCritique event:
| Effect | Value | Duration |
|---|---|---|
| Composer mood penalty | -4 ("Publicly criticized") | 80 ticks |
| Rivalry inspiration boost for the critic | +2 | Permanent (capped at 100) |
This stacks on the base Dislike penalty (-3 mood for 50 ticks). A composer publicly critiqued by a rival receives a total of -7 mood from one event.
PublicCritiques are also recorded as PerformanceIncident::PublicCritique in the revel archive, preserving the critic and target names for later inspection.
If the critique pushes the revel into majority-negative reception, the composer additionally takes the -30 satisfaction "ego crisis" spike. See Revels → Ego Crisis for that interaction.
Priority: Notable.
Source: crates/er-sim/src/sim/systems/revel.rs, revel_tick_system lines 294–334 — rival check on Dislike reactions, mood and inspiration deltas.
Escalation (CompetitionEscalated)
When an argument's -2 strength delta pushes the bond past -60, the system emits a CompetitionEscalated event. This marks a deeply entrenched rivalry — the pair has argued (or drifted) enough times that hostility is now a defining social feature of their relationship.
Escalation threshold: relationship strength crosses from above -60 to <= -60.
The event itself fires only on the crossing — re-escalating after recovery requires the bond to first recover above -60 and then fall again. There is no separate "deeply escalated" state machine; the threshold is purely an event-emission gate. Escalated rivals continue to use the same conflict-system mechanics, just from a deeper hole that takes longer to climb out of.
Priority: Notable.
Source: crates/er-sim/src/sim/systems/social.rs, conflict_system lines 646–652 — escalation check on strength crossing from > -60 to <= -60.
Reconciliation (RivalryReconciled)
A rivalry can heal. When a Rival relationship's strength rises back above -30, the bond reclassifies to Acquaintance and the system emits RivalryReconciled.
Reconciliation threshold: relationship strength crosses from <= -30 to > -30.
How does a rivalry recover? Through the normal social system's positive proximity deltas: two former rivals working closely together with aligned aesthetics slowly heal the rift. Each cycle they get along can restore +1 to +2 strength; each argument re-applies -2.
This is why the 3-day per-pair argument cooldown matters for reconciliation: it gives the social system time to apply enough positive deltas between arguments. A pair that argues every 3 days but gets along between sessions can still trend toward reconciliation if the positive deltas outweigh the -2 per argument.
Reconciliation does not restore lost mood, lost inspiration, or the strength_min watermark on the relationship — that watermark is permanent (a relationship can be marked "once a rivalry" forever, which feeds the RivalryToLove partnership origin if the bond eventually flips all the way to Partner).
Priority: Notable.
Source: crates/er-sim/src/sim/systems/social.rs, conflict_system lines 654–660 — reconciliation check; crates/er-sim/src/sim/components.rs Relationships::adjust for strength_min semantics.
When Rivals Depart
When a rival departs, remaining elves who had a Rival bond with them receive a +3 mood "Rival departed" modifier for 100 ticks. See Satisfaction → Departure Cascade for the full mood effect table including friend and acquaintance reactions.
Tips
-
Don't ignore rival buildup. Two aesthetically opposed elves working together can drift to rivalry (-30) in roughly 15 social cycles (~750 ticks). Once they cross -30, the conflict system starts firing arguments, and each argument deepens the rivalry by another -2 while costing both elves mood. Separate them early if you don't want a feud, or commit to it if you do.
-
Pride is a multiplier on every argument. A high-pride elf takes -5 mood for 100 ticks per argument; a humble elf takes -2 for 50. If two proud elves become rivals, each argument is genuinely destabilizing. Watch for the
EgoWoundevent — it means a pride > 0.85 elf has been pushed past their morale threshold. -
Rivalry is a creative engine. Each argument grants both elves +3 rivalry inspiration, and public critiques add +2 for the critic. The Manifesto, Obsessive, and Virtuosic composition properties all require rivalry > 30. A composer with one well-tuned rival often produces more (and more pointed) art than one with none.
-
Public critiques compound disastrously. Composer mood, fan loss, ego crisis, and a permanent record in the revel archive all stack. A composer who is publicly criticized at a revel that also tilts majority-negative takes -7 mood plus -30 satisfaction in one tick. Schedule revels with the audience composition in mind — a rival in the audience is a coin flip, not a guarantee.
-
Reconciliation is slow but real. Two rivals working together with aligned aesthetics can heal back to Acquaintance over time. The 3-day per-pair argument cooldown is the window where reconciliation is possible. If you want to repair a rivalry, give the pair shared work in close proximity and avoid revel co-attendance until the bond crosses -30.
-
The
strength_minwatermark is permanent. A reconciled rivalry leaves a trace: the relationship remembers it was once at -30 or worse. This enables the RivalryToLove partnership origin — a former rival who became a partner has a more resilient bond than one who was always a friend. Reconciled rivals are not "back to neutral"; they have history. -
Personality crises are rare but durable. EgoWound (150 ticks) and LongPatienceBroken (50 ticks) both apply mood pushes that last long enough to risk a cascade into the satisfaction departure window. If you see
PersonalityCrisisin the feed, the affected elf is briefly fragile.
Related Pages
- Relationships — the underlying strength model, formation triggers, and bond classifications.
- Revels — performance reactions, including how a rival in the audience produces a PublicCritique.
- Inspiration — the rivalry channel and which composition properties it unlocks.
- Compositions — Manifesto / Obsessive / Virtuosic properties and their rivalry inspiration requirements.
- Partnership Origins — how a reconciled rivalry that becomes a partnership unlocks the RivalryToLove origin.
- Satisfaction & Departure — rivalry's contribution to the mood/satisfaction loop and the departure cascade.