Romance
Elves don't choose who to love. Attraction emerges from shared emotional experiences -- grief, transcendence, comfort in dark moments. Romance in your settlement is asymmetric, gradual, and deeply shaped by personality.
Overview
Each elf can hold up to 3 simultaneous attractions. Attractions accumulate warmth over time through shared experiences. When warmth crosses key thresholds, the relationship progresses through stages: attraction, courtship, and partnership. Partnerships can dissolve under aesthetic drift or status asymmetry, leaving permanent personality scars.
Romance runs on three tick systems:
- Warmth accumulation (every 50 ticks)
- Progression (every 50 ticks)
- Dissolution (every 100 ticks)
Source: crates/er-sim/src/sim/systems/romance.rs -- romance_warmth_system, romance_progression_system, romance_dissolution_system.
How It Works
Warmth Sources
Warmth grows through shared emotional moments, not compatibility scores. Two elves must experience something together for attraction to build.
| Source | Warmth | Catalyst? | Condition |
|---|---|---|---|
| Shared transcendence | +8.0 | Yes | Both loved the same composition at the last revel |
| Shared grief | +6.0 | Yes | Both mourning the same departed friend |
| Comfort in darkness | +5.0 | Yes | One elf's morale < 30, other within 3 tiles |
| Aesthetic resonance | +2.0 | No | Aesthetic distance < 0.25 AND friends |
| Slow burn | +1.0 | No | Friends AND within 5 tiles |
Catalyst events are special -- they don't just add warmth, they unlock the courtship transition. A spark without a catalyst stays as unacted attraction.
Source: crates/er-sim/src/sim/systems/romance.rs, romance_warmth_system -- catalyst flag set on SharedTranscendence, SharedGrief, ComfortInDarkness.
Personality Multipliers
All warmth gains are scaled by the attracted elf's personality:
| Personality | Multiplier | Effect |
|---|---|---|
| Bold (boldness > 0.7) | x1.3 | Falls faster |
| Cautious (boldness < 0.3) | x0.6 | Falls slowly, carefully |
| Proud (pride > 0.7) | x0.8 | Slightly guarded |
A cautious, proud elf accumulates warmth at 0.6 x 0.8 = 48% of the base rate. A bold elf with low pride accumulates at 130%. Love is not equally distributed.
Source: crates/er-sim/src/sim/systems/romance.rs, romance_warmth_system -- Personality::sigmoid_effect applied to boldness/pride thresholds.
Progression Stages
| Stage | Threshold | Requirements |
|---|---|---|
| Attraction | warmth > 0 | Automatic when any warmth source fires |
| Courtship | warmth >= 60.0 | Mutual warmth >= 60 AND catalyst within last 100 ticks |
| Partnership | warmth >= 85.0 | Both courting each other AND both warmth >= 85 |
Courtship requires both elves to have warmth >= 60 for each other (mutual) and a recent catalyst event (within 100 ticks of the spark). One-sided warmth above 60 doesn't trigger courtship -- it starts the unrequited clock.
Partnership is the final stage. Only romance_progression_system creates partnerships; only romance_dissolution_system removes them. The Relationships::adjust method guards Partners from being reclassified by the normal social system.
Source: crates/er-sim/src/sim/systems/romance.rs, romance_progression_system -- COURTSHIP_THRESHOLD = 60.0, PARTNERSHIP_THRESHOLD = 85.0.
Unrequited Love
When one elf's warmth crosses 60 (spark) but the target's warmth stays below 30 for 200 ticks, the attraction resolves as unrequited:
- An
Unrequitedpersonality scar is applied - Mood penalty: -5 for 150 ticks
- The attraction is removed
This is one of the few ways scars form outside of partnership dissolution. A cautious elf who builds warmth slowly may carry unrequited scars from multiple failed attractions over a long game.
Source: crates/er-sim/src/sim/systems/romance.rs, romance_progression_system -- unrequited branch at 200 ticks after spark_tick.
Dissolution
Partnerships accumulate dissolution pressure over time. When pressure reaches 100.0, the partnership ends.
Pressure sources (per 100-tick cycle):
| Source | Pressure | Condition |
|---|---|---|
| Aesthetic alienation | (distance - 0.8) x 5.0 | Aesthetic distance > 0.8 |
| Status asymmetry | (gap - 0.3) x 3.0 | Prestige gap > 0.3 |
| Partner is rival | +10.0 | Relationship type = Rival |
Patience modifier: all pressure is scaled by (1.5 - patience). A patient elf (patience = 1.0) scales pressure by 0.5x. An impulsive elf (patience = 0.0) scales by 1.5x.
Proximity repair: when partners are within 3 tiles, pressure decreases by up to -2.0 per cycle (minimum delta: -5.0). Keeping partners near each other physically slows dissolution.
Dissolution events:
| Trigger | Scar Type | Who Gets Scarred |
|---|---|---|
| Betrayal (partner courting someone else) | Betrayal | Only the betrayed elf |
| Aesthetic drift | Heartbreak | Both elves |
| Prestige asymmetry | Heartbreak | Both elves |
| Growing apart | Heartbreak | Both elves |
Betrayal is instant -- it doesn't wait for pressure to reach 100. If one partner begins courting a third elf, the partnership dissolves immediately.
Source: crates/er-sim/src/sim/systems/romance.rs, romance_dissolution_system -- pressure cap at 100.0, patience modifier at 1.5 - patience.
Partnerships carry origin markers — records of how the bond grew (apprenticeship, shared grief, rivalry-turned-love) that shift the dissolution threshold above or below baseline 100. A partnership with Apprenticeship and SharedCrisis origins dissolves at pressure 135, not 100; a RivalryToLove partnership dissolves at 90. When origin history saves a partnership from a pressure cycle that would have ended it at baseline, an OriginSavedPartnership event fires in the feed.
Values & Formulas
Warmth Timeline Example
Two bold friends (boldness > 0.7) who share a revel transcendence moment:
- SharedTranscendence: +8.0 x 1.3 = +10.4 (catalyst set)
- SlowBurn each 50-tick cycle: +1.0 x 1.3 = +1.3
- At cycle 39 (~1,950 ticks): warmth crosses 60.0 -- spark
- If mutual and catalyst within 100 ticks: courtship begins
- Continued SlowBurn + AestheticResonance: ~2.0-3.3 per cycle
- At ~cycle 58 (~2,900 ticks): warmth crosses 85.0 -- partnership
A cautious pair (x0.6) would take roughly twice as long to reach the same thresholds.
Dissolution Timeline Example
Partners with aesthetics drifting apart (distance = 0.9):
- Pressure per cycle: (0.9 - 0.8) x 5.0 = 0.5
- Patient elf (patience = 0.8): 0.5 x 0.7 = 0.35 per 100 ticks
- Impulsive elf (patience = 0.2): 0.5 x 1.3 = 0.65 per 100 ticks
- If not near each other: ~150-290 cycles (15,000-29,000 ticks) to dissolve
- If near each other: repair of -2.0 per cycle far exceeds pressure -- stable
Aesthetic drift alone dissolves partnerships slowly. Add a prestige gap and the pressure compounds rapidly.
Interactions
Mood Effects
| Situation | Mood | Duration |
|---|---|---|
| Near beloved (partner within 3 tiles) | +5 | 50 ticks |
| Courting someone | +5 | While courting |
| Unrequited resolution | -5 | 150 ticks |
| Publicly criticized by partner | -4 | 80 ticks |
Source: crates/er-sim/src/sim/systems/social.rs, social_mood_system -- "Near beloved" modifier.
Satisfaction
Romance contributes directly to satisfaction:
| Situation | Satisfaction |
|---|---|
| Has partner | +10.0 |
| Courting someone | +5.0 |
| Per scar | -1.5 |
| Unrequited attraction (active) | -3.0 |
Source: crates/er-sim/src/sim/systems/satisfaction.rs, satisfaction_system -- romance_bonus section.
Composition Properties
Romance states unlock composition properties when an elf composes:
| Condition | Property |
|---|---|
| Has partner, partner satisfied (mood > 0) | Contentment |
| Heartbreak scar AND currently unpartnered | Heartbreak (+15 emotional) |
| Currently courting | LoveSong (+10 emotional) |
| Partner just departed | Elegy (compound property) |
| PartnerLoss scar for currently-mourned elf | +10 emotional (no slot) |
See Scars — Composition Properties for the full picture.
Source: crates/er-sim/src/sim/systems/compose.rs, compose_system -- partner contentment and scar-driven properties.
Tips
-
Shared transcendence is the strongest catalyst. Schedule revels with compositions that polarize the audience -- elves who both Love the same piece get +8 warmth and a catalyst flag. This is the fastest path to courtship.
-
Grief bonds are powerful. When an elf departs, watch who mourns together. Shared grief (+6, catalyst) can spark romances between elves who barely knew each other before the loss.
-
Keep partners near each other. Proximity repair (-2.0/cycle) counteracts mild aesthetic drift. Partners who work in the same zone are more stable than those assigned to opposite ends of the settlement.
-
Watch for unrequited spirals. A cautious elf (x0.6 warmth) paired with a bold elf (x1.3 warmth) can create asymmetric attraction -- the bold elf's warmth climbs past 60 while the cautious elf's is still at 35. The 200-tick unrequited clock starts for the bold elf.
-
Betrayal is instant and one-sided. If a partnered elf begins courting someone new, the existing partnership dissolves immediately. Only the betrayed elf gets the Betrayal scar. The betrayer walks away clean.
-
Scars accumulate. An elf who has been through two heartbreaks carries -3.0 satisfaction permanently. Three unrequited loves add another -4.5. Multiple scars can push an elf toward departure even if everything else is going well.