Skip to content

Field types

Every field type — what each stores, every option the builder offers, how it is edited on the canvas, what a game engine receives, and what breaks.

All documentation — The node builder
On this page

A field is a typed value on a node. The type decides three things at once: how the value is stored, how it is edited on the canvas, and what a game engine receives for it. Everything else on a field — its label, its layout, its reading — is presentation. You can change a field’s type after nodes exist: the values that no longer fit are parked, not deleted (see changing a field’s type and the guarantee on the index page).

A node type open in its builder tab: the Structure tree in the drawer with its HEADER and BODY folders, and the type's tab holding the live preview and the inspector.
A field's options fill the inspector when you select it.

The types

In the order the Type tiles are laid out, under Type & code in a field’s inspector.

TypeKeyA node storesPoints atTranslatableThe AI
TexttextA plain string—Yes, when Translatable is onWrites it
Rich textrichTextFormatted text, one copy per language—Yes, when Translatable is onWrites it — never inside a repeater block
Booleanbooleantrue or false—NoWrites it
DatedateA timestamp—NoWrites it
TimetimeA time of day — HH:MM, 24-hour—NoWrites it
NumbernumberA number—NoWrites it
AssetassetA media item’s id, or a list of themMediaNoOnly an existing id
EntityentityAn entity item’s id, or a list of themEntitiesNoOnly an existing id
SelectselectAn option’s value token, or a list of themAn enum or bitmask, optionallyNoPicks from the options
ColorcolorA hex colour string—NoWrites it
Vector3vector3Three numbers, x, y and z—NoWrites it
CodecodeExpression-language source—NoWrites it
Node linknodeRefA node’s idA node on any boardNoNot checked
Board linkboardRefA board’s idA boardNoOnly an existing id
Document linkdocumentRefA document’s idA document or spreadsheetNoOnly an existing id
Variable linkvariableRefA variable’s id, or a list of them — or a name you type, when the field allows itA variableNoOnly an existing id, unless the field allows a typed name
Command callcommandCallA command’s id and its argumentsA commandNoNot checked
Tag linktagRefA tag’s idA tagNoOnly an existing id
ConditionconditionExpression-language source—NoWrites it
PositionpositionA point on one of the type’s pictures — x and y, each 0 to 1—NoLeaves it
AreaareaA box on one of the type’s pictures — x, y, w and h, each 0 to 1—NoLeaves it
Entities with countsitemCountsA list of entity items with a count each — [{ item, count }], in your order, an item allowed more than onceEntitiesNoOnly an existing id — a list naming a record that does not exist, or longer than the field’s capacity, is dropped whole

All of them are available on a node type. Node link, Position and Area are the three types you cannot put on an entity definition — an entity form has no picture to place anything on — so every other one is shared with definitions.

The AI column means: writes it — the assistant authors the value; picks from the options — one of the select’s values, and a value outside the list is reported; only an existing id — the assistant may only fill it with an item it has been told exists, and it is told about entities above all, so the other references usually stay empty rather than invented; not checked — nothing verifies what it writes, so set these by hand; leaves it — a place on a picture is dragged there by you, and the assistant never writes one.

Settings every field has

These appear for most types, across the inspector’s four groups — Type & code, Type settings, Where & when, Look. The label is what the builder shows; the key is what a pasted definition carries. A control listed as greyed is shown but disabled, with its reason on hover.

SettingKeyWhat it doesDefaultOffered when
TypetypeThe type, as a grid of tiles. Changing it resets the type’s options, the reading and the editing mode; the field keeps its id, so its values are parked, not lostTextalways
CodecodeThe identifier exports and generated code use. Follows the label until you edit it. A red duplicate hint marks a collision; the builder re-codes a typed duplicate as you commit it, and one that arrives anyway is re-coded automaticallyfrom the labelalways
Spanlayout.columnSpanFull width, 1 column, 2 columns…Full widthgreyed until the body has more than one column, and always for a row’s cell
Rowslayout.rowSpan1 (normal) to 8 rows1the same
PlaceholderplaceholderText shown while the field is empty — the box reads Shown when empty; for a chip-style type the hint reads Empty = icon only. A placeholder shows the form of the value, short and on one line (Enter condition..., gold > 10, Epilogue…); what the field is for goes in its label and its Hint (the hover tooltip). A sentence in a placeholder is an explanation in the wrong place — it is dimmer than a label, it is clipped to one line on the card, and it vanishes the moment you typenoneevery type but Boolean
Initial textinitialTextThe words a new node’s field starts with — written once, when the node is created, and the node’s own from then on. Editing the type later never changes a node that already exists. Not a template: one literal stringemptyText, Code and Condition fields outside a repeater block (a block’s text is created when you first edit it)
Show labelshowLabelOverrides the type’s Show field labels for this fieldthe type’s settingalways
Shown asreadingHow the value is drawn at rest — see each type, and Shown as for the whole list, the region defaults and what a region withholdsControl · default — or the region’s default where the field sitsevery type but Rich text, Position and Area
Show bordershowBorderThe box around the controlonevery type but Boolean
Hide when emptyhideWhenEmptyDraw nothing while the value is unset, blank or an empty list. false and 0 are not emptyoffevery type but Rich text and Code — save a Code field shown as a ledger, which hides while it holds no statement; never in a table
Between rowsseamDraw this field before its row rather than inside it — a seam across the list: a phase’s trigger, a chapter’s heading. Full width under a card list, a full-width row under a table, on the span’s leading edge under a band lane; the first row’s seam only once it has a value; the field stays in the row’s card. One per block — a second flagged field draws inside the row, and the builder says so (Appearance)offa field inside a repeater block
Show when / Editable whenshowWhen / enableWhenA condition on a sibling field: is set, is empty, equals, is not — the last two take a valueAlwaysgreyed until the field has a sibling to read — another field on the type, or, inside a repeater block, another field in the same block
Use as this node’s namepreviewShown in the jump picker, search and exports. Several marked fields join in order; none marked means the first text-like fieldoffText, Rich text, Code, Select, Date, Entity, Asset
Value alignvalueAlignLeft, centre or right, for controls that do not fill their cellleftEntity, Asset, Select, Date, Color, Boolean and every link type
BGbackgroundA background tint for the fieldnonealways
EditinginteractionClick to edit · Always on · In dialog — see belowper typegreyed for Rich text, Code and Node link (edited on the card by its own editor), and for Condition and Entities with counts (edited in the node’s dialog — there is no card editor for it; a click on a Condition’s cell opens its own card; Entities with counts opens the row’s card on a repeater row, and at node level is a chest edited in place — or opens its own card when shown as Sentences or Chips — see Entities with counts)
Big empty stateplaceholderStyle: "hero"Centre the placeholder + icon as a large press-me targetoffevery type but Boolean, Rich text and Code (Text, Number and Vector3 only when shown as something that draws its own element — a stat, a meter, prose, a line; not as a word or a pill)
Hide on the nodehideOnCardKeep the value, draw nothing on the card — it stays editable in the dialogoffEditing is In dialog; otherwise greyed
Also in the node dialoginDialogEdited on the card AND listed in the node's field dialogoffEditing is not In dialog, and the dialog can edit the type; otherwise greyed
TranslatableisLocalizableInclude this text in translation exports and the localization paneloffText, Rich text
Spoken aloudhasVoiceOverThis field's text gets a voice-over take, per languageonText, Rich text
Label stylelabelStylePosition, alignment, emphasis, size, typeface, indent, width, colour—the label is shown
Value stylevalueStyleWeight, italic, size, typeface, colour, auto-contrast—every type with text in it (not Boolean, Color, Code, Condition)

