Seasons & Weather
The climate system drives a 100-day year divided into four 25-day seasons. Weather and temperature shift each day, affecting mood, foraging efficiency, and the forest spirit.
Overview
Time in Elf Revel is measured in ticks. One in-game day is 100 ticks. A full year is 100 days (10,000 ticks), split evenly into four seasons of 25 days each. At each day boundary, the climate system advances the season (if needed), rolls for new weather, and computes a daily base temperature with jitter.
Temperature updates every tick based on time of day. Weather persists with 70% momentum -- there is only a 30% chance it changes on any given day within the same season, while season boundaries always force a reroll.
How It Works
The Year Cycle
| Season | Days | Day Range (in year) | Description |
|---|---|---|---|
| Spring | 0--24 | 0--24 | Awakening. Balanced foraging. Spirit is sensitive. |
| Summer | 25--49 | 25--49 | Peak abundance. Highest foraging multiplier. |
| Autumn | 50--74 | 50--74 | Declining bounty. Snow begins to appear. |
| Winter | 75--99 | 75--99 | Harsh. Reduced foraging. Snow is common. Spirit dormant. |
Years wrap: day 100 is Spring of year 1, day 200 is Spring of year 2, and so on.
Source: src/sim/climate.rs, SEASON_LENGTH = 25, YEAR_LENGTH = 100, Season::from_day.
Time of Day
Each 100-tick day is divided into four periods:
| Period | Tick Range (within day) | Temperature Modifier |
|---|---|---|
| Dawn | 0--9 | -5 |
| Day | 10--69 | +0 (base) |
| Dusk | 70--84 | -3 |
| Night | 85--99 | -8 |
The temperature modifier is applied to the daily base temperature each tick. Dawn and Night are the coldest periods.
Source: src/sim/world.rs, TimeOfDay::from_tick. src/sim/climate.rs, Climate::update_temperature.
Temperature Curve
Each season defines a quadratic temperature curve with three control points: start, mid-extreme, and end. The temperature is interpolated across the 25 days of the season using quadratic interpolation, then jittered by a random value in the range +/-5.
| Season | Start Temp | Mid-Extreme | End Temp |
|---|---|---|---|
| Spring | 35 | 45 | 55 |
| Summer | 55 | 75 | 65 |
| Autumn | 65 | 45 | 30 |
| Winter | 30 | 15 | 25 |
The interpolation formula uses quadratic Bezier-style weighting:
base = start x (1-t)(1-2t) + mid x 4t(1-t) + end x t(2t-1)
Where t = day_in_season / 24 (0.0 to 1.0).
After interpolation, jitter of +/-5 is applied, and the result is clamped to 0--100. Temperature can never go below 0 or above 100.
Source: src/sim/climate.rs, Season::temperature_curve and Climate::advance_day.
Temperature Thresholds
| Condition | Threshold | Effect |
|---|---|---|
| Cold | Temperature < 25 | Outdoor mood penalty: "Chilled" -2 |
| Hot | Temperature > 75 | Universal mood penalty: "Sweltering" -1 |
Cold only affects elves outdoors (not within Manhattan distance 2 of a roofed building). Hot affects everyone.
Source: crates/er-sim/src/sim/climate.rs, is_cold() and is_hot(). crates/er-sim/src/sim/systems/mood.rs, weather_mood_system.
Weather System
Weather is determined daily. On a season boundary, weather is always rerolled. Within a season, there is a 30% chance of reroll and a 70% chance the previous weather persists (momentum).
Source: src/sim/climate.rs, Climate::advance_day -- rng.gen::<f32>() < 0.3 triggers reroll.
Weather Types
| Weather | Description | Possible Seasons |
|---|---|---|
| Clear | Sunny skies. No special effects. | All |
| Cloudy | Overcast. No direct effects. | All |
| Rain | Outdoor mood penalty. | All |
| Storm | Flavor event (neutral mood). | All |
| Snow | Outdoor beauty bonus. | Autumn, Winter only |
| Fog | Inspiration boost for skilled musicians. | All |
Snow has zero weight in Spring and Summer -- it physically cannot occur in those seasons.
Source: src/sim/climate.rs, Weather::season_weights.
Values & Formulas
Season Weather Weights
Each weather type has a probability weight per season. To get the percentage chance, divide by the row total (100 in all cases).
| Weather | Spring | Summer | Autumn | Winter |
|---|---|---|---|---|
| Clear | 40 | 60 | 40 | 30 |
| Cloudy | 25 | 15 | 25 | 25 |
| Rain | 25 | 10 | 20 | 10 |
| Storm | 5 | 10 | 10 | 5 |
| Snow | 0 | 0 | 5 | 25 |
| Fog | 5 | 5 | 0 | 5 |
Notable patterns:
- Summer is 60% Clear -- the best season for outdoor work.
- Winter has a 25% Snow chance -- the highest of any weather type besides Clear.
- Fog only appears in Spring, Summer, and Winter (0% in Autumn).
- Storms are rare in Spring and Winter (5%), more common in Summer and Autumn (10%).
Source: src/sim/climate.rs, Weather::season_weights.
Seasonal Mood Modifiers
In addition to weather, each season applies a persistent mood modifier to all elves. These are refreshed at every day boundary using replace semantics.
| Season | Modifier | Value | Duration |
|---|---|---|---|
| Spring | "Spring optimism" | +2 | 1 day (100 ticks) |
| Summer | (none) | -- | -- |
| Autumn | "Autumn melancholy" | -1 | 1 day (100 ticks) |
| Winter | "Winter stillness" | -1 | 1 day (100 ticks) |
Spring is the most mood-positive season (+2 baseline), while Autumn and Winter carry a persistent -1 drag on morale. Summer is neutral -- no seasonal modifier, but typically benefits from 60% Clear weather.
Source: crates/er-sim/src/sim/systems/mood.rs, seasonal_mood_system.
Weather Mood Effects
These are applied by the weather mood system. "Outdoors" means the elf is more than Manhattan distance 2 from any Dwelling, Workshop, or Feast Hall.
| Weather/Condition | Target | Mood Value | Duration | Notes |
|---|---|---|---|---|
| Rain (outdoors) | Outdoor elves | -1 "Caught in rain" | 50 ticks | Shelter negates |
| Snow (outdoors) | Outdoor elves | +2 "Snow-covered landscape" | 50 ticks | Beauty bonus |
| Storm | All elves | 0 "Sheltering from storm" | 50 ticks | Flavor only |
| Fog | Musicians (skill > 5) | +1 "Mysterious fog" | 50 ticks | Also +1 Nature inspiration |
| Cold (temp < 25, outdoors) | Outdoor elves | -2 "Chilled" | 50 ticks | Shelter negates |
| Hot (temp > 75) | All elves | -1 "Sweltering" | 50 ticks | Cannot be avoided |
Mood effects use replace semantics -- they refresh the duration instead of stacking. An elf standing in rain for 100 ticks gets one -1 modifier refreshed repeatedly, not multiple stacking penalties.
Source: crates/er-sim/src/sim/systems/mood.rs, weather_mood_system -- uses mood.replace().
Foraging Multipliers
The seasonal foraging multiplier affects passive sustenance gain when elves forage:
| Season | Multiplier | Effective Foraging |
|---|---|---|
| Spring | 1.0x | Baseline |
| Summer | 1.5x | Peak abundance |
| Autumn | 1.25x | Slight bonus |
| Winter | 0.5x | Halved |
Foraging happens every 10 ticks for elves with sustenance below 40 on walkable, non-stone terrain. The base gain is 5, multiplied by the seasonal factor and rounded (minimum 1). This means Winter foraging yields only 3 sustenance per forage event, while Summer yields 8.
| Season | Base | Multiplied | Rounded Yield |
|---|---|---|---|
| Spring | 5 | 5.0 | 5 |
| Summer | 5 | 7.5 | 8 |
| Autumn | 5 | 6.25 | 6 |
| Winter | 5 | 2.5 | 3 |
Sustenance is capped at 60 from foraging alone.
Source: crates/er-sim/src/sim/climate.rs, Climate::season_foraging_multiplier. crates/er-sim/src/sim/systems/gathering.rs, foraging_system.
Hydrology
Weather directly drives the water system. See Hydrology for full details.
| Weather | Water Effect |
|---|---|
| Rain | Adds water to all outdoor tiles (orographic: more at high elevation) |
| Storm | Heavy water addition (storm_amount = 8 vs rain_amount = 3) |
| Snow | Adds water at half rain rate; accumulates on frozen surfaces |
| Clear/Cloudy/Fog | No precipitation |
Temperature drives freeze/thaw:
| Temperature | Water Effect |
|---|---|
| Below 20 | Shallow water freezes (15 ice/day); deep water freezes slowly (3 ice/day) |
| 20--30 | Hysteresis band -- no change |
| Above 30 | Ice melts at 10/day; frozen tiles thaw |
Summer adds +2 to evaporation rate, drying up shallow pools faster.
Seasonal Anchor Events
Each season has a named cultural anchor event -- a window of opportunity for the colony to celebrate. If the colony holds a revel during the window, the season's cultural identity is honored. If not, the colony feels the absence.
| Season | Anchor Event | Window |
|---|---|---|
| Spring | Awakening Revel | Day 10--14 |
| Summer | Radiance Festival | Day 10--14 |
| Autumn | Harvest Gathering | Day 10--14 |
| Winter | Stillness Vigil | Day 10--14 |
The anchor window lasts 5 days, centered on the season's midpoint. During this window, the curator's SettlementState includes the anchor name as a scheduling hint. Any revel held during the window (including a Standard revel) satisfies the anchor.
Missed anchor penalty: If the window closes (day 15) without a revel, every elf receives "Missed [Anchor Name]" (-2 mood, 150 ticks). This is a colony-wide narrative beat -- the community didn't gather when the season called for it. The penalty is mild but visible, and it stacks with other seasonal mood modifiers.
The anchor watchdog resets at the start of each season (day 0).
Source: crates/er-sim/src/sim/climate.rs, SeasonalAnchor; crates/er-sim/src/sim/systems/mood.rs, seasonal_anchor_watchdog_system.
Seasonal Mood Modifiers
Beyond weather-driven mood effects, each season carries its own ambient emotional texture. These modifiers are applied at day boundary using replace semantics (refreshed daily, never stacking with themselves).
Ambient Modifiers
| Season | Modifier | Value | Duration |
|---|---|---|---|
| Spring | Spring Awakening | +2 | 100 ticks (1 day) |
| Summer | Summer Vigor | +1 | 100 ticks (1 day) |
| Autumn | Autumn Melancholy | -1 | 100 ticks (1 day) |
| Winter | Winter Reflection | 0 | 100 ticks (1 day) |
Winter Reflection is zero mood -- present in the stack for display but not a penalty. The contemplative season doesn't punish; it provides context.
Transition Modifiers
| Modifier | Value | Duration | Trigger |
|---|---|---|---|
| First [Season] | +3 | 50 ticks | First day of each new season (day 0) |
| Season's End | -1 | 30 ticks | Last 3 days of each season (day 22--24) |
"First Spring" fires on the year's first day -- the freshest start energy. "Season's End" is the waning melancholy as one season gives way to the next.
Source: crates/er-sim/src/sim/systems/mood.rs, seasonal_mood_system.
Interactions
Forest Spirit
The Forest Spirit responds differently to clearing based on season. Clearing forest in Spring adds +7 anger (vs. +5 in other seasons) because the forest is awakening. The spirit's natural dawn decay and garden calming also vary by season -- see the Forest Spirit page for details.
Composition and Inspiration
Fog weather adds +1 to the Nature inspiration channel for all elves, which can help trigger compositions. Snow gives a beauty mood bonus that feeds into morale, indirectly improving composition emotional depth.
Needs Decay
Weather does not directly change needs decay rates, but the mood modifiers it produces affect morale, which determines the morale state (Inspired/Normal/Stressed/Breaking). See Needs & Mood. Morale state in turn affects work speed: Inspired elves get +2 work speed, Stressed elves get -1.
Building Shelter
Roofed buildings (Dwelling, Workshop, Feast Hall) provide shelter within Manhattan distance 2. Gardens do not provide shelter -- they are open-air structures. In rainy or cold weather, having roofed buildings near work areas protects your elves from mood penalties.
Tips
-
Stockpile food before Winter. Foraging drops to 0.5x, and Snow weather (25% chance) adds further pressure. Aim for a food stockpile of 15+ by day 50 (mid-Autumn).
-
Summer is build season. With 60% Clear weather and 1.5x foraging, your elves can work outdoors without mood penalties and food accumulates naturally. Queue major construction projects for Summer.
-
Build roofed structures early. A single Dwelling shelters all elves within 2 tiles from rain (-1 mood) and cold (-2 mood). Place it centrally.
-
Fog is a gift for musicians. If you have a high-skill composer (Music > 5), fog gives them +1 mood and +1 Nature inspiration. Don't pull them indoors during fog.
-
Snow is surprisingly pleasant. The +2 beauty mood bonus outweighs any cold penalty for elves near shelter. Let your elves enjoy it, but make sure they have a warm building nearby.
-
Watch season transitions. Weather always rerolls at a season boundary. The jump from Autumn to Winter can bring sudden Snow (25% weight) and cold temperatures. Prepare your settlement layout accordingly.
-
Spring clearing is dangerous. Clearing forest in Spring costs +7 spirit anger instead of +5. If you need to expand, wait until Summer when the spirit is less reactive.
-
Night is the coldest period. At -8 from base temperature, Night in Winter can push temperatures down to single digits. Ensure resting elves are near Dwellings.
-
Spring is the best season for morale. The +2 "Spring Awakening" modifier offsets rain penalties and helps recovering Discontented elves. The "First Spring" transition bonus (+3 for 50 ticks) adds an extra boost on the first day of the year. Time revel performances for Spring to maximize audience mood.
-
Autumn and Winter stack mood drags. "Autumn Melancholy" (-1) on top of cold weather (-2) and rain (-1) can push morale down quickly. Plan building shelter completion before Autumn arrives. But remember: Autumn Melancholy feeds the deepest art.
-
Don't miss anchor events. If no revel is held during the anchor window (days 10--14 of each season), every elf gets "Missed [Anchor Name]" (-2, 150 ticks). Even a Standard revel satisfies the watchdog. See Seasonal Anchor Events below.