Aspirations
Aspirations are proactive, personality-driven goals that emerge from an elf's aesthetic position. Rather than merely reacting to needs and policies, an elf with active aspirations will seek out composing, socializing, or performing on their own initiative. Aspirations give each elf a sense of personal direction beyond survival.
Overview
Every elf maintains 1--2 active aspirations at a time, drawn from five possible goal types. The system selects goals by weighting each type against the elf's aesthetic axes -- an emotional elf gravitates toward mastery and earning love, while a social elf pursues friendships and revel performances. Aspirations are assigned automatically; the player does not pick them.
Aspirations progress naturally as elves go about their lives: composing a piece advances the ComposeWorks goal, leveling up a skill advances MasterSkill, and so on. When an aspiration completes, the elf receives a mood celebration. When one stalls too long, mood suffers instead.
How It Works
Goal Types
There are five aspiration goals an elf can pursue:
| Goal | Tracked Stat | Target Formula | Max Target |
|---|---|---|---|
| MasterSkill | Skill level (currently Music only) | current_level + 2 | 10 |
| MakeFriends | Count of Friends (strength >= 50) | current_friends + 2 | 6 |
| ComposeWorks | Number of completed compositions | current_compositions + 3 | 20 |
| PerformAtRevels | Revel performances attended | current_performances + 3 | 20 |
| EarnLove | "Love" audience reactions received at revels | current_love_reactions + 2 | 10 |
Each goal is set just beyond the elf's current achievement: a composer with 4 works gets a target of 7, an elf with 1 friend gets a target of 3.
Source: crates/er-sim/src/sim/systems/aspirations.rs, aspiration_assignment_system -- target formulas and .min() caps in the pool-construction block.
Assignment Algorithm
The assignment system runs every 50 ticks. It scans all elves and identifies those with fewer than 2 active aspirations. For each eligible elf, it builds a weighted pool of candidate goals and picks the highest-weight options to fill empty slots.
Step 1: Build the candidate pool. Each goal type gets a base weight plus a personality bonus from the elf's aesthetic axes:
| Goal | Base Weight | Aesthetic Bonus | Weight Formula |
|---|---|---|---|
| MasterSkill (Music) | 1.0 | Emotion axis | 1.0 + emotion |
| MakeFriends | 1.0 | Social axis (x2) | 1.0 + social * 2.0 |
| ComposeWorks | 1.0 | Structure axis | 1.0 + structure |
| PerformAtRevels | 0.8 | Social axis | 0.8 + social |
| EarnLove | 0.8 | Emotion axis (x1.5) | 0.8 + emotion * 1.5 |
Aesthetic axes range from 0.0 to 1.0, so the weight range for each goal is:
- MasterSkill: 1.0--2.0
- MakeFriends: 1.0--3.0 (strongest possible bias)
- ComposeWorks: 1.0--2.0
- PerformAtRevels: 0.8--1.8
- EarnLove: 0.8--2.3
Step 2: Filter. Goals are removed from the pool if:
- The elf already has an active aspiration of the same type (no duplicate variants).
- The elf has already reached the cap (e.g., Music skill is already 10, or they already have 6 friends).
Step 3: Select. The pool is sorted by weight (highest first). The system picks the top 1--2 goals to fill empty slots. Selection is deterministic -- the highest-weight goal always wins.
Source: crates/er-sim/src/sim/systems/aspirations.rs, aspiration_assignment_system -- pool construction, dedup filter, and deterministic sort.
Progress Tracking
The progress system runs every 10 ticks. It reads each elf's current state (skill levels, friend count, composition count, revel performances, love reactions) and compares against aspiration targets.
Progress updates are absolute, not incremental: if an elf's music skill is 5 and the aspiration target is 7, the progress value is set to 5. When the elf levels up to 6, progress becomes 6. When it reaches 7, the aspiration completes.
Each time progress increases, the last_progress_tick timestamp resets. This is important for stall detection.
Source: crates/er-sim/src/sim/systems/aspirations.rs, aspiration_progress_system -- progress read and update per 10-tick cycle.
Completion
An aspiration completes when progress >= target. On completion:
- The aspiration status changes from Active to Completed.
- A
CulturalEvent::AspirationCompletedevent fires (priority: Notable). - The elf receives a mood modifier: "Fulfilled an aspiration!", value +8, duration 200 ticks.
- At the next 50-tick assignment cycle, a new aspiration is assigned to fill the vacated slot.
Source: crates/er-sim/src/sim/systems/aspirations.rs, aspiration_progress_system -- status-change / event emission and mood-modifier branches on completion.
Abandonment and Stalling
Aspirations are never explicitly abandoned by the elf. Instead, a stall is detected when an active aspiration has made no progress for 500 ticks.
When a stall is detected:
- A
CulturalEvent::AspirationStalledevent fires (priority: Notable). - The elf receives a mood modifier: "Aspiration stalled", value -2, duration 100 ticks.
- The stall timer resets (
last_progress_tickupdated to current tick), so the stall event fires at most once per 500-tick window rather than every 10 ticks.
The aspiration stays Active even after stalling -- it does not automatically become Abandoned. It can still complete if the elf eventually makes progress. The stall is a warning, not a death sentence.
Source: crates/er-sim/src/sim/components.rs, Aspiration::is_stalled; crates/er-sim/src/sim/systems/aspirations.rs, aspiration_progress_system -- stall detection and mood-modifier branches.
Values & Formulas
Timing Constants
| Constant | Value | Description |
|---|---|---|
| Assignment interval | 50 ticks | How often new aspirations are assigned |
| Progress check interval | 10 ticks | How often progress is re-evaluated |
| Stall threshold | 500 ticks | No-progress duration before stall fires |
| Completion mood duration | 200 ticks | How long the +8 celebration mood lasts |
| Stall mood duration | 100 ticks | How long the -2 stall penalty lasts |
Mood Effects
| Event | Mood Value | Duration | Method |
|---|---|---|---|
| Aspiration fulfilled | +8 | 200 ticks | push (stacks with other modifiers) |
| Aspiration stalled | -2 | 100 ticks | replace (refreshes if already present) |
Weight Summary
| Goal | Axis | Min Weight | Max Weight | Personality That Favors It |
|---|---|---|---|---|
| MasterSkill | Emotion | 1.0 | 2.0 | Emotional elves (emotion near 1.0) |
| MakeFriends | Social | 1.0 | 3.0 | Social elves (social near 1.0) |
| ComposeWorks | Structure | 1.0 | 2.0 | Structured elves (structure near 1.0) |
| PerformAtRevels | Social | 0.8 | 1.8 | Social elves (social near 1.0) |
| EarnLove | Emotion | 0.8 | 2.3 | Emotional elves (emotion near 1.0) |
Interactions
Aspiration-Driven Task Selection
Aspirations directly influence what idle elves choose to do. In the task decision system (Step 3b of Roles), aspiration goals are checked before cultural policy roles take effect:
- ComposeWorks or MasterSkill (Music): the elf's
wants_composeflag activates. If a Workshop is available, the elf walks there and composes instead of waiting for a role assignment. - MakeFriends: the elf's
wants_socializeflag activates. The elf heads to the nearest Feast Hall (or Garden as fallback) to seek proximity with other elves.
These aspiration-driven behaviors sit between moderate need fulfillment (Step 3) and skill-driven preference (Step 3c) in the priority order. They are overridden by critical needs, creative block, mourning, and discontented states.
Source: crates/er-sim/src/sim/systems/aspirations.rs, aspiration_wants_compose and aspiration_wants_socialize; crates/er-sim/src/sim/systems/behavior.rs, task_decision_system -- aspiration-driven task selection.
Discontented Override
Discontented elves refuse all aspiration-driven work. A discontented elf with an active ComposeWorks aspiration will not compose -- they fall through to basic survival behaviors (gathering, wandering). The aspiration remains active but cannot make progress until the elf's satisfaction recovers.
Source: crates/er-sim/src/sim/systems/behavior.rs, task_decision_system -- Discontented short-circuit.
Related Systems
- Aesthetic Position -- the four axes (structure, tradition, emotion, social) determine which aspirations an elf is drawn toward.
- Relationships -- MakeFriends tracks the friend count (relationships with strength >= 50).
- Compositions -- ComposeWorks tracks completed compositions in the elf's portfolio.
- Revels -- PerformAtRevels and EarnLove track revel participation and audience reactions.
- Skills -- MasterSkill tracks skill level progression.
- Prestige & Reputation -- completing aspirations contributes to an elf's visible accomplishments, though prestige is tracked separately.
- Needs & Mood -- completion and stall events push mood modifiers that ripple into morale and satisfaction.
Tips
- Watch the aesthetic axes. An elf with high social (near 1.0) will almost always pick MakeFriends first (weight up to 3.0), crowding out other goals. If you want more composing, use the Curator to assign the Composer role -- that bypasses aspiration priority.
- Stalls are diagnostic. A stall event means an elf has been stuck for 500 ticks. Common causes: no Workshop for compose-aspiring elves, no nearby elves for social aspirations, or a skill ceiling that requires more practice time. Build the infrastructure the elf needs.
- Completion chains are self-reinforcing. The +8 mood boost from fulfilling an aspiration is strong (comparable to a revel performance bonus). Happy elves work faster, which accelerates the next aspiration. A single completion can start a virtuous cycle.
- Discontented elves lose all momentum. Since discontented elves refuse aspiration work, their progress stalls. This can trigger the -2 stall penalty on top of existing satisfaction problems, creating a downward spiral. Address discontent early.
- PerformAtRevels and EarnLove need revels. These aspirations cannot progress without active revel scheduling. If no revels are happening, elves with these goals will stall. Make sure the Curator (or you through policies) keeps revels on the calendar.
- Two slots, five types. Since each elf holds at most 2 aspirations and duplicates are blocked, the system naturally diversifies. An elf will never double up on MakeFriends -- the second slot will always be a different goal type.