How a field is edited

ModeWhat it means
Click to editThe card shows a read-only display, so a single click selects or drags the node; double-click opens the control in place
Always onThe control is live; a single click acts
In dialogEdited in the node’s own dialog, still drawn read-only on the card

Defaults: Text, Number, Vector3 and Rich text open on double-click; Condition is always In dialog; everything else is Always on. An empty Text or Rich text field (still showing its placeholder) opens on a single click, and typing on a selected node opens its first Text or Rich text field that is edited on the card. Click to edit is offered only for Text, Number and Vector3 — a switch, a picker or a chip has no read-only state to offer.

Text

A short line: a title, a name, a caption. With Multiline, a paragraph.

OptionKeyWhat it doesDefault
MultilinemultilineA taller, wrapping box. Rendering only — the stored value is the same string either wayoff
Quote marksquotedSet the words in curly quotes on the card — a line of speech, whatever it is shown as. The card’s drawing only: the stored words never hold the marks, the box you type in shows none, and an empty field shows its placeholder without themoff
Max lengthmaxLengthThe text box stops accepting characters at this length, on the card and in the dialogNone
Max heightmaxHeightCaps the box in pixels and scrolls inside it. Offered only while Multiline is onblank — grows
InsetpaddingField padding in pixels, 0 to 40 — the space at the sides of the value8 in a box; none for a word drawn without one
Shown asreadingWord — bare text, no box; Pill — a mono code pill; Stat — the value at title size with the label as a caption; Prose — a flowing paragraph, never clipped; Display line — a title or a line of speech, display face, clipped to two linesControl · default

On the canvas: a read-only line; double-click opens the text box in place. Translation and voice-over are per field: Translatable is off until you turn it on; Spoken aloud is on.

To a game engine: a string.

Rich text

Prose with emphasis, links, @ mentions of your project’s objects and {interpolated} values — what a line of dialogue is written in.

OptionKeyWhat it doesDefault
FormatsallowedFormatsWhich marks the editor offers: bold, italic, underline, strike, highlight, subscript, superscript, link. With every chip off ([]) the field is plain prose that still takes mentionsall on
Min heightminHeightpx (reserve room) — room to write before any text existsauto
Max heightmaxHeightpx (blank = grow) — caps the field and scrolls inside itblank
Fill body & scrollfillBodyMakes this field the part of the body that stretches and scrolls when a node is resized. It takes a row of its own on the card. One per node — the first in order winsoff
InsetpaddingField padding in pixels, 0 to 40 — the space between the field’s outline and its text8

Fill body & scroll is disabled unless the type has a settled height: Needs a settled height. This type grows with content and its height can't be dragged, so nothing ever squeezes the body — set Height to Fixed height, or allow a vertical Resize. It is also disabled for a field inside a repeater block or a row, with the reason beside it — only a field in the body’s own flow can fill.

On the canvas: the formatted text; double-click edits in place. The editing mode is not configurable, and the node dialog does not edit rich text. In Value style, weight, italic, size and typeface take effect on rich text; colour does not, and is not offered. Hide when empty and Big empty state are not offered.

To a game engine: the text per language, both as HTML and as plain text; the field’s value is the default language’s plain text.

Number

