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:

GoalTracked StatTarget FormulaMax Target
MasterSkillSkill level (currently Music only)current_level + 210
MakeFriendsCount of Friends (strength >= 50)current_friends + 26
ComposeWorksNumber of completed compositionscurrent_compositions + 320
PerformAtRevelsRevel performances attendedcurrent_performances + 320
EarnLove"Love" audience reactions received at revelscurrent_love_reactions + 210

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:

GoalBase WeightAesthetic BonusWeight Formula
MasterSkill (Music)1.0Emotion axis1.0 + emotion
MakeFriends1.0Social axis (x2)1.0 + social * 2.0
ComposeWorks1.0Structure axis1.0 + structure
PerformAtRevels0.8Social axis0.8 + social
EarnLove0.8Emotion 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:

  1. The aspiration status changes from Active to Completed.
  2. A CulturalEvent::AspirationCompleted event fires (priority: Notable).
  3. The elf receives a mood modifier: "Fulfilled an aspiration!", value +8, duration 200 ticks.
  4. 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:

  1. A CulturalEvent::AspirationStalled event fires (priority: Notable).
  2. The elf receives a mood modifier: "Aspiration stalled", value -2, duration 100 ticks.
  3. The stall timer resets (last_progress_tick updated 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

ConstantValueDescription
Assignment interval50 ticksHow often new aspirations are assigned
Progress check interval10 ticksHow often progress is re-evaluated
Stall threshold500 ticksNo-progress duration before stall fires
Completion mood duration200 ticksHow long the +8 celebration mood lasts
Stall mood duration100 ticksHow long the -2 stall penalty lasts

Mood Effects

EventMood ValueDurationMethod
Aspiration fulfilled+8200 tickspush (stacks with other modifiers)
Aspiration stalled-2100 ticksreplace (refreshes if already present)

Weight Summary

GoalAxisMin WeightMax WeightPersonality That Favors It
MasterSkillEmotion1.02.0Emotional elves (emotion near 1.0)
MakeFriendsSocial1.03.0Social elves (social near 1.0)
ComposeWorksStructure1.02.0Structured elves (structure near 1.0)
PerformAtRevelsSocial0.81.8Social elves (social near 1.0)
EarnLoveEmotion0.82.3Emotional 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_compose flag activates. If a Workshop is available, the elf walks there and composes instead of waiting for a role assignment.
  • MakeFriends: the elf's wants_socialize flag 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.

  • 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.