The Nyxtale platformReference
Directives
Every @ directive: signature, arguments, bounds, safety marks.
Every directive the engine has — 99 across 16 categories. This page is generated from the DIRECTIVES registry at build time: the same registry the compiler, the validator and Studio's mechanics palette read. A new directive appears here on its own; there is nothing to update.
Text 16Nightfall Stories
@autoadvance [mode]
Auto-advance vs tap — the pace of reading
Switches reading between auto-advance and tap. Auto-advance takes the pace out of the reader's hands, so turn it on for a short stretch and turn it off explicitly.
modeenum, optionalon— by itself,off— by tap.on·off
Not working yetтемп чтения пока принадлежит читателю — история его не переключает
@autoadvance on
narrator: After that it all went on without him.
@autoadvance off
@font <face>
Change the typeface (serif/mono/sans)
Changes the typeface: serif (reading), monospace (a terminal, a document) or sans. It holds until the next change.
faceenumserif,monoorsans— the faces the app carries.serif·mono·sans
@font mono
narrator: REPORT No. 114. PAGE 2 IS MISSING.
@instant
Print the next line at once
The next line appears whole, without typing out.
No arguments.
The reader seesThe line arrives all at once.
@instant
narrator: RUN
@lineheight <scale>
Line rhythm (how the lines breathe)
Line spacing — the breath of a paragraph. It holds until the next change.
scalefloat- A multiplier, 0.5…3. Higher is airier.0.5…3
@lineheight 2
narrator: There was too much space between the lines.
@redact
Redaction: [DATA EXPUNGED]
Turns redaction on: the lines that follow come out struck through. @unredact takes it off. A redacted line says more than a written one — the reader can see that something was there.
No arguments.
The reader seesThe text is covered by a bar.
@classify keter
@redact
narrator: The subject was delivered at 03:40 accompanied by two staff members.
@unredact
narrator: The rest is not in the file.
@shout◐
A shout — large, hard text
The next line comes out large and hard.
No arguments.
@shout
mark: GET OUT OF THERE!
@stagger [per_word_ms]
Stagger: the words arrive one by one
The next line comes through one word at a time.
per_word_msint, optional- The gap between words, in milliseconds.0…∞
@stagger 300
narrator: Someone. Was standing. In the corridor.
@text_corrupt [amount]◐
Corrupted text — the letters distort
Corruption of the letters in a line — characters are substituted. The sign of a source that cannot be trusted.
amountfloat, optional- The share of corrupted characters, 0…1.0…1
@text_corrupt 0.3
narrator: He wrote the name, but it could no longer be read.
@text_erase
Self-erasing text
The line erases itself once it has been read.
No arguments.
The reader seesThe text disappears from the screen on its own.
@text_erase
narrator: Remember this. I will not show it twice.
@text_fade [dir]
A line fades in or out
The line fades in or fades away.
direnum, optionalinto appear,outto dissolve.in·out
@text_fade out
narrator: The voice died away before the sentence did.
@text_shake [amount]◐
Shaking text — an unsteady line
A tremor in the line itself — something said unsteadily.
amountfloat, optional- Amplitude, 0…1.0…1
@text_shake 0.5
mark: I d-didn't see anything.
@textsize <level>
Text size — level 1–6
Text size as a level from 1 to 6. It holds until the next change.
levelint- Level 1…6, where 1 is the smallest.1…6
@textsize 5
narrator: HE WAS STANDING RIGHT BEHIND HER.
@textspeed <cps>
Typing speed of the text
How fast the text types itself, in characters per second. It holds until the next change.
cpsint- Characters per second. Ordinary reading is 30…60, slow is 10.
@textspeed 12
narrator: He. Read. Every. Word.
@thought <who> <text> [tone]
A character's thought — a bubble beside them
What a character thinks and does not say. Written on its own line under the spoken one: @thought <who> "<thought>" — the thought MUST be quoted, or it ends at the first space. It comes out as a bubble beside the character rather than in the dialogue panel, and the side picks itself: character on the left, bubble on the right; on the right, bubble on the left; in the centre, above. A thought is text to be read, so it holds the frame like an ordinary line, and while it does the dialogue panel steps back into shadow so that one thing is read at a time: the line first, then the thought. Two thoughts in a row do not erase each other — the first hangs a moment longer and dissolves, the second takes its place below.
whostring- The same id that stands in
@sprite, unquoted. If the character is not on stage, the bubble comes out centred. textstring- The thought itself, quoted — whole, with its spaces and punctuation.
toneenum, optional- The bubble's mood:
dusk(default, dim),dark(near black),light(pale, dark on light),blood,ember(warm, like a candle),cold(cold grey). The colours come from the story's theme palette, so every story's tone is its own.dusk·dark·light·blood·ember·cold
The reader seesAn oval bubble with the thought floats up beside the character, over a dark haze.
@sprite elena left
elena: Everything is fine.
@thought elena "He is lying."
@thought elena "He always has." blood
@unredact
Lift the redaction — reveal the hidden text
Lifts the redaction @redact turned on. With no @redact before it, it does nothing — there is nothing to lift.
No arguments.
@redact
narrator: Operator's name: [expunged]
@unredact
narrator: The rest of the page is blank.
@whisper
A whisper — small, dim text
The next line comes out small and dim.
No arguments.
@whisper
narrator: he is still here
Timing 5Nightfall Stories
@cut
A hard cut (flash cut)
A hard cut, mid-sentence if you like. A montage move: a break in the middle of a word reads as a change of frame, not as a mistake.
No arguments.
The reader seesThe frame changes instantly.
narrator: He only had time to say "do not open it"
@cut
@bg kitchen_day
narrator: In the morning nobody remembered it.
@delay <seconds>
Hold back the next element
Delays the next element without stopping the scene as a whole.
secondsfloat- The delay, in seconds.0…∞
@delay 1.5
narrator: And only then did the footsteps become audible.
@hold_black [seconds]
Fade to black and hold
The frame goes to black and stays. A border between scenes, or a beat landed on a pause.
secondsfloat, optional- How long to hold the black.
The reader seesThe screen goes black for the given time.
@hold_black 3
narrator: When the light came back the chair stood differently.
@pause <seconds>
Pause / hold
A pause before the next line. Ahead of a line it works harder than any emphasis: the reader has time to look up.
secondsfloat- How long, in seconds.
narrator: He called her by name.
@pause 2
narrator: Nobody answered.
@slowmo◐
Slow the moment down
Stretches what is happening. Once per episode; after that it reads as lag.
No arguments.
The reader seesEverything slows down.
@slowmo
narrator: The glass took a whole life to reach the floor.
Audio 7Nightfall Stories
@ambient <audio> [loop] [volume] [@fade_in <fade_in>] [@fade_out <fade_out>]
Background ambience
A background sound. With loop it runs in a loop until @silence or another @ambient takes it away.
audioasset- A sound id — from the base library or from the story's own assets.
loopenum, optional- The word
loop, when the sound should run in a loop.loop volumeint, optional- Volume 0…100. Without it, the default volume.0…100
@fade_infloat, named- Seconds the bed takes to rise out of silence. 0 = at once.0…30
@fade_outfloat, named- Seconds THIS bed takes to leave, when another
@ambientreplaces it or@silenceclears it.0…30
The reader seesThe sound runs underneath.
@ambient wind_howl loop 60 @fade_in 2 @fade_out 3
narrator: The wind had not let up since the evening.
@audio_defaults [@fade_in <fade_in>] [@fade_out <fade_out>] [@ambient_volume <ambient_volume>] [@sound_volume <sound_volume>]
Story-wide sound defaults: fades and volume
The defaults everything after this line inherits: fade lengths and volume. Written once at the top so @fade_in need not be repeated on every cue; a scene may declare its own — a hard-cut chapter after a soft one. A key on the cue itself always wins.
@fade_infloat, named- Default seconds for
@ambientand@soundto rise.0…30 @fade_outfloat, named- Default seconds for a bed to leave and for
@silenceto fade.0…30 @ambient_volumeint, named- Volume 0…100 for an
@ambientwith none of its own.0…100 @sound_volumeint, named- Volume 0…100 for a
@soundwith none of its own.0…100
The reader seesnothing — a silent marker that shows up later.
@audio_defaults @fade_in 1.5 @fade_out 2 @ambient_volume 70
@ambient wind_howl loop
narrator: The wind had not let up since the evening.
@dissonance [amount]◐
Rising dissonance (↔ sanity)
A rising dissonant drone on its own layer, synthesised as well. It is usually tied to the sanity meter: the lower the meter, the higher the value.
amountfloat, optional- Strength, 0…1.0…1
The reader seesA drone comes up under the scene, harsher the higher the value.
@set sanity = 0
@dissonance 0.7
narrator: The sound came as if out of the walls.
@heartbeat [bpm]◐
Heartbeat (tempo ↔ tension)
A heartbeat on its own layer. The engine synthesises it — no file to upload — and the tempo is how the tension is shown.
bpmint, optional- Beats per minute. Calm is around 60, panic is past 120.
The reader seesA heartbeat is heard at the given tempo.
@heartbeat 120
narrator: He could hear nothing but himself.
@pan <x>
Binaural pan — «something behind you»
Moves the sound left or right — «something behind you». It works in headphones.
xfloat- From −1 (left) to 1 (right), 0 being centred.-1…1
The reader seesThe sound moves to one ear.
@pan -0.8
@sound footstep
narrator: The step came from the left, though the left was a wall.
@silence [@fade_out <fade_out>]
Silence — clear every audio layer
Cuts every sound layer. The cut lands harder than a hit: the loop ran for ten minutes, the reader stopped noticing it, and now it is gone.
@fade_outfloat, named- Seconds everything takes to go quiet. 0 = cut on the spot.0…30
The reader seesThe sound disappears.
@ambient wind_howl loop
narrator: The wind had not let up since the evening.
@silence
narrator: And then it did.
@sound <audio> [volume] [@fade_in <fade_in>] [@fade_out <fade_out>]
One-shot sound / stinger
A single sound: a hit, a creak, a stinger. It plays once and ends.
audioasset- A sound id — from the base library or from the story's own assets.
volumeint, optional- Volume 0…100.0…100
@fade_infloat, named- Seconds the sound takes to swell in — an approaching train, not a hit. 0 = at once.0…30
@fade_outfloat, named- Seconds the sound takes to die away at its end. Applies when the sound's length is known and longer than that.0…30
The reader seesThe sound plays once.
@sound door_creak
narrator: The door opened by itself.
Visuals 20Nightfall Stories
@bg <image> [@alt <alt>]
Scene background
Sets the scene's background. It holds until another @bg replaces it, and survives lines, choices and jumps to labels; entering another scene clears the frame.
imageasset- An image id from the story's assets, not a file name.
@altstring, named- A description of the image for a screen reader. Without it the validator raises
NSX_ALT_TEXT_MISSING.
The reader seesThe background changes under the text.
@bg corridor_night @alt "A hospital corridor at night, every second lamp lit"
narrator: The light reached about three metres and stopped there.
@blink [times]◐
A blink — the eyes close and open
The eyes close and open: the frame meets from top and bottom and parts again. This is not a fade — it is the character's gaze. To hold the eyes shut, use @hold_black.
timesint, optional- How many blinks, 1…3. One by default.1…3
The reader seesThe frame closes like eyelids and opens again.
@blink
narrator: When I opened my eyes the chair stood closer.
@chromatic [amount] [@reduce_motion <reduce_motion>]⚡◐
Chromatic aberration
Chromatic aberration — the colour channels separate at the edges.
amountfloat, optional- How far they separate, 0…1.0…1
@reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in.
The reader seesOutlines double into colour. Photosensitive effect: on gentle settings it does not play at all, so the scene has to read without it.
@chromatic 0.4
narrator: His eyes would not hold focus.
@desaturate [amount]◐
Colour drains out of the frame
Drains the colour out of the frame. It holds until you take it off: @desaturate 0 brings the colour back.
amountfloat, optional- How much colour to remove, 0…1.0…1
The reader seesThe frame loses its colour.
@desaturate 0.8
narrator: Everything went the colour of wet concrete.
@flash [@reduce_motion <reduce_motion>]⚡
A revealing flash (lightning)
A short flash across the whole frame — lightning, headlights, a camera going off.
@reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in.
The reader seesThe frame whitens for an instant. Photosensitive effect: on gentle settings it does not play at all, so the scene has to read without it.
@flash
narrator: In the mirror, a second before the dark, there were two of them.
@flashlight [mode] [aim]◐
A torch beam — only the cone of light is visible
Puts out the frame and leaves only a cone of light — it spreads from the reader's hand into the scene, so the corners stay dark. The light is cold, unlike the warm candle that burns inside a scene on its own. This is a state, not a flash: it holds until the author changes the frame. A new @bg, a new scene, or an explicit @flashlight off takes it away.
modeenum, optionaloff— take the torch away. With no argument — turn it on.on·offaimenum, optionalaimed— the reader leads the beam: it follows a finger across the frame, and only what the reader lights is seen. Without it,fixed: the beam stays where the author put it.fixed·aimed
The reader seesThe frame is visible only inside the cone; with aimed the reader moves the beam.
@flashlight
narrator: The beam shook with his hand.
narrator: Beyond the circle of light something shifted its weight.
@flashlight on aimed
narrator: Light it yourself. The firewood was around here somewhere.
@flashlight off
@flicker [tint] [@reduce_motion <reduce_motion>]⚡◐
A light source flickering
A light source flickering. Tie it to a state: a torch that started to blink in chapter three should be dead by chapter five.
tintenum, optional- Colour:
black(default),red,green,amber. The shade comes from the story's theme, so one story's red is not another's.black·red·green·amber @reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in.
The reader seesThe light blinks. Photosensitive effect: on gentle settings it does not play at all, so the scene has to read without it.
@flicker red
narrator: The lamp blinked twice and thought better of it.
@fog [density]
Fog / haze — depth and concealment
Haze over the frame: it gives depth and hides detail. The intensity setting does not damp it — this is part of the composition, not an atmospheric accent.
densityfloat, optional- Density, 0…1.
@fog 0clears it.0…1
The reader seesHaze draws over the frame.
@fog 0.6
narrator: The far bank could only be guessed at, by its lights.
@fx <kind> [amount] [@reduce_motion <reduce_motion>]⚡◐
Post effect
The general spelling for five post effects: the same thing can be written as its own directive (@fx glitch 0.4 and @glitch 0.4 are one and the same).
kindenum- Which effect to apply.
film_grain·glitch·vhs·chromatic·desaturate amountfloat, optional- Strength, 0…1. Without it, this effect's default.0…1
@reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in.
The reader seesThe frame takes the chosen filter. Photosensitive effect: on gentle settings it does not play at all, so the scene has to read without it.
@fx film_grain 0.4
narrator: The film ran noisy, as if somebody had watched it already.
@glitch [amount] [@reduce_motion <reduce_motion>]⚡◐
Glitch — the frame tears
Distortion of the frame — torn scanlines, displacement. The sign of a damaged recording.
amountfloat, optional- Strength, 0…1. Without it, the default.0…1
@reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in.
The reader seesThe frame tears and shifts. Photosensitive effect: on gentle settings it does not play at all, so the scene has to read without it.
@glitch 0.5
narrator: The recording jerked, and for a second there was a third person in frame.
@jumpscare <image> [@sound <audio>] [@reduce_motion <reduce_motion>] [@alt <alt>]⚡◐
Jumpscare
An abrupt image with a sound. One per story is enough: the second does not frighten and the third annoys.
imageasset- An image id from the story's assets.
@soundasset, named- The id of the sound that plays with the frame.
@reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in. @altstring, named- A description of the image for a screen reader. Without it the validator raises
NSX_ALT_TEXT_MISSING.
The reader seesThe frame is replaced by the picture for an instant and a sound plays. Photosensitive effect: on gentle settings it does not play at all, so the scene has to read without it.
@jumpscare face_in_window @sound stinger_01 @alt "A face at the window, right against the glass"
@reveal_bg <image> [@alt <alt>]
Reveal / hide the background — what is shown
Shows or hides the background — what was concealed becomes visible.
imageasset- An image id from the story's assets.
@altstring, named- A description of the image for a screen reader. Without it the validator raises
NSX_ALT_TEXT_MISSING.
@reveal_bg cellar_full @alt "The cellar entire: crates stand along the far wall"
@sprite <image> [slot] [scale] [@alt <alt>]
Character sprite
Shows a character over the background. The slot decides where on screen: a second @sprite into the same slot replaces whoever was standing there.
imageasset- An image id from the story's assets.
slotstring, optional- The place on screen (
left,center,right). Without it the default slot is used. scalefloat, optional- A size multiplier, 1 being normal. The picture is always fitted to the band of screen it is given, so size is a multiplier rather than pixels: 1.4 is larger (closer to camera), 0.7 smaller (deeper in the frame). A character grows upward; the feet stay where they are.0.25…3
@altstring, named- A description of the image for a screen reader. Without it the validator raises
NSX_ALT_TEXT_MISSING. For a sprite, describe the STATE: "Mark, caked in mud, holding his shoulder".
@sprite mark_hurt left 1.3 @alt "Mark, caked in mud, holding his shoulder"
mark: I am fine.
@sprite_hide [slot]
Take a sprite out of its slot
Removes a character from a slot. With no argument it clears the default slot.
slotstring, optional- The slot to free.
@sprite_hide left
narrator: He left without waiting for an answer.
@sprite_shake [slot] [amount]◐
A character sprite trembles
A tremor in the character standing in a slot. With no sprite there it does nothing.
slotstring, optional- The slot whose sprite shakes.
amountfloat, optional- Amplitude, 0…1.0…1
@sprite shivering_man left @alt "A man in a soaked jacket"
@sprite_shake left 0.4
@strobe [hz] [@reduce_motion <reduce_motion>]⚡◐
Strobe — hard flicker (the rate is capped, §17)
A hard flicker at a given rate. The rate is capped hard: above the safe threshold the value is clamped on the reader's side and the validator warns.
hzfloat, optional- Flashes per second. Above the safe threshold the validator raises
NSX_PHOTOSENSITIVE_LIMIT.0…∞ safe up to 3 @reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in.
The reader seesThe screen strobes. Photosensitive effect: on gentle settings it does not play at all, so the scene has to read without it.
@strobe 2
narrator: The emergency light counted the seconds for him.
@vhs [amount] [@reduce_motion <reduce_motion>]⚡◐
VHS scan
A videotape scan: bands, jittering lines. It declares the medium — the reader is watching a recording.
amountfloat, optional- Strength, 0…1. Without it, the default.0…1
@reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in.
The reader seesThe frame runs as if off a tape. Photosensitive effect: on gentle settings it does not play at all, so the scene has to read without it.
@vhs
narrator: The counter in the corner was running backwards.
@video <clip> [mode] [@reduce_motion <reduce_motion>] [@alt <alt>]⚡
Video insert
A short clip takes the frame and STAYS in it, the way a background does. @video_stop is the way back. The clip goes into the story's assets like any other file; what it is re-encoded to is the platform's business, not yours.
clipasset- The clip's id in the story's assets.
modeenum, optionalonceplays it through and holds the last frame (the default).loopruns it until something stops it.once·loop@reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in. @altstring, named- A description of the image for a screen reader. Without it the validator raises
NSX_ALT_TEXT_MISSING. For a clip, describe WHAT HAPPENS in it, not that it is a video: "the camera runs down a corridor, the light dies behind it".
The reader seesThe clip takes the frame and holds its last picture afterwards. A reader who has turned motion or flashes off does not get the clip at all — they read your @alt instead. So the description is not decoration: for some people it IS the scene.
@video corridor_run @alt "the camera runs down a corridor, the light dies behind it"
narrator: There was nowhere to run, and he ran anyway.
@video_stop
Take the video insert out of the frame
Removes the video insert. Without it the clip holds the frame to the end of the scene, like a background.
No arguments.
@video_stop
narrator: The screen went dark, and the house was audible again.
@vignette [amount] [tint]◐
Vignette — the field of view closes in
Darkens the edges of the frame, narrowing the field of view. It works well with @flashlight: a cone of light and the dark around it.
amountfloat, optional- How dark, 0…1.0…1
tintenum, optional- Colour:
black(default),red,green,amber. The shade comes from the story's theme, so one story's red is not another's.black·red·green·amber
The reader seesThe edges of the frame darken — to black, or to the colour named.
@vignette 0.7 green
@flashlight
narrator: Past the cone there was nothing.
Camera 5Nightfall Stories
@dutch [degrees]◐
Dutch angle — unease
Tilts the horizon. The classic move for unease — the frame stops standing straight.
degreesfloat, optional- The tilt, in degrees.0…12
The reader seesThe frame tilts.
@dutch 8
narrator: The room stood wrong, and it took him a moment to see how.
@letterbox [amount]
Cinema bars at the peak
Cinematic bars top and bottom. The intensity setting does not damp them — they are the frame itself. @letterbox 0 takes them away.
amountfloat, optional- Bar height, 0…1.0…1
The reader seesThe frame is cropped by bars top and bottom.
@letterbox 0.8
narrator: After that it all went like somebody else's film.
@pan_cam <x> [y]
Pan the camera across the background
A camera pan across the background — the frame travels without the picture changing.
xfloat- Horizontal offset.-1…1
yfloat, optional- Vertical offset.-1…1
The reader seesThe frame slides smoothly.
@pan_cam 0.5
narrator: His gaze went along the wall all the way to the corner.
@shake [amount]◐
Screen shake
A shake of the whole screen: an impact, an explosion, a shove.
amountfloat, optional- Amplitude.0…1
The reader seesThe screen shakes.
@shake 0.6
@sound impact_low
narrator: Something hit the door from the other side.
@zoom <scale>
Push in / pull out
A push in or a pull out across the background.
scalefloat- Above 1 pushes in, below 1 pulls out.
The reader seesThe frame moves closer or further away.
@zoom 1.4
narrator: In the corner of the photograph there was one more face.
Interaction 4Nightfall Stories
@choice_shake [amount]◐
A trembling choice button
A tremor in a choice button — an option that comes hard.
amountfloat, optional- Amplitude, 0…1.0…1
@choice_shake 0.5
* choice "Confess"
-> confess
* choice "Say nothing"
-> silent
@choices_fade [seconds]
The options arrive after a delay
The options fade in after a delay. It gives the scene time to be read before the reader reaches for a button.
secondsfloat, optional- The delay before the options appear.0…∞
@choices_fade 1.5
* choice "Open it"
-> inside
* choice "Walk away"
-> away
@haptic◐
Haptic feedback
Haptic feedback on a phone. On a device without vibration it does nothing.
No arguments.
The reader seesA short buzz.
@haptic
@sound impact_low
narrator: The floor jerked under his feet.
@hold_to_act [duration_ms] [label] [@fallback <fallback>]
Hold to act — a blocking gesture (§17: with an accessible alternative)
A blocking gesture: the scene waits until the reader holds a press. An accessible alternative — an ordinary tap — stands beside it by default.
duration_msint, optional- How long to hold, in milliseconds (200…10000).200…10000
labelstring, optional- The caption for the reader, e.g. «Hold».
@fallbackenum, namedon(default) — a tap alternative exists.offis flagged by the validator as a risk: some readers physically cannot hold.on·off
The reader seesA control appears that has to be held.
@hold_to_act 2000 "Hold the door"
narrator: The pushing from the other side stopped.
Reveal 4Nightfall Stories
@classify <class>
Classify an object (Safe/Euclid/Keter…)
An object class in the manner of a classified file. It declares the medium — the reader is reading a case file.
classenum- The object's class.
safe·euclid·keter·thaumiel·apollyon
@classify keter
narrator: Containment was revised after the incident of 12/04.
@clearance_gate <level>
Gate the content by clearance level
A clearance gate: part of the material is shown only to those who reached the level. The language of a document — it works together with @classify and @redact.
levelint- The clearance level required, a whole number.0…∞
Draws nothingуровень допуска как состояние; закрытие строится условием
@clearance_gate 4
@redact
narrator: Appendix 4-B is available from level 4.
@foreshadow <key>
Foreshadowing / a callback (a marker)
A foreshadowing marker: it flags the detail that will fire later. It lets you check that the promise was made before it was kept.
keystring- The name of the foreshadowing, in latin letters — the same one
@revealuses later.
The reader seesnothing — a silent marker that shows up later.
@foreshadow the_second_key
narrator: There was one key too many on the nail by the door.
@reveal <key>
A controlled reveal (a marker)
A marker for a controlled reveal: it records that something became known to the reader here. You set it for yourself and for the reports; branching is not built on it — flags are for that.
keystring- The name of what was revealed, in latin letters.
Draws nothingотмечает раскрытие для автора и отчётов; читатель ничего не видит
@reveal who_sent_the_letter
narrator: The signature at the bottom was hers.
Meta 6Nightfall Stories
@arg_code <code>
An ARG code: an outside puzzle / gate
The code of an outside puzzle: a string the reader looks for beyond the story. It is not a gate by itself — you build the gate with a condition.
codestring- The code the reader has to find.
Draws nothingобъявляет код внешней загадки; гейт строится условием на флаге
@arg_code SEVEN_DOORS
narrator: On the back of the photograph were seven letters.
@fake_crash [@reduce_motion <reduce_motion>]⚡
A fake crash
A fake application failure. Strong and risky: some readers will decide something is broken.
@reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in.
Not working yetподдельный сбой пока не нарисован — экран не меняется
@fake_crash
narrator: …
@meta_break
Break the fourth wall
The story addresses the reader directly. A one-time move — done twice it reads as a manner rather than an event.
No arguments.
@meta_break
narrator: You have read this once before, haven't you.
@notify [text]
A fake system notification
A fake system notification — a message that appears not to come from the story.
textstring, optional- The notification's text. Shown to the reader as written, untouched.
The reader seesA «Notification» banner with your text. Several notifications in a row are seen one after another, in the order written, rather than stacked on top of each other.
@notify "Battery 4%. Connect a charger."
@persona <field>
Personalisation: name / time / device / date
Puts the reader's own data into the text: name, time, device, date. It works hardest once, and at the moment the story is not supposed to know.
fieldenum- What to put in.
name·time·device·date
Draws nothingобъявляет поле подстановки; данные читателя пока не подставляются
@persona time
narrator: That is exactly the time you have now. Check it.
@terminal
A diegetic terminal / console input
A diegetic terminal — the text comes out as console output.
No arguments.
The reader seesThe screen takes on the look of a terminal.
@terminal
@font mono
narrator: > access granted
narrator: > loading the log for 12/04
Theme 1Nightfall Stories
@sanity_show
Show the sanity meter
Shows the sanity meter. It need not be kept on screen: it is often stronger when the meter appears at the moment things go wrong.
No arguments.
The reader seesA sanity bar appears on screen.
@sanity_show
@set sanity = 0
@set sanity -= 20
Meters 3Nightfall Stories
@meter_hide <meter>
Hide a state meter
Takes the meter off the screen. The flag's value is untouched.
meterenum- Which meter.
sanity·fear·health·infection·will·faith·curse·suspicion·reputation·morale·hunger·thirst·fatigue·warmth·oxygen·battery·noise·visibility
@meter_hide sanity
narrator: Counting had stopped meaning anything.
@meter_show <meter>
Show a state meter in the HUD
Puts a state meter on screen. The meter itself is an ordinary whole-number flag with bounds, declared in the flag schema; the directive only shows it to the reader.
meterenum- Which meter. The name has to match a flag in the schema.
sanity·fear·health·infection·will·faith·curse·suspicion·reputation·morale·hunger·thirst·fatigue·warmth·oxygen·battery·noise·visibility
The reader seesA bar appears on screen with its current value.
@set sanity = 0
@meter_show sanity
@set sanity -= 15
@sanity_distort [amount] [@reduce_motion <reduce_motion>]⚡◐
Perception distorts as sanity drops
Distorts perception — the delivery changes along with the state. It is usually tied to the sanity meter: the lower the meter, the higher the value.
amountfloat, optional- How much distortion, 0…1.0…1
@reduce_motionstring, named- What to do under reduced motion:
off— do not play,keep— play as written, or the name of another, calmer effect to stand in.
The reader seesFrame and text distort. Photosensitive effect: on gentle settings it does not play at all, so the scene has to read without it.
@set sanity = 0
@set sanity -= 20
@sanity_distort 0.6
narrator: His hands would not obey, and the letters crawled apart.
Resources 6Nightfall Stories
@craft <result>
Crafting: build an item out of parts
Declares that an item has been assembled from parts. Checking that the parts are there is your condition to write.
resultstring- The name of the resulting item, in latin letters. The reader sees this name, so write it for a person: latin letters, words joined by underscores.
The reader seesA «Assembled» banner with the item's name.
@craft makeshift_torch
narrator: A rag, a branch, and what was left of the kerosene.
@currency <op> <amount>
In-world currency (the world, not monetisation §07)
In-world currency: coins, rounds, candles. It has nothing to do with real purchases and is never counted on the same scale as them.
openumaddto credit,spendto spend.add·spendamountint- How much.0…∞
The reader seesA «Received» or «spent» banner with the amount.
@currency add 5
narrator: There was loose change in the coat pocket.
@inventory_show
Open the inventory
Opens the list of items for the reader.
No arguments.
@inventory_show
narrator: Everything he had fitted in one pocket.
@item_get <item>
Take an item into the inventory
Puts an item in the inventory. The inventory is a set flag, so adding the same thing twice changes nothing.
itemstring- The item's name, in latin letters. The reader sees this name, so write it for a person: latin letters, words joined by underscores.
The reader seesA «Received» banner with the item's name.
@item_get candle
narrator: The candle was warm, as if it had just been blown out.
@item_lose <item>
Take an item out of the inventory
Removes an item from the inventory — lost, taken away, left behind.
itemstring- The item's name, in latin letters — the same one
@item_getused.
Draws nothingубирает предмет из инвентаря; показывает его @inventory_show
@item_lose candle
narrator: The candle stayed there, on the steps.
@item_use <item>
Use / spend an item
Uses an item. Whether it is spent is your decision — the directive declares the action.
itemstring- The item's name, in latin letters.
The reader seesA «Used» banner with the item's name.
@item_use candle
narrator: The flame reached the wick and stopped.
Choice 2Nightfall Stories
@skill_check <stat> <difficulty>
A skill check: a stat against a difficulty (± RNG)
Declares a skill check. It does not decide the outcome — your condition does: the directive shows the reader that a check happened, and at what value.
statstring- The name of the skill flag, in latin letters.
difficultyint- The difficulty threshold, a whole number.0…∞
The reader seesA «Check» banner with the skill's name, its current value and the threshold.
@set nerve = 0
@set roll = 0
@skill_check nerve 14
@set roll = rand(1, 20) + nerve
@if roll >= 14 -> steady
-> shaking
@timer <duration_ms>
A timer bar on a choice, ms (§17 — an accessible window)
A timer on a choice. It is written ONLY in the option header (* choice "…" @timer 8000) — on a line of its own the validator refuses it. Running out has to be a meaningful outcome, not a punishment.
duration_msint- Milliseconds: 8000 is eight seconds.0…∞
The reader seesA bar of time runs under the menu.
* choice "Get it shut in time" @timer 8000
-> closed
* choice "Step back"
-> back
Occult 7Nightfall Stories
@divine [spread]
Divination / tarot — the spread colours the path
Divination: the spread colours the chapter. A good place for chance — a prophecy that may not come true builds tension, while one that decides a fate reads as unfairness.
spreadenum, optional- What the divination is done with.
tarot·runes·bones
Draws nothingрезультат гадания ложится во флаг, который вы читаете сами
@divine tarot
narrator: The top card came down face away, and nobody turned it over.
@incantation <spell>
An incantation: components → effect
An incantation: components add up to a result. The same gate as a ritual, but in words.
spellstring- The spell's name, in latin letters.
Draws nothingгейт по словам-компонентам — состояние, а не картинка
@incantation open_the_seventh
narrator: He said the words correctly. That was the mistake.
@pact <id>
A pact / a bargain: the gain now, the price later
The gain now, the price later. Technically it is a flag set here and read far away; if the price never arrives, the pact deceives the reader rather than the character.
idstring- The pact's name, in latin letters — the condition you write later reads it.
Draws nothingвыгода сейчас, цена потом — флаг здесь и чтение далеко
@pact debt_to_the_ferryman
narrator: "Later," he said. And that was consent.
@ritual <id>
A ritual: an order of acts / symbols as a gate
A ritual as a gate: it opens on an order of acts rather than an item. The order has to be named in the story, not guessed at by the reader.
idstring- The ritual's name, in latin letters.
Draws nothingгейт по порядку действий — состояние, а не картинка
@sign_add salt
@sign_add ash
@ritual circle
narrator: The circle closed, and the room went a degree colder.
@sacrifice <give> [gain]
A sacrifice / a trade: give X for Y
Giving one thing up for another. Giving has to be expensive — a character, a memory, the way back; «minus five candles» is not a decision.
givestring- What is given up.
gainstring, optional- What is gained in return.
The reader seesA «Sacrifice» banner with what was given and what was gained.
@sacrifice memory_of_her_voice safe_passage
narrator: He stopped remembering how she laughed. The door opened.
@sign_add <sign>
Collect a sign / a symbol
Adds a sign or a symbol to a set — like a clue in an investigation.
signstring- The sign's name, in latin letters. The reader sees this name, so write it for a person: latin letters, words joined by underscores.
Draws nothingдобавляет знак в набор — состояние, а не картинка
@sign_add salt
narrator: The salt lay in an even line across the threshold.
@vision [image] [@alt <alt>]◐
A dream / a vision — another layer of reality
A dream or a vision — a layer of reality beside the main one.
imageasset, optional- An image id, if the vision shows a frame.
@altstring, named- —
@vision drowned_hall
narrator: The water stood level with the ceiling, and somebody waited in it.
Investigation 7Nightfall Stories
@accuse <target>
An accusation / a deduction from what was gathered
The accusation — the moment a theory becomes an action. An incomplete theory should lead to a different ending, not a worse one: an investigation is better when you can be wrong without losing.
targetstring- Who is accused, in latin letters.
Draws nothingфиксирует обвинение; развилку строит ваше условие
@accuse the_caretaker
narrator: The caretaker did not argue. That was the worst of it.
@board_link <a> <b>
Link two clues on the investigation board
Links two clues on the investigation board — the moment facts turn into a theory.
astring- The first clue.
bstring- The second clue.
The reader seesA «Link» banner with both clues.
@board_link letter_without_signature typewriter_in_office
@cipher <puzzle>
A cipher / puzzle / lock as a gate
A cipher or a lock as a gate. It works when the answer lies in the story's text rather than in the reader's ingenuity; leave a way around.
puzzlestring- The puzzle's name, in latin letters.
The reader seesA «Lock» banner with the puzzle's name.
@cipher cellar_padlock
narrator: Four digits. The date on the headstone fitted.
@clue_add <clue>
Add a clue / a piece of evidence
Adds a clue. Clues are a set flag, so a condition on them is written the ordinary way and a repeat spoils nothing.
cluestring- The clue's name, in latin letters. The reader sees this name, so write it for a person: latin letters, words joined by underscores.
The reader seesA «Clue» banner with the clue's name.
@clue_add letter_without_signature
narrator: The letter was typed, and it was not signed.
@examine <hotspot> [image] [@alt <alt>]
Examine a point of interest (a hotspot)
Examining a point of interest. There is usually a clue behind it.
hotspotstring- What is being examined, in latin letters.
imageasset, optional- An image id, if the examination shows a picture.
@altstring, named- —
Draws nothingотмечает осмотр точки интереса; что за ней — ваш текст
@examine desk_drawer
narrator: In the drawer lay the other half of the photograph.
@interrogate <npc>
An interrogation with lie / truth detection
An interrogation. A lie has to be catchable with evidence: every lie needs a clue that refutes it, or it is noise.
npcstring- The character's name, in latin letters.
The reader seesAn «Interrogation» banner with the character's name.
@interrogate the_caretaker
the_caretaker: I left at nine. As always.
@map_move <location>
Move to a location on the map
Movement across the map. It works well as a loop with something accumulating; make sure at least one road leads out of the circle of locations.
locationstring- The location's name, in latin letters. The reader sees this name, so write it for a person: latin letters, words joined by underscores.
Draws nothingперемещение по карте как состояние; экран карты рисуете вы
@map_move old_pier
narrator: The pier smelled of diesel and fish.
Relationships 3Nightfall Stories
@companion <npc> <action>
A companion joins / leaves
A companion joins or leaves. A departure earned by the reader's behaviour lands harder than one written into the plot — which is why it usually stands under a condition on a relationship.
npcstring- The character's name, in latin letters — the same one
@relationuses. actionenum- Joining or leaving.
join·leave
The reader seesA «A companion is with you» or «The companion left» banner with the character's name.
@set trust_anna = 0
@if trust_anna < 2
@companion anna leave
anna: You are on your own now.
@npc_remember <npc> <key>
An NPC's memory: remember a choice
Writes one particular choice into a character's memory, to be played back in a later line. Unlike @relation it stores a fact rather than a number.
npcstring- The character's name, in latin letters.
keystring- The memory's name, in latin letters — the condition you write later reads it.
The reader seesNothing: it is a hidden mark that shows up in a later scene.
@npc_remember anna did_not_turn_around
narrator: Anna said nothing. But she remembered.
@relation <npc> <axis> <op> <amount>
An NPC's relationship (trust / fear / romance / suspicion)
Changes a character's relationship along one axis. The axes are independent: fear and distrust lead to different behaviour, and one common «relationship» scale cannot say that.
npcstring- The character's name, in latin letters. You invent it; nothing has to be declared first.
axisenum- Which axis.
trust·fear·romance·suspicion openum- How to change the value.
+·-·= amountint- By how much.0…∞
The reader seesA «Relationship» banner with the character's name and the direction of the change.
@relation anna trust + 1
anna: All right. I believe you.
Progression 3Nightfall Stories
@achievement <id>
Unlock an achievement
Marks an achievement as unlocked. Achievements are not declared up front: the list is gathered from what the story named, and stays with the reader afterwards.
idstring- Your name for the achievement, in latin letters. The reader sees this name, so write it for a person: latin letters, words joined by underscores.
The reader seesA «Achievement» banner with the achievement's name.
@achievement never_looked_back
narrator: He did not look back once the whole way.
@codex_unlock <entry>
Unlock a codex / lore journal entry
Unlocks an entry in the lore journal. The entry outlives the playthrough, so it works as an invitation to come back: the reader sees a reference to an event they did not find.
entrystring- The entry's name, in latin letters. The reader sees this name, so write it for a person: latin letters, words joined by underscores.
Draws nothingоткрывает запись в кодексе; всплывающей плашки нет
@codex_unlock ritual_of_the_seventh_door
narrator: In the notebook was a diagram, drawn in somebody else's hand.
@ending_mark <ending>
Mark a collectable ending
Marks an ending as found, for the «N of M found» counter. The denominator counts the endings the story declares, so before publishing use a bot-walk to check every one is reachable.
endingstring- The ending's name — the same one that stands in
@end. The reader sees this name, so write it for a person: latin letters, words joined by underscores.
The reader seesAn «Ending unlocked» banner with the ending's name; the found counter goes up.
@ending_mark buried_alive
@end buried_alive