NarraLeaf

Blueprint

The visual programming layer — what a blueprint is, where one lives, and what it is allowed to do.

A blueprint is a visual program: nodes joined by edges, executed by the game runtime. Blueprints are how a project gets behaviour without code — a button that opens a screen, a menu that lists saves, a title screen that knows whether there is anything to continue.

A blueprint is not the only way to fill a slot. A slot holds a list of layers, and a layer can be a script instead — a TypeScript file the project owns, edited outside Studio. Every layer runs, so a script can sit beside a graph in the same slot. Scripts covers where those files live and how one is entered.

The App logic blueprint open in the editor: two nodes joined by an edge, with the graph's layers and variables listed beside it

Every blueprint answers one question before you place a single node: who owns it. The answer decides which nodes the palette will offer you.

Owners

The owner is where a blueprint lives. It decides the blueprint's lifetime and what it can reach.

OwnerBelongs toLives as long as
globalMainthe project, listed in the UI panel as App logic, which earlier versions called the global blueprintthe application
surfaceMainone Surfacethat Surface's instance
widgetMainone widget instancethat widget instance
widgetValueone property of one widgetthe binding that owns it
componentWidgetMaina reusable component widgeteach instance of the component
storyActionone story blueprint, in action, value or condition modethe row that calls it

A widgetMain blueprint acts on its own widget through Self nodes, which take no Element input. To act on a different widget you wire an Element reference into an Element node. That split runs through the whole node catalog, and it is the first thing to understand about the palette.

Blueprint Value

A Blueprint Value is a widgetValue blueprint bound to one property, so the property is computed instead of authored. The current targets are nl.text → props.text, nl.button → props.label, nl.image → props.imageFill.assetId, nl.switch → props.checked, nl.frame → props.params, and nl.slider → props.value.

Its palette is deliberately narrow: the Init and On Flush heads, non-latent flow, pure Data and Math, local variable access, Element literals, and pure reads. No mutations, no navigation, no persistent variables, and no latent nodes (anything that suspends the graph, such as Delay or a save write) other than Call Fn. A value provider that could change the world would re-enter itself the moment the world changed.

For words in the player's language, Translation Key Text gives a translation key's words and Format fills values into them. A Blueprint Value that reads the player's language updates when the player switches language, whether it reads it through Translation Key Text or a per-language asset, or through Get Text, Get Current Language or Get Save Metadata in a function it calls.

While a Text's content or a Button's label is bound, the widget's own words are sample text: drawn in the editor only, not built into the game and not translated. See Interface text.

The editor canvas is a layout tool. It resolves enough of a blueprint to preview a value binding, but it runs no game — nodes that need a running playthrough have nothing to talk to there. Verify blueprint behaviour in Dev Mode.

Where to go next

To ship your own nodes instead of using the built-in ones, see blueprintNodes in the plugin API.

On this page