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 global blueprint open in the editor: two nodes joined by an edge, with the graph's layers and variables listed beside it

Every blueprint answers three questions before you place a single node: who owns it, what kind of graph it is, and therefore 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 projectthe 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
sharedAsseta shared blueprint assetwhatever imports it
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.

Graph kinds

Each graph declares a graph kind, and the kind is a rule set, not a label.

KindEffectful nodesEntry nodeBindable from widget UI
eventallowedan event head (Init, On Click, …); not mandatoryyes
functionnot allowedFunction Entry, requiredno
macroallowednone requiredno

Latent nodes — anything that suspends the graph, such as Delay or a save write — cannot appear in a function graph. A function returns synchronously to whoever called it and has nowhere to hand a pending result.

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.textprops.text, nl.buttonprops.label, nl.frameprops.params, and nl.sliderprops.value.

Its palette is deliberately narrow: event heads, non-latent flow, pure Data and Math, local variable access, Element literals, and pure reads. No mutations, no navigation, no persistent variables, no latent nodes. A value provider that could change the world would re-enter itself the moment the world changed.

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