OptionKeyWhat it doesDefault
Allow decimalsdecimalOff: the value is read as a whole number. On: decimals are keptoff
StepstepThe spinner’s increment. A value of zero or less is stored as blankblank — the placeholder shows the box’s own step
UnitunitWhat the number counts in — s, h, kg, %. The card shows it wherever the number is: in brackets after the label when the label is drawn (After (s) — a table’s column head, the row card, the node’s dialog), after the value when it is not (20 s, a number shown as a Word with its label hidden; not in a sentence, whose template says it), and in a map legend (After 2 s). This is the only way to give a number a unit: brackets typed into the Label are just words — Weight (optional) is a label, never a weight in optionalsblank — no unit
Range … tomin / maxBounds. The spinner respects them, and a typed value is clamped when you leave the boxblank
Ends … /minLabel / maxLabelThe words at the two ends of a Meter’s track — Hostile / Friendly on a stance. Offered only while the field is shown as a Meter; either alone is fineblank
Danger fromdangerFromThe value a Gauge’s red band starts at, in the field’s own units. The band runs from that value to the nearer end of the range — 25 on 0 to 100 bands the low quarter (a hull), 80 bands the top fifth (a heat) — and the note beside the box says which (below 25 / above 80); a value inside the band turns the sweep and the number red. Offered only while the field is shown as a Gauge; a value outside the range draws no band, and the note says soblank — no band
Shown asreadingWord — the bare number; Stat — at title size, the field’s icon leading it; Meter — needs both bounds; Gauge — a half-circle dial, the value swept in the type’s colour with a needle, the number under the pivot and the range at the two ends; needs both bounds; Ring — a count out of a total as a ring with the number inside (3/8), needs the upper bound (the lower is the ring’s zero, 0 when blank), green when full; Pips — one pip per unit up to the maximum, which must be 1 to 10Control · default

On the canvas: the value; double-click opens a number box in place. Three or more Number fields on a node can also be drawn together as one shape by a radar — an item of the type, not a reading of any one field — and a Number field of a repeater’s block can be summed over the rows by a total. Inside a repeater block a Number can hold a role, picked on the repeater rather than on the field: a track’s Start, Duration, Every and Repeats, and the Weight a random exit rolls by (the repeater’s inspector). The field itself is unchanged by the role; the way reads it.

To a game engine: a number, with whether decimals were allowed carried beside it so generated code can declare an integer or a floating-point member. The three-state detail is on the payload page.

A Meter or a Gauge with no range, a Ring with no upper bound, or Pips with a maximum outside 1 to 10, falls back to the default row silently. Nothing but the box enforces the range — a value written by an import or the assistant is not clamped.

Boolean

OptionKeyWhat it doesDefault
Labels … /trueLabel / falseLabelWhat the switch, and the State dot, say when on and offYes / No
Shown asreadingState dot — a state you scan rather than a switch — or Tick box, the checklist’s square alone, flipped by one clickControl · default

On the canvas: a switch; a single click toggles it. Boolean has no Placeholder, no Show border and no Value style.

To a game engine: true or false.

Date

OptionKeyWhat it doesDefault
Include timeincludeTimeThe picker takes a time as well, and the card shows itoff
Range … tominDate / maxDateEarliest allowed date / Latest allowed date — the picker’s boundsblank
Shown asreadingWord — the date as bare text; Stat — the date at title size under a small captionControl · default

On the canvas: the date, formatted in your browser’s locale; a click opens a calendar. The formatting is display only — what is stored, and what a game receives, is the timestamp.

To a game engine: a string — the stored timestamp.

Time

A time of day — hours and minutes, HH:MM on a 24-hour clock (18:30, 02:40) — with no day attached: a Date says which day, a Time says when in one. It has no options of its own beyond the ones every field has.

OptionKeyWhat it doesDefault
Shown asreadingWord — the digits as bare text; Pill — the digits as a mono pill; Clock — a clock face with its hour and minute hands, the digits beside it and the part of day as a small word when it is not daytime (dawn, dusk, night), the face tinted by it — amber at dusk, dark at nightControl · default

On the canvas: the digits; double-click opens a box in place, where a loosely typed time (7:5, 18.30) is normalised to HH:MM when you leave it. A value that is not a time is not stored.

The same type is offered on entity definitions, variables, command parameters and spreadsheet columns, with the same HH:MM value everywhere. It sorts and compares as text — 09:00 before 18:30 — so a condition can compare two times directly.

To a game engine: the stored HH:MM string under a field kind of its own, read as a typed time-of-day value — a TimeOfDay struct in the Unity plugin, its twin in the Unreal one; on a play step a value that does not parse reads as absent, not as midnight.

Asset

A media item — an image, video, audio clip or document from the Media section — or a gallery of them. An audio file here is a sound effect in Play and in a game engine: it plays once when the story shows the node (Sound on a node). Every other kind is drawn, never played.

OptionKeyWhat it doesDefault
Multiple (gallery)multipleA list instead of one itemoff
Max itemsmaxItemsCaps the list; a longer list committed on the card is truncated to it. Offered while Multiple is onUnlimited
AcceptsallowedTypesChips Images · Video · Audio · Documents · Other — what the picker offers. None selected means anyany
DisplaydisplayVariantPills (with name) pills · Thumbnails only thumbnails · Large preview preview · Cover (edge to edge) cover · Fill the cell (crop) fill. Steps aside under a Portrait, which replaces the chipsPills
Shown asreadingChips — the chips with their box gone; Name only — the chip’s name alone, its picture gone; Avatar — the chip with a round picture; Picture and name — the picture as a square tile beside its name, or, with the Picture row beside it set to Banner, a wide strip across the card with the name over its foot; Portrait — the picture filling the width, cropped to a portrait about its focal point (a click on the picture in its media tab); Map — the picture at its own proportions, carrying the node’s Position and Area fields as pins and boxes (a spot whose row names a record shows the record’s face), its doors, and a legend of the places — see MapControl · default
LegendlegendWhere the map’s list of places sits: Below below — under the picture, the lines wrapping (one per line once the rows carry a caption); Beside beside — in a column to the picture’s right, the picture narrowed to make room, each place on its own line with its caption under the name. Offered while Shown as is MapBelow
When emptystandInThe id of one of the type’s node-level single Entity fields whose own picture fills the portrait frame (or the avatar’s round face) while this picture is empty — a Portrait line’s Speaker, so the ordinary line needs one pick and a picture is picked only when the line wants a different face. A picked picture always wins; with nobody picked in the named field either, the frame is hollow. Offered while Shown as is Portrait or Avatar on an Asset field; never picked for you — a scene picture beside a character keeps its hollow frame unless you say soNothing — the empty frame
Thumb sizethumbSizeThumbnail edge in pixels, in steps of 4. Offered for Pills and Thumbnails32
Round thumbnailthumbShape: "circle"A portrait-style circular crop instead of a rounded squareoff

On the canvas: chips or thumbnails; a click opens the media picker, and a media item can be dropped onto the field. In a gallery the chips can be dragged to reorder and removed one by one. A single picture is cleared from the picker itself: while the field holds one, a None row leads the list — the same row every reference picker on the card leads with.

To a game engine: a media reference — the id and the URL where the bytes are — or a list of them. The stored value is the item’s id, never its code, so renaming a media item never strands a field (media codes).

Cover and Fill need the media item’s stored dimensions; an item without them draws in a square box.

Entity

An entity item — a character, a place, an object — or a list of them.

OptionKeyWhat it doesDefault
Multiple (entity list)multipleA list instead of one itemoff
Max itemsmaxItemsCaps the list; a longer list committed on the card is truncated. Offered while Multiple is onUnlimited
AcceptsallowedEntityDefinitionsOne chip per definition in the project; the picker offers only those. None selected means anyany
DisplaydisplayVariantPills (with name) · Thumbnails only · Cover (edge to edge) · Fill the cell (crop) — no large preview for an entity. Steps aside under a Cue, a Portrait or a View, which replace the chipsPills
Shown asreadingChips; Checklist — a multi-value reference as ticks, one per record, the tick that record’s own first yes/no field, k / n above; Cue — the name in caps with the definition’s name under it, a screenplay cue; Name only — the chip’s name alone, its picture gone; Avatar — a round picture beside the name; Picture and name — a picture row: the picture as a square tile, the name beside it, the definition’s name under it — or, with the Picture row beside it set to Banner, the picture as a wide strip across the card with the name over its foot (the premade Barrier); Portrait — the entity’s picture filling the width, cropped about its focal point; View — the entity’s whole record through one of its definition’s saved views, read-only, a click opening the itemControl · default
ViewviewIdWhich saved view a View draws through — every accepted definition’s views, named Definition · View when more than one definition has some. Offered while Shown as is View; a definition with no view is said so under the rowDefault view · default — the item’s definition’s default view
Counts againstchecklistTotalFieldThe id of one of the type’s node-level Number fields whose value is the checklist’s total: its k / n counts the ticked records against that number instead of against how many are listed — five fuses on the list, a Need of 3, 0 / 3. With the number left empty on a node, the list’s length. Offered while Shown as is Checklist; never picked for you; a type with no number field is told so in the rowHow many are listed
Use this entity’s colour for its sectiontintContainerPaints the section the field sits in (the header band for a header field) with the held entity’s colouroff
Colour the whole nodetintScope: "node"Off = tint only the section this field sits in. Offered while the tint is onoff
Thumb size / Round thumbnailthumbSize / thumbShapeAs for Asset32 / off

On the canvas: chips, or the entity’s picture as a cover; a click opens the entity picker, and an entity item can be dropped onto the field. Shown as a View, the record on the card is read-only and a click still opens the picker; rest the pointer on the node and an open button appears at the record’s corner — that is what opens the item. To take the entity off again, open the picker: while the field holds one, a None row leads the list (a multi-value field removes from its chips instead). Every reference picker on the card — entity, picture, document, variable, tag, node, board — leads with that same row; in the node’s dialog and in forms the trigger carries a ✕ instead.

An empty picker points at the pack that fills it. When a field that Accepts only certain definitions has nothing to offer — the project holds no record of any of them — and a library pack brings records of one of those definitions, the card’s picker says so in place of its list: No input actions yet · Add the Input actions pack, with Open it in the Library, which closes the picker and opens the library on that pack. It asks by the definition’s code, so any such field gets it, not one card. With no such pack, the picker reads No entities found as before. The node’s dialog and forms show the plain empty state.

To a game engine: an entity reference by id — the entity’s field values are resolved when the game reads them, because a script may have changed them since the payload was built.

When two tinting fields share one container, the first wins. A per-node colour override wins over the tint, and the tint wins over the type’s own colour.

Entities with counts

Entity items with a count each — what an outcome hands the player, what a recipe needs, what a chest holds. The value is a list in your order: Regenerative Gel Pack ×2 · Med Crate ×1. An item may appear more than once — two Gel Pack lines at 1 each and one line at 2 both mean two, and the card draws each as you wrote it; nothing merges them. A count is a whole number of at least 1; to hand over none, remove the line. An entry may also carry the cell it sits in (slot, a whole number from 0): a chest is a grid with positions, and the cell you put an item in is where it stays — and where the game finds it. An entry with no cell takes the first free one.

OptionKeyWhat it doesDefault
AcceptsallowedEntityDefinitionsOne chip per definition in the project; each line’s picker offers only those. None selected means anyany
EditoritemsLayoutLines — A line per entry — the record, its count, a remove — and Add under them. The default. · Grid — A tile per entry — the record’s picture with its count in the corner — and an empty tile to add. The grid is the cells in order: a filled cell is the entry’s tile — a click opens that entry’s line in a popover, the × on its shoulder removes it — and every hollow cell is a + that adds into that cell: the pick lands there with ×1. With a capacity the lines list the entries in cell order, each with its cell number (#2) before the picker; + Add takes the first free cellLines
Gridcolumns · maxItemsThe chest’s shape, Columns × Rows. Columns fix the width — the cells lay out that many to a row on the card and in the editor’s grid, whatever the node’s width, so the third cell of the second row is always the same cell. Rows with them fix the capacity (maxItems = columns × rows) — a hard ceiling: an empty chest of 4 × 2 is eight hollow cells, each a place to add; a filled cell keeps its place when its neighbours change; and once every cell is filled there is nowhere to add — no hollow in the grid, and the add line reads Full · 8 / 8. Nothing can be placed past the capacity. A list already longer than the capacity is kept whole and drawn whole — the entries the grid has no cell for are drawn on a strip under it; only adding is refused. Rows wait for Columns; leave Rows empty for an unbounded chest that wide, and both empty for one that wraps at the card’s width and ends in one hollow cell, the add — its lines are then a plain list with no cell numbersempty
Shown asreadingSlots — a tile per line, the item’s picture with ×n in its corner; a hollow tile for an item with no picture, a red one for an item the project no longer has; on the card’s own grid the tile is 32px, in a repeater row’s cell 26px · Sentences — what the records say: each record’s description with the line’s count filled in ({n} the count, {n|one|many} a word picked by it), on one flowing line; see Shown as. · Chips — each line as its record’s chip, picture and name, the count after the name only past one; a record the project no longer has reads Missing item. A field shown as sentences or chips is not a chest: a click opens its cardSlots

On the canvas, a node-level field shown as Slots is a chest edited in place, and its cells are the whole editor: a click on any cell opens that cell’s panel — the record list with a quantity box above it. On a hollow cell the pick lands there with the quantity shown (1 unless you set it first); on a filled tile the panel opens on its record — a new pick swaps the record and keeps the cell and the count, the quantity box changes the count, and the clear row at the top of the list empties the cell. The panel stays open through all of it, so you pick and then set how many without reopening anything; it closes when you click elsewhere or press Escape. While the node is selected each filled tile also wears a × that clears its cell. The strip beside the tiles does nothing; the field’s card — the same grid, or the lines, as Editor says — is in the node’s own edit dialog. A field with no Grid draws its entries in order and one hollow cell to add into. In a repeater block the items are a hand-over list, not a chest: the click opens the whole row’s card, so the row is written in one place. On an entity item’s form the field’s editor is the control, and its definition’s field config offers the same Editor and Grid choices; in the entity grid the cell reads the list as text and is edited in the item view.

To a game engine: the items’ references, their counts and their cells, in your order, on the field — the cell the card shows each item in, or none for an item the grid has no cell for — with the chest’s Grid beside them on the field’s declaration (maxItems and columns, so a cell n is row n ÷ columns, column n mod columns) — and, when the field sits on a row that is an exit, on that exit as items, handed to the game when the exit fires (a Loot roll’s outcome). The engine keeps no inventory; a game with a grid inventory seats the items where the writer put them, a game without one ignores the cell. The assistant never writes one.

Select

One value from a fixed set, or several. The set comes from one of four sources.

SourceKey it writesMultipleWhat is stored
Enum (single)enumRef — the enum’s idnoThe chosen option’s value token
Bitmask (multiple)bitmaskRef — the bitmask’s id; sets multiple: trueyesA list of value tokens
Inline optionsoptions — rows of value, Label and a colour, added with Add option; and multiple when its Multiple switch is onyour choiceThe chosen option’s value token, or a list of them
From a sibling entity fieldoptionsFrom — { field, path }: field is the code of an Entity field beside this one, path the name of a field on the entity that field holdsno switch is offered; whatever the field had is keptThe chosen option’s value token — one of the entity’s select values, or one entry of its text field

Enums and bitmasks are project objects, edited in the Variables section and reusable across types — see enums and bitmasks. Inline options live only on this field. A sibling-fed select has no list of its own: pick a character in the Entity field beside it, and this select offers that character’s expressions — a select field on the entity gives its values, labelled through the entity definition’s own options; a text field gives one option per line or comma-separated entry.

OptionKeyWhat it doesDefault
Sourcesee aboveEnum (single) · Bitmask (multiple) · Inline options · From a sibling entity field. Switching clears the other sources’ keys. With no enum in the project the enum picker is replaced by No enums defined yet. Create one in the Enums section, or switch to inline options.; the bitmask picker likewiseEnum
OptionsoptionsThe inline list, shown as soon as Inline options is chosen: value, Label and a colour swatch per row, Remove option, Add optionempty
MultiplemultipleSeveral options can be chosen; the node shows them as pills — inline options only. An enum is single and a bitmask multiple by what the definition isoff
Sibling / FieldoptionsFromShown as soon as From a sibling entity field is chosen. Sibling lists the Entity fields beside this one (inside a repeater block, the block’s own); with none there, the note Needs an entity field beside this one — add one, and its item's field will supply the options. takes its place. Field is the name of the entity’s field that supplies the list, typed as it is spelled on the entity definition, e.g. expressionsboth blank
Shown asreadingWord — the option’s label as bare text; Pill — as a mono code pill; Stat; Badge — the option’s own pill in its colour, single-value only; Chips — a multi-select’s pills with the box goneControl · default

On the canvas: a pill, or one pill per chosen option; a click opens the option picker.

To a game engine: the token string, or a list of tokens for a bitmask or a multiple inline select. A select backed by an enum carries the enum’s reference, so generated code can offer a typed enum member; a select with inline options carries no reference and produces a plain string.

Things worth knowing before you choose a source:

  • A multi-value select is a bitmask or an inline list with Multiple on. An enum is always single; a bitmask is always multiple; only the inline source lets you choose.
  • Option colours come from the definition for an enum or bitmask, and from each row’s swatch for inline options. The Badge presentation and the pills use them.
  • An inline list wins. If a pasted definition carries both options and an enumRef, the card draws the inline list. The builder never produces that combination.
  • Nothing checks the option rows. An empty value, or two rows with the same value, is accepted as typed.
  • Max items is not offered for a select.
  • A value that is not in the current list — after a source switch, or an option was removed — shows as its raw token; the assistant’s validator reports it as not an option. A select whose enum has been deleted shows its placeholder.

Color

No type options; the swatch is the whole control.

OptionKeyWhat it doesDefault
Shown asreadingSwatch — the square alone, no hex text; Colour band — the colour painted as a full-width band. Both need a valid hex valueControl · default

On the canvas: a swatch; a click opens the colour popover. Stored as a hex string such as #3366cc.

To a game engine: the string.

Vector3

The three axes are fixed; the one option is how the value reads at rest.

OptionKeyWhat it doesDefault
Shown asreadingWord — the three numbers as bare text, no boxesControl · default

On the canvas: three boxes, x, y and z, each stepping by 0.01; double-click to edit.

To a game engine: three numbers, [x, y, z], which the plugin exposes as its own three-component vector so you convert to the engine’s type at your edge.

Position and Area

A place on one of the type’s pictures — a Position is a point, an Area is a box. The picture is an Asset field on the node (not in a repeater block, not a gallery); the value is normalised to it — 0 to 1 across and down, from the picture’s top-left corner — so re-uploading the picture at another size moves nothing.

OptionKeyWhat it doesDefault
PicturepictureFieldWhich of the type’s pictures the place is on. With one picture on the type it is preselected; with several you pick; with none the row says add a single asset field at node level first and the field cannot be placedthe type’s only picture

On the canvas: the value is dragged on the picture, or typed as its exact numbers in the row’s card and the node dialog (x y, and w h for an area — fractions, four decimals). Show the picture as a Map and every Position becomes a numbered pin on it, every Area a dashed box with a grip at its bottom-right corner — drag the pin, drag the box to move it or its grip to size it. A Position or Area in a repeater block is one pin or box per row, numbered in the rows’ order, with the block’s first text as the pin’s name in the legend under the picture (or beside it — the picture’s Legend setting). A spot whose row also has a record — an Entity field in the block — shows the record’s face as its pin, round, its number in a small badge, and a count (×3) when the row has a Number; the legend then adds the record’s name after the row’s. Every pin, face and box is listed — the name alone, and under it the block’s second text as a caption when the block has one; a door is not listed, its pill is its word. Until dragged, a pin waits near the picture’s centre — the first on it, the next ones on a small spiral around it so a type with six spots lands six pins you can tell apart — and a box as a centred square, all dimmed. A double-click on an empty part of the picture adds a row with its pin already there; a box dragged on an empty part adds a row with those bounds. The field’s own cell — in a list, a table column — is a read-only readout (x 0.26 · y 0.64).

A Position in a block that also has an exit handle makes the rows doors — see Map: the row draws as a pill on the picture instead of a pin, its port the pill’s dot, and a double-click on an empty part of the picture still adds a pin, never a door (a door is added like any row — the block’s Add button). The block’s first Position is the door’s point; a second one is a pin of that row as before.

To a game engine: the numbers as stored — {x, y} or {x, y, w, h}, each 0 to 1 — plus which picture they belong to, so the plugin can scale them to the box it draws the picture in. The assistant never writes one.

Code

Expression-language source. One option decides what the field means.

OptionKeyWhat it doesDefault
Single expressionexpressionOnlyOff: the field is the node’s script, run when the story arrives — several script fields on one node run in order. On: the field holds one expression, and it is a gate when it sits in a row or repeater block that has an exit; on its own it does nothing at playoff
Keep to one linesingleLineNever wrap; scroll sidewaysoff
Skill check controlcontrol: checkOn a script field only. The node dialog edits the script as a skill check — stats (one or several, added or best-of), a die, a difficulty, modifiers — and writes the script for you; on the card the field reads as the check in words and opens as the usual code editor on click. The script stays the source: edit it as code and the control steps aside until the text is a check againoff
Min height / Max height / Fill body & scrollminHeight / maxHeight / fillBodyAs for Rich textauto / blank / off
InsetpaddingField padding in pixels, 0 to 408
Shown asreadingPill — the code at rest as a mono pill (the editor opens as usual on click); Ledger — a script (not a single expression) as what it changes, a stamp per statement, a click opening the row’s card — see Shown asControl · default

On the canvas: a code editor in place, highlighted and validated against the expression language. The editing mode is not configurable. The node dialog edits a Single expression field with the visual condition builder, and a Skill check control field with the check control; it does not edit any other script.

To a game engine: a script becomes a compiled program the runtime executes; a single expression becomes an expression. Both keep their source text. What a script may do is scripts on a node; what a gate may do is conditions and gates.

Condition

A gate, by construction. It has no type options — a condition is authored in the node dialog, not configured in the builder — and two presentations: Shown as Pill draws the expression as a mono code pill at rest (the default on a list, a table or a strip), and In words reads it as a sentence — [Ryn Zhao] hacking at least [3] — printing as written anything that is not a simple run of terms (Shown as has the rules).

On the canvas: the expression, highlighted, read-only. It is edited in the node dialog with the visual builder, which is why a type carrying one needs an Edit this node's fields action (see how a field is edited). Editing is fixed to In dialog.

To a game engine: an expression, with its source text.

Reference fields

Six types hold a link to another object in the project. All six can be Shown as Chips — the chip with its box gone, the default on a list, a table or a strip.

A node on any board. The one type not available on an entity definition.

OptionKeyWhat it doesDefault
DisplaydisplayVariantChip (with name) pills · Target summary preview — the target’s own preview text, board name, picture and colourChip
Use the target’s entity colour for its sectiontintContainerTints the section with the colour of the entity on the target nodeoff
Colour the whole nodetintScope: "node"Offered while the tint is onoff
Thumb size / Round thumbnailthumbSize / thumbShapeAs for Asset32 / off

On the canvas: a chip or the target’s summary; a click opens the node picker. The editing mode is not configurable, and the node dialog does not edit a node link. Four states are drawn distinctly: empty · the target cannot be resolved yet · the target is gone · live.

To a game engine: a node reference — the node id and, for a target on another board, the board id.

Whether a node link moves the story there is not a builder setting. It is set in play mode’s designer, which writes role: "jumpTarget" and returnAfter on the field; see play mode.

No type options — a board link points at a board, and there is nothing to restrict.

On the canvas: a chip with the board’s colour dot; a click opens the board selector. To a game engine: a board reference. A board link can also carry role: "jumpTarget" from play mode’s designer.

OptionKeyWhat it doesDefault
AcceptsallowedDocKindsAny document · Documents only (["richtext"]) · Spreadsheets only (["spreadsheet"])Any document

On the canvas: a chip whose glyph says page or grid; a click opens the document picker. To a game engine: the raw id string — there is no engine-side document kind. See documents and spreadsheets.

OptionKeyWhat it doesDefault
Multiple (variable list)multipleA list of variables instead of oneoff
Max itemsmaxItemsCaps the list; the picker stops adding at it. Offered while Multiple is onUnlimited
Hide icon once selectedhideSelectedIconDrop the type glyph once a value is pickedoff
AcceptsallowedVariableTypesWhich variable types the picker offers — tick none for anyany
Allow a typed nameallowTypedNameAccept a name typed into the picker, as well as a pick. Hidden while Multiple is onoff

On the canvas: a chip showing the variable’s code — what you would type in a condition — with its label as the tooltip; a click opens the variable picker. The field stores the variable’s id, so the link survives a rename; to a game engine it arrives resolved to the name: the variable’s code, and its context’s code beside it, so a handler can compare either or join them into context.variable. A link to a variable the project no longer has arrives as nothing at all.

Accepts is how a type says what it wants without naming anything that changes. A card whose From field means which place this comes from ticks Text, and the author keeps the places themselves in a context per level — Level1.spawnPointInitial — so a new level is a new context and the type never changes. Ticking nothing offers every variable. See variables.

Allow a typed name is for the sketch. With it on, the picker’s search box offers a Use “…” row: whatever you typed becomes the value, and the field stops needing a variable to exist first — write the loading bay now, pick Level1.loadingBay when the level does. A typed name is drawn on the card as plain words, a pick as the variable chip, so you can always see which of the two a node holds.

To a game engine, a typed name arrives as the field’s text, with no reference. The rule a handler follows is: the reference’s name if there is one, else the field’s text.

Multiple makes the field a list of variables — a keep list, a watch list. On the canvas each variable is its own chip, in your order; a click opens the picker, where picking a variable already on the list takes it off and picking any other adds it at the end. In the node’s form the list is a row of pills you can reorder and remove. To a game engine it arrives as one variable reference per item, in order — a variable the project no longer has is left out — read with VariableList() in Unity and Get Variable List in Unreal; generated code types it as a list of ids.

OptionKeyWhat it doesDefault
Hide icon once selectedhideSelectedIconAs aboveoff

On the canvas: a chip with the tag’s colour dot; a click opens the tag picker. To a game engine: a tag reference — id and label. A tag with no label is dropped from the payload rather than sent as a bare id. See tags.

Command call

A command and its arguments, stored as data — the game decides when, or whether, to dispatch it.

OptionKeyWhat it doesDefault
Hide icon once selectedhideSelectedIconAs aboveoff
ArgumentsargLayoutHidden — The command chip alone — arguments are edited in the panel. The default, and the only correct drawing for a command that declares no parameters. · Signature — One read-only line, playSound("door", 0.8). Costs no height, but it is positional and truncates from the right. · Inline — Arguments run across the card and wrap. Cheapest labelled layout; a long value truncates before a short one does. · Rows — Arguments run down the card, one field row each. The most legible and by far the tallest.Hidden
LabelsargLabelsAbove · Beside · None — where a parameter’s name sits. Offered for Inline and Rows; under Hidden the caption reads Arguments are edited in the panel, not drawn on the card., under Signature A signature line is positional — it has no labels to place.Beside
Command leads the rowargCommandInlineIn the Inline layout, the command chip leads the strip instead of sitting above iton

On the canvas: the command chip and, per the layout, its arguments; a click opens the command panel, where each argument is a literal or a variable. Arguments are keyed by the parameter’s id, so renaming a parameter never strands them. An argument whose stored value no longer matches its parameter’s type is drawn as unresolved, never dropped. Hidden is forced for a command with no parameters, or one that no longer exists.

To a game engine: the field is typed as a command reference — the command’s code and its arguments in declaration order. As of this writing, a stored command call does not arrive in it: the engine receives the field empty, so do not build a game mechanic on a command call field until that is fixed. Calling a command from a Code field’s script does reach the game.

Changing a field’s type

Changing the type destroys nothing. A value that no longer fits its field reads as empty and is parked, keyed by the field and its old type; change the type back and it returns. The type-specific options, Shown as and the editing mode are reset by the change, so set them again. Removing a field parks its values too — and adding a field with the same code and type later shows A field with this code and type was removed. Its content is still stored on every node — reclaim it, or it stays unused until the next cleanup. with a Reclaim removed data button. Only Clean unused data…, with its confirm Clean unused data?, deletes a parked value. The full mechanism is on the index page.

What each type reaches

TypeA game engine receivesIn the translation exportIn the AI’s search index
TextA stringWhen TranslatableYes, as Label: value
Rich textHTML and plain text per language; the default language’s plain text as the valueWhen TranslatableYes
Booleantrue / false——
DateA string——
TimeThe HH:MM string, read as a typed time of day——
NumberA number, plus whether decimals were allowed——
AssetA media reference: id and URL; a list when Multiple——
EntityAn entity reference by id; a list when MultipleThe speaker’s name, when it is the first entity fieldYes, as the entity’s name
SelectThe token; a list of tokens for a bitmask; an enum reference when backed by an enum——
ColorA string——
Vector3[x, y, z]——
CodeA compiled script, or an expression; the source text—Yes, scripts as code
ConditionAn expression; the source text—Yes, as the gate it is
Node linkA node reference: node id and board id——
Board linkA board reference——
Document linkThe raw id string——
Variable linkA variable reference: its id, its code, and its context’s code or nothing; absent when the variable is gone; a list when Multiple——
Tag linkA tag reference: id and label; dropped without a label——
Command callTyped as a command reference; arrives empty today——
Entities with countsThe entity references in order, and the counts beside them; on an exit’s row, also the exit’s items——

The engine-side vocabulary — one field kind per type, the narrow reference structs, and the rule that an unknown kind is a diagnostic rather than an error — is the step reference and the payload in the Unity plugin’s documentation. The Unreal plugin, still in development and not yet released, reads the same payload and documents its own typed layer at its manual.

Keys the format accepts that the builder does not offer

A definition you paste may carry these; on a node they are kept and ignored. The builder never writes them.

KeyOn a node
rows (text)Ignored
numberFormat, displayDecimals, useGrouping, currencyCode (number)Display formatting for grids and exports; the card shows the plain value
dateFormat (date)The card formats by your locale instead
precision (vector3)Ignored
step (vector3)Honoured per axis, but not authorable here — the builder fixes the axes
defaultValue, allowCustom, allowAlphaEntity-field keys; not part of a node field’s configuration at all

Limits

WhatLimitEnforced by
Text lengthMax length, if setThe text box, on the card and in the dialog. Nothing else in the editor enforces it
A number’s rangeRange, if setThe box clamps when you leave it. Nothing else in the editor enforces it
Items in an asset or entity listMax items, if setThe card truncates the committed list. Not enforced for a select
Entries in an entities-with-counts listGrid’s capacity (Columns × Rows), if setThe editor refuses to add past it. A longer list is never cut — it is drawn whole and reads Full
Pips1 to 10The card draws the control instead outside it
Row span8 rowsThe Rows menu stops there
Inset on a Text, Rich text or Code field0 to 40 pixelsThe Inset box
Number of options, fields, list itemsNoneNothing caps them

What breaks

SituationWhat happens
Two fields share a Code (or differ only by case or underscores)The builder re-codes a typed duplicate as you commit it; a paste, an archive or two people editing at once can still produce one. It shows a red duplicate hint and the banner N export-code problem(s) naming "x" is already used — and within a couple of seconds the later field is re-coded (_1) and a notice says so, by whoever has the project open with edit rights (or when it is next opened)
A Code is not a valid identifierThe same banner, "x" is not a valid identifier. Advisory
A field is In dialog and the type has no Edit this node's fields actionThe banner ‘X’ is edited in a dialog and nothing opens it, with a button that adds the action; the field cannot be edited anywhere until it exists. A field inside a repeater block is named the same way
A Condition or a Single expression Code field sits outside any row or block with an exitIt gates nothing and does nothing at play
A Meter has no range, or Pips exceed 10The control is drawn instead, silently
Shown as names a way the type does not haveIgnored; the region’s default is drawn
Shown as names a way the region cannot draw (a portrait in a table cell)The region’s default is drawn, and the row says why
A select value is not in the current listThe raw token is shown; the assistant’s validator reports it
A select’s enum or bitmask is deletedThe card shows the placeholder; stored tokens are kept
A sibling-fed select names an Entity field that is not beside it, or its Field is blankThe type’s validator records a warning that the list would be empty, but nothing refuses it and the builder shows no banner for it: on the card the select opens with nothing to pick until the sibling holds an entity whose named field has values
A stored value does not fit the field’s type (after a retype, a paste or an import)It reads as empty and is parked, never deleted
A field is removed from the typeIts values are parked; re-adding a field with the same code and type offers Reclaim removed data
A tag link points at a tag with no labelThe engine payload drops it
A node link’s target is deletedThe card shows the “target is gone” state; the id is kept
A field’s type is one this version does not know (a pasted definition from a newer version)The cell is empty on the card; the engine reads it as an unknown kind, keeps the raw type name and raises one diagnostic per unknown name

Nothing here refuses a write. The builder autosaves on every keystroke and tells you with a banner, a hint or a fallback drawing. When a node looks wrong, read the banner across the top of the type’s tab first.

Written for
Writers · Unity developers · Advanced integrators
Last updated