Personality
Every elf has a personality defined by three axes -- boldness, patience, and pride. These aren't static labels. Root values shift permanently through scars, while expressed behavior drifts gradually toward the new root through maturation. An elf who suffers heartbreak doesn't change overnight; they change over hundreds of ticks, slowly becoming more cautious.
Overview
Personality has two layers:
- Root values (boldness, patience, pride): the elf's deep self. Only modified by scars. Set at birth/arrival and rarely change.
- Expressed values: what the elf actually acts on. Nudged toward root values by maturation every 50 ticks. These are what other systems read.
Each axis ranges from 0.0 to 1.0, with 0.5 as neutral:
| Axis | Low (< 0.3) | Mid | High (> 0.7) |
|---|---|---|---|
| Boldness | Cautious | Balanced | Bold |
| Patience | Impulsive | Balanced | Patient |
| Pride | Humble | Balanced | Proud |
The combination of all three axes defines an elf's gestalt -- a named archetype based on which octant of personality space they occupy.
Source: src/sim/components.rs, Personality struct -- root and expressed fields, PersonalityAxis enum.
How It Works
Gestalts
Every elf is assigned a gestalt based on whether each root axis is above or below 0.5. There are 8 gestalts, one for each corner of the personality cube:
| Boldness | Patience | Pride | Gestalt |
|---|---|---|---|
| > 0.5 | > 0.5 | > 0.5 | IronCrowned |
| > 0.5 | > 0.5 | <= 0.5 | DeepRoot |
| > 0.5 | <= 0.5 | > 0.5 | FlameTouched |
| > 0.5 | <= 0.5 | <= 0.5 | WindWalker |
| <= 0.5 | > 0.5 | > 0.5 | StillWater |
| <= 0.5 | > 0.5 | <= 0.5 | RootCalm |
| <= 0.5 | <= 0.5 | > 0.5 | ThornKeeper |
| <= 0.5 | <= 0.5 | <= 0.5 | DewLight |
Gestalt names appear in the elf detail view. They don't directly affect mechanics -- the three axis values do -- but they give a quick read on an elf's temperament.
Source: src/sim/components.rs, PersonalityGestalt enum and Personality::gestalt() method.
Generation
Founders (the starting elves) get personality values generated near the 8 corners:
- Base: 0.85 (high) or 0.15 (low) per axis
- Jitter: +/-0.1
- This creates distinct personality clusters in your starting population
Arrivals use bimodal generation:
- Each axis: 0.2 or 0.8 base (50% coin flip) + +/-0.1 jitter
- This produces elves with strong personality leanings, not wishy-washy midpoints
Expressed values start equal to root values. Divergence only happens after scars shift the root.
Source: src/sim/components.rs, Personality::random_founder and arrival generation in src/sim/arrival.rs.
Maturation
Every 50 ticks, expressed values drift toward root values:
expressed += (root - expressed) x rate
The rate is age-dependent -- young elves reshape quickly, elders resist change. See Lifecycle & Aging for the full stage-by-stage breakdown:
| Stage | Convergence Rate | Behavior |
|---|---|---|
| Young | 0.04 (4%) | Visibly shifts within a few days of a scar |
| Prime | 0.02 (2%) | Baseline; noticeable shift over ~10 days |
| Mature | 0.01 (1%) | Slow adjustment; identity is largely set |
| Elder | 0.005 (0.5%) | Nearly immovable; a late-life scar barely affects behavior |
At the Prime rate of 2% per cycle, after a scar shifts a root value:
- 500 ticks (~5 days): 82% of the way to the new root
- 1,000 ticks (~10 days): 96% converged
- 1,500 ticks (~15 days): effectively identical to root
Young elves reach the same convergence roughly twice as fast; Elder elves take roughly four times as long. Identity calcifies with age.
Source: crates/er-sim/src/sim/systems/mood.rs, personality_maturation_system; crates/er-sim/src/sim/components.rs, Stage::maturation_rate.
Sigmoid Effect
When personality values are read by other systems (romance warmth, social bonding, crisis triggers), they pass through a sigmoid function that compresses the middle and stretches the extremes:
if raw < 0.5: 2.0 x raw x raw
if raw >= 0.5: 1.0 - 2.0 x (1.0 - raw) x (1.0 - raw)
| Input | Output | Effect |
|---|---|---|
| 0.0 | 0.0 | Extreme low preserved |
| 0.25 | 0.125 | Middle compressed |
| 0.5 | 0.5 | Neutral unchanged |
| 0.75 | 0.875 | Middle compressed |
| 1.0 | 1.0 | Extreme high preserved |
This means personality only has strong mechanical effects at the extremes. An elf with boldness 0.4 vs 0.6 behaves almost identically. An elf with boldness 0.1 vs 0.9 behaves very differently.
Source: src/sim/components.rs, Personality::sigmoid_effect.
Personality Crises
Extreme personality values can trigger transient crisis states under certain conditions. The crisis system runs every 10 ticks. See Scars — Transient Crisis Markers for the full table and mechanics.
| Crisis | Trigger | Duration | Leaves Scar? |
|---|---|---|---|
| EgoWound | argument AND pride > 0.85 AND morale < 40 | 150 ticks | Yes — EgoWound scar |
| Withdrawal | boldness < 0.15 AND company > 80 | 200 ticks | No |
| RecklessAbandon | patience < 0.15 AND stalled aspiration | 100 ticks | No |
| LongPatienceBroken | argument AND patience > 0.85 (10% chance) | 50 ticks | No |
Only EgoWound leaves a permanent scar when it expires. The others resolve without lasting personality change — the elf rode out the weather.
Source: crates/er-sim/src/sim/systems/social.rs, conflict_system (EgoWound / LongPatienceBroken triggers) and personality_crisis_system (Withdrawal / RecklessAbandon triggers, all four expiries).
Scars
Scars are permanent modifications to root personality values — the one mechanism that actually moves root axes after character generation. Each scar applies a small axis shift (clamped to 0.05-0.95), carries a narrative label, and costs -1.5 satisfaction forever.
Five scar kinds exist: Heartbreak, EgoWound, Betrayal, Unrequited, PartnerLoss. Four of five shift boldness downward — emotional loss makes elves cautious.
For full details — formation conditions, root-shift values per scar, events, composition interactions, and the boldness-erosion spiral that pushes elves toward departure — see the dedicated Scars page.
Source: src/sim/components.rs, PersonalityScar struct, ScarKind enum, Personality::apply_scar.
Values & Formulas
Satisfaction Bonuses by Personality
The satisfaction system applies personality-specific bonuses every 10 ticks:
| Personality | Bonus | Condition |
|---|---|---|
| Bold (> 0.7) | +0.05 per friend above 3 | Rewards social boldness |
| Cautious (< 0.3) | +0.05 per solitude inspiration | Rewards introspection |
| Patient (> 0.7) | +0.1 per completed aspiration | Rewards long-term goals |
| Impulsive (< 0.3) | +0.05 per composition | Rewards prolific creation |
| Proud (> 0.7) | prestige_tier x 0.03 | Rewards status |
| Humble (< 0.3) | +0.05 per friend (cap 4) | Rewards community |
Source: crates/er-sim/src/sim/systems/satisfaction.rs, satisfaction_system -- personality bonus section.
Personality Effects Across Systems
| System | Boldness Effect | Patience Effect | Pride Effect |
|---|---|---|---|
| Romance warmth | x1.3 (bold) / x0.6 (cautious) | -- | x0.8 (proud) |
| Romance dissolution | -- | Pressure x (1.5 - patience) | -- |
| Revel absence | < 0.3: may skip revel | -- | > 0.8: may skip out of pride |
| Social bonding | Via Social axis | -- | -- |
| Crisis: Withdrawal | < 0.15 triggers | -- | -- |
| Crisis: Reckless Abandon | -- | < 0.15 triggers | -- |
Interactions
Departure Risk
Scars push elves toward departure through two channels:
- Direct satisfaction penalty: -1.5 per scar
- Boldness erosion: Heartbreak, Betrayal, and PartnerLoss all reduce boldness. Lower boldness means slower romance warmth accumulation (x0.6), making it harder to form new partnerships -- which would provide +10 satisfaction.
An elf who suffers multiple romantic losses enters a downward spiral: scars reduce satisfaction, boldness erosion makes recovery harder, and departure becomes increasingly likely.
Composition Properties
Personality influences composition through crisis states and scars:
- Heartbreak scar + currently unpartnered: unlocks the
Heartbreakproperty (raw emotional art, +15 emotional) - PartnerLoss scar + actively mourning same person: +10 emotional boost (no property slot — it's a resonance)
- Currently courting (not a scar): unlocks the
LoveSongproperty
Revel Behavior
Personality drives revel attendance decisions. During the gathering phase, elves with extreme personality values may choose not to attend:
- Cautious (boldness < 0.3): "chose the forest over the fire"
- Proud (pride > 0.8): "refused to attend -- if they don't want their art, they don't want their festival"
These absences generate RevelAbsence events in the log.
Tips
-
Read the gestalt, but watch the axes. IronCrowned tells you an elf is bold+patient+proud, but the specific values matter. An IronCrowned at (0.55, 0.55, 0.55) behaves very differently from one at (0.95, 0.95, 0.95) due to the sigmoid effect.
-
Scars are permanent but slow-acting. After a heartbreak, the elf's expressed boldness doesn't drop for days. Use the maturation window to stabilize them -- place them near friends, give them meaningful work.
-
Cautious elves are fragile. They accumulate romance warmth at 60% rate, making courtship slower. If their partner leaves, the PartnerLoss scar pushes boldness even lower. A formerly cautious elf with two PartnerLoss scars may never form another partnership.
-
Proud elves resist romance. The x0.8 warmth multiplier for pride > 0.7 means proud elves take longer to fall in love, but their partnerships are no more stable than anyone else's. A proud elf who does partner up is just as vulnerable to dissolution from aesthetic drift.
-
EgoWound is the only scarring crisis. A proud elf (pride > 0.85) whose morale drops below 40 after an argument enters an EgoWound crisis — 150 ticks. If it expires, they gain a permanent EgoWound scar (pride +0.03, patience -0.05). Withdrawal, RecklessAbandon, and LongPatienceBroken all expire silently. See Scars — Transient Crisis Markers.