Skip to content

Living World Overview

The Living World is Softfire’s persistent world simulation. It runs server-side on Strand infrastructure, advancing on world-time ticks even when no players are connected. Your game receives world state — it does not compute it.

The eight subsystems

SubsystemRole
The PulseWorld tick engine — advances world time, partitions zones, drives dormant/active mode
The WildEcosystem simulation — species populations, predator-prey dynamics, territory, migration
The FlowResource cycles — node depletion, regeneration, scarcity events
The VeilClimate and weather — biome conditions, weather states, storm propagation
The AgeCivilisations and factions — settlement growth, faction traits, diplomacy, war
The EchoPlayer-action feedback — the only path from client to simulation
The ChronicleWorld history — records significant events, powers lore generation
The SignalWorld-state distribution — delivers snapshots and delta frames to clients

How the simulation works

The Pulse drives a continuous world-time clock. On each tick, the other subsystems advance in sequence: The Wild updates populations, The Flow adjusts resource levels based on Wild consumption and Veil conditions, The Veil propagates weather, The Age processes faction logic. Events generated by these updates are recorded by The Chronicle. The Signal packages changed state into delta frames and delivers them to connected clients.

Players interact with the simulation exclusively via The Echo. When a player hunts a creature, builds a structure, or mines a resource node, The Echo records a typed event (Hunt, Build, Mine) and submits it to the Root. The Root validates and rate-limits Echo events, then applies their effects to the simulation on the next tick. This ensures the simulation is not gameable by high-frequency client submissions.

What your game receives

Your game never computes world state — it queries it. The IWorldStateQuery interface gives synchronous access to the current cached state:

var world = Services.Get<IWorldStateQuery>();
// What's the weather like in this zone?
WeatherState weather = world.GetWeather(zoneId);
// How many wolves are there in this zone?
PopulationSnapshot wolves = world.GetPopulation(zoneId, speciesId: "wolf");
// What resources are available?
ResourceLevelSnapshot berries = world.GetResourceLevel(zoneId, resourceId: "berries");

The cache is updated by The Signal as delta frames arrive. If the client is offline, queries return the last received values.

Why it matters for your game

The Living World is not just a feature — it is a source of content. Connecting your game to the Living World means:

  • A survival game’s resource availability fluctuates with Wild consumption and Veil drought cycles, without any developer-written logic
  • An RPG’s NPC dialogue can reference the current diplomatic stance between factions or the recent founding of a nearby settlement
  • A city builder’s crop yields respond to multi-week weather patterns in the Veil
  • A racing game’s weather changes between sessions based on the Veil’s current storm cycle in the track’s zone

The simulation runs continuously. Every time a player returns to your game, the world has changed.

Use cases by genre

Survival — The Flow drives resource availability. The Wild creates competition with NPC fauna for the same resources. The Veil creates seasonal scarcity patterns. Players who return after a week find the world genuinely different.

RPG — The Age drives which faction controls each zone and what political events have occurred. NPC dialogue trees can branch on DiplomaticRelationsService.GetStance(factionA, factionB). The Chronicle provides lore content without writing it manually.

City builder / strategy — The Veil’s precipitation and temperature affect crop yields, flood risk, and migration patterns. The Age’s faction system creates neighbours that grow or shrink based on collective player activity.

Racing / sports — The Veil provides track-condition weather that changes session to session. A race in a mountain zone can be dry in summer and icy in winter.