Mood and Atmosphere

Series: raising-an-island · Part 3

Mood is not a theme. It is not a description you write once and post to a wiki. It is a disposition the island is in right now, that inflects every room description, every transition text, every system narration — and that can change.

Two visits to the same inn are not the same visit. The fire is described differently at midnight in a storm than at noon on a calm day. The same room, the same base description, read through a different light. Mood is that light.


How mood inflects the world

When the narrator generates or refreshes a room description, it reads four signals: the base description written by the builder, the current mood, the current time of day, and the current season. It holds all four and produces prose that is true to the base text but colored by the rest.

Take the Common Room at Winding Stair:

A low-beamed room warmed by a generous fire. Rain hammers the shutters. Lamps burn low. The bar runs the far wall.

Under calm, at evening:

A low-beamed room warmed by a generous fire. Rain hammers
the shutters — steady, unhurried. The lamps are adequate.
The bar runs the far wall, well-stocked and attended.

Under grim, same room, same hour:

A low-beamed room where a fire burns without quite warming
it. Rain drives at the shutters. The lamps hold on. The
bar runs the far wall. No one has restocked the far end.

Under festive:

A low-beamed room lit up past its usual self — extra lamps,
the fire built higher than the weather demands. Rain hammers
the shutters but nobody in here is listening to it. The bar
is doing business.

The builder wrote one description. The narrator wrote three readings of it. The underlying facts are the same; the mood is not.


What mood affects

Room descriptions. The primary effect. Every narrative element — light levels, temperature, the quality of sounds, the behavior of fire, the weight of silence — shifts with mood. Mood does not add invented details; it recolors the ones already there.

Transition text. The sentences players see when they move between rooms. Under tense, walking north feels quicker, more purposeful. Under fog, the crossing feels uncertain even for a familiar route.

System narration. Arrival and departure messages, NPC ambient behavior descriptions, the text on look when nothing is in the room. All inflected.

Federation presentation. The fog mood makes cross-realm signals arrive with more interference — events feel distant, foreign speech harder to make out. storm delays them further. This is not a bug to diagnose; it is honest representation of the network state.

The indicator. Under fog or storm, federation link indicators in room headers appear dimmer, more uncertain — even if the underlying connections are healthy.


Setting mood

At runtime from admin mode:

watch> set mood grim

Mood set: grim. Propagating to active sessions.

The change propagates immediately. Players in rooms see the shift on their next look or room entry. Ongoing actions (NPCs mid-speech, transitions in progress) complete under the previous mood.

In realm.toml, for the startup default:

[realm]
mood = "grim"

Mood does not persist across restarts by itself — it reads from the config on boot. If you change mood at runtime and want it to survive a restart, update the config file.


Mood values

ValueCharacter
calmClear or steady weather, neutral narration, nothing ominous. The baseline.
uneasySomething unresolved. Fog at edges. NPCs slightly guarded.
tenseA storm building. Conversations feel shorter. Arrivals more scrutinised.
grimSettled difficulty. The weather has been this way long enough that people have stopped remarking on it.
festiveLight, warmth, noise past the usual level. Rare; use it for events and occasions.
fogVisibility genuinely reduced. Cross-realm signals arrive attenuated and uncertain.
stormActive weather. Arrivals delayed. Transition text more physical. Everything a degree harder.

Mood is not a progression. There is no “normal to dire” scale. uneasy is not a step toward grim; it is a different quality of atmosphere. An island can go from calm directly to festive or from grim to fog. Set whatever the island is experiencing right now.


Building for mood

The narrator inflects by default. Most builders never write mood variants — they write one description, and the system reads it through the current mood.

When you want precise control, pin a variant:

chart> describe common-room mood:grim
  (Enter description. End with a blank line.)
  A low-beamed room where the fire doesn't quite do its job.
  Rain has found a gap somewhere in the shutters — a small
  persistent drip onto stone. The bar is open but the barkeep
  isn't talking much.

  Description set for room:your-realm/common-room (mood: grim).

Pinned variants take precedence over narrator inflection for that mood. Leave a mood unset and the narrator handles it. Pin it when the room has something specific to say about that condition.

You can inspect what variants are pinned:

chart> list variants common-room

common-room:
  (default)   — set by builder
  mood:grim   — set by builder
  time:night  — narrator-generated, not pinned
  season:winter — narrator-generated, not pinned

Narrator-generated variants are recalculated when the base description changes. Pinned variants are not — if you rewrite the base description, check whether your pinned variants are still coherent with it.


Time of day

The in-world clock tracks real time by default. The room header shows it:

winding-stair · 22:14 · ◈ 2/3

The narrator uses four time registers:

RegisterApproximate hours
dawn04:00 – 07:00
day07:00 – 18:00
dusk18:00 – 21:00
night21:00 – 04:00

A common room at night is described differently from the same room at day — the fire is the light source instead of the windows, the occupants are different, the atmosphere shifts.

Adjust the in-world clock rate if your island’s fiction calls for it:

[realm]
clock_rate = 2.0    # in-world time runs twice as fast as real time
clock_offset = -2   # shift in-world time by -2 hours relative to UTC

At clock_rate = 1.0 (default), in-world time matches UTC. At 2.0, an in-world day is twelve real hours. Most islands run at the default; an island with a strong day/night narrative may want to accelerate the cycle.

Force the time of day for testing:

watch> set time 03:00

In-world time set to 03:00. Persists until next reload.

This does not affect the real-time clock — at the next reload, the clock re-synchronizes with real time unless you have set a fixed time in realm.toml.


Season

Four seasons advance on a configurable cycle. The default cycle is one real year — spring, summer, autumn, winter, each lasting approximately three months. Most islands track this without intervention.

Current season:

watch> season

Season: autumn  (day 23 of 91)
Next: winter in 68 days

Set a season cycle rate:

[realm]
season_rate = 4.0    # seasons advance four times faster than real time

At season_rate = 4.0, each season lasts about three real weeks. Useful if your island wants seasonal events on a human-visible timescale.

Set the season manually:

watch> set season winter

Season set: winter.

Manual season setting persists until you change it again or until a reload if season_rate is set — at reload, the automatic cycle resumes unless you also fix the season in realm.toml:

[realm]
season = "winter"    # fixed; does not advance

A fixed season is appropriate for islands with a deliberately permanent atmosphere — an island that is always winter, always the aftermath of something.


Mood in NPC behaviour

NPC behaviour rules can read the current mood and adjust their responses:

- when: mood == "grim" and signal.name == "enter"
  then: say "Another one. Come in then."

- when: mood == "festive" and signal.name == "enter"
  then: say "Come in, come in. You picked a good night."

Harbormaster lines in realm.toml can be annotated by mood:

[realm.harbormaster]
lines = [
  "Evening. Road's washed out tonight. You'll stay.",
  "Your cargo's your own, long as it stays sheathed.",
]

[realm.harbormaster.mood_lines]
grim    = ["The road north is closed. Don't ask about it."]
festive = ["Come in. We've been expecting more tonight."]
fog     = ["Careful crossing. The strait's not visible from here."]

Mood lines supplement the general pool — they are added to the rotation when the island is in that mood, not substituted for the whole pool. An NPC on a grim island draws from both its general lines and its grim lines.


Narrator register and mood

The [realm.narrator] register interacts with mood. sparse with grim produces very short, bleak descriptions. formal with festive elevates the occasion into something ceremonial. The combinations are not all natural — formal with storm risks sounding absurd — but the system will not prevent them. Pick the register that suits the island’s character, then let mood move within that.

An island that is always formal and always grim is telling you something about itself. That consistency is part of what makes it a place.