Time
Dialogue on its own doesn’t need a clock. A story starts to need one when the fiction has a when: shops that shut at dusk, an informant who leaves at midnight, a case that closes on day three whether it’s solved or not. Time also gives choices weight. If asking around the market costs an hour, the player is spending something real, and a day becomes a budget to plan against.
For those projects the runtime keeps a world clock: an in-fiction minute count it advances as the player acts. The clock is off by default. Turn it on from Project → Time in the Data View, which opens the Time-of-day panel; a project with no time pressure can ignore this page entirely.
How the clock works
The clock is one number: minutes elapsed since the story began. The Start time set in Project → Time anchors that count to a clock face, so with a Start time of 09:00, ninety-five elapsed minutes reads as 10:35. When the count passes midnight, the clock face wraps and the day number goes up. Days are numbered from 1, and the day increments at midnight, not when the player sleeps or a scene ends.
Two rules carry most of the concept.
The clock never ticks on its own. It isn’t real time; the player can stare at a choice for ten real minutes and no fictional minute passes. The clock moves only when an authored event or a built-in cost moves it, which means pacing always stays in the writer’s hands.
The clock never moves backward. No event subtracts minutes, and jumping to a time-of-day that has already passed today lands on tomorrow’s occurrence instead. Flashbacks are a scene concern, not a clock concern.
Time buckets
Raw minute counts are awkward to write against, so the clock also
carries time buckets: named stretches of the day, defined in Project →
Time. Each bucket has an ID (morning, night) and a From and
To clock time. Enabling time seeds four (morning, afternoon,
evening, night); rename, retime, or replace them freely, since nothing
about that starter set is special.
A bucket includes its From time and excludes its To time, so back-to-back buckets meet without overlapping. A bucket can cross midnight: 21:00 to 06:00 covers the whole night. Buckets don’t have to cover the full day either; at a time no bucket claims, CurrentTimeBucket returns an empty string.
Time buckets are the natural unit for gating content. A node visible
only while CurrentTimeBucket() == 'night' needs no minute arithmetic,
and a Set Time Bucket
event can jump the story to the next named period without counting the
minutes in between.
Moving the clock
Everything that moves the clock is one of five things: two authored events, or three automatic costs.
The authored events are Advance Time, which pushes the clock forward by a fixed number of minutes, and Set Time Bucket, which jumps it forward to the start of a named time bucket. Both fire from an event list like any other event, so deliberate time passage sits exactly where the story beat happens.
The automatic costs are charges the runtime applies on its own when the player acts, without an authored event in the way: traveling between locations, starting an encounter, and picking a choice that carries a cost. All three work the same way. A field on the entity sets how many minutes the action costs; the runtime advances the clock by that amount as part of the action itself, before anything downstream of it runs.
Travel costs
Every Location connection can set a Travel time (min). When the player travels the connection through the World panel’s Go to affordance, the runtime advances the clock by that many minutes before the player arrives at the destination. Leave a connection’s Travel time blank and it falls back to the project’s Default travel minutes (Project Settings, under Defaults); leave both blank and the connection costs nothing to cross.
This only applies to the player-driven Go to path. An authored Move to event relocates the player for free, no matter what a connection’s Travel time is set to. That split is deliberate: Move to is used inside scripted sequences where an author already accounts for pacing directly, while Go to is the player choosing to walk somewhere on their own, which is where a travel budget matters.
Encounter costs
A Scene staged as an encounter (its Trigger kind is set to something other than (none)) can set an Encounter time cost (min). When the player starts that encounter, the runtime advances the clock by that many minutes between popping any non-modal scene the encounter interrupts and firing the encounter scene’s own Intro. The cost lands once, at the start of the encounter; it has no effect on scenes entered through a Start Scene event instead of an encounter trigger. Node-triggered encounters (where a Node carries the trigger rather than the Scene) do not charge the scene’s Encounter time cost; the trigger node’s own Time cost applies instead, through the selection charge described below.
Selection costs
A Node can set a Time cost (min). When the player selects that node as a choice, the runtime charges the cost immediately before the node’s events run. Only a deliberate pick pays: jump targets, scene intros, outros, update nodes, and On exhausted nodes execute for free even if they carry a value. The simulator shows the cost as a suffix on the choice button, so the player sees what a pick costs before committing.
The project default
Default travel minutes lives in Project Settings, under Defaults. It’s the one project-wide fallback in this system: connections that leave their own Travel time blank use it instead. Encounter and selection costs have no equivalent; each encounter scene and each node sets its own cost or stays free.
Reading the clock
Expressions read the clock through the Time
functions. The clock
face comes from CurrentHour() and CurrentMinute(), the day number
from Day(), and the current time bucket from CurrentTimeBucket(). For
gating, the comparison helpers take a clock time as text:
IsTimeBefore('22:00'), IsTimeAfter('06:00'), or
IsTimeBetween('09:00', '17:00') for business hours.
MinutesUntil() measures the distance to a deadline. The informant who
leaves at midnight can put an escalating warning on a node with
MinutesUntil('00:00') < FromHours(2), and the duration helpers
(FromHours(), FromDays(), and friends) keep those thresholds
readable. The full set, including duration arithmetic, is in the
Time section of the function
reference.
When time is disabled
All of the above is inert while the project’s world clock is off. A Travel time, a Default travel minutes, an Encounter time cost, or a node Time cost can still be set on a project with time disabled; the value is simply never charged, since there’s no clock to advance. Because a cost that silently never applies is usually an authoring mistake, the validator warns on any of these fields being set while time is off. Clear the field or turn time on to resolve the warning.
See also
- Advance Time: the authored event for pushing the clock forward by a fixed amount.
- Set Time Bucket: jump the clock forward to a named time bucket’s start.
- Node: the Time cost field that selection costs read.
- World layer: the spatial axis that Travel time and Move to operate on.
- Location: the Connections section where Travel time lives.
- Scene: the Encounter fields where Encounter time cost lives.
- Project Settings: Default travel minutes, under Defaults.
- Error messages: Time-of-day feature is disabled: the panel message for events that reference time-of-day while the clock is off.