All 44 Blueprint node types, with complete examples
Concrete configurations and downloadable validated graphs for every NODE_TYPES entry, from event to cooldown.
One example for each node.type
These 44 types come from NODE_TYPES in the documented revision. Every link provides a complete validated Blueprint v2 document with a path that reaches the sample node. The displayed snippet is the central node; the download includes its event, connections and required consumers.
These JSON files describe the stored Blueprint v2 subdocument. They are development fixtures, not an installable module, a complete Builder project or a campaign archive. Recreate the nodes in the editor, or use the fixtures in isolated contributor tests. This guide does not assume a JSON import button in the Smart Object editor.
Download the complete example bundle or the validator. Every example uses original synthetic data. The host's internal Python evaluator is for source development; browser modules must use the public SDK.
| node.type | Role | Concrete use | JSON |
|---|---|---|---|
| event | execution | Start the interact graph; then request state:open. | Complete graph |
| light | action | Enable a chosen native light by targetId; dynamic lighting must be available. | Complete graph |
| sound | action | Play the chosen campaign sound at volume 0.5. | Complete graph |
| state | action | Set the door to open; no extra event is emitted. | Complete graph |
| interact | action | Request a referenced door’s interaction; the server executes the queued chain and enforces its limits. | Complete graph |
| condition | branch | Check closed and choose true → open. Connected Test overrides the fallback state check. | Complete graph |
| sequence | execution | Run then1 → open; append then2–then4 for ordered actions. | Complete graph |
| sprite | action | Use a campaign image on a compatible door/image Target; preserve the authored box. | Complete graph |
| property | value | Read starting state → compare closed → condition → open. | Complete graph |
| compare | value | Return whether the state is closed; its Boolean result feeds condition.test. | Complete graph |
| reference | value | Send an element UUID from door to a state action’s target input. | Complete graph |
| reveal | action | Reveal a secret door; use a compatible door target. | Complete graph |
| barrier | action | Let movement pass through a door without changing its other barrier channels. | Complete graph |
| soundControl | action | Stop a selected track; choose volume for an explicit volume adjustment. | Complete graph |
| flame | action | Light a composed torch’s configured enabled components; preserve its mechanism. | Complete graph |
| all | value | Require two connected closed comparisons to be true; fewer than two inputs returns false. | Complete graph |
| any | value | Accept either of two closed comparisons; at least two inputs are required. | Complete graph |
| getVariable | value | Read Boolean element variable ready, default true → condition → open. | Complete graph |
| setVariable | action | Store Boolean ready=true in the element scope. | Complete graph |
| compareValue | value | Compare a Boolean value to false; an unconnected Boolean Value defaults to false. | Complete graph |
| emitEvent | action | Queue signal:ready on Self; the included receiver requests state:open. | Complete graph |
| delay | execution | Wait 3 seconds before open; the evaluator exposes a continuation, the server schedules it. | Complete graph |
| timer | action | Start a 3-second one-shot timer whose expiry emits signal:ready. | Complete graph |
| switch | branch | Match text open to case1 → open; unmatched values use default. | Complete graph |
| random | branch | Choose between two equally weighted branches; local deterministic evaluator defaults to branch1. | Complete graph |
| elementGroup | value | Send two ordered door UUIDs to a state target; the runtime resolves each member. | Complete graph |
| lightReference | value | Bind a native light through light → light.target. | Complete graph |
| soundReference | value | Bind a sound through sound → sound.target. | Complete graph |
| eventContext | value | Read trusted occupancy count → numeric comparison1 → condition → open. | Complete graph |
| move | action | Move a compatible element one grid cell on x; dx/dy are cell units. | Complete graph |
| rotate | action | Rotate a compatible element 90 degrees; region rotations must be multiples of 90. | Complete graph |
| setInteraction | action | Enable direct player interaction for a compatible door or mechanism. | Complete graph |
| setRegion | action | Enable presence detection on the region owner; a door Target is incompatible. | Complete graph |
| setVisibility | action | Show artwork on a compatible visual Target, without changing mechanism state. | Complete graph |
| setAppearance | action | Choose a material for a compatible dynamic surface Target; preserve its base restoration data. | Complete graph |
| showMessage | action | Show original text to the trigger audience after server authorization. | Complete graph |
| showHandout | action | Present an existing authorized journal to trigger; use a real campaign journal ID. | Complete graph |
| requestRoll | action | Ask the trigger to roll 1d20+2 with a public result. The recipient chooses Roll; the graph continues without a result branch. | Complete graph |
| setQuestStatus | action | Request active status for an existing campaign quest through a GM-authored action; this grants no general journal editing permission. | Complete graph |
| cameraFocus | action | Focus trigger’s camera at 25%, 40% scene coordinates. | Complete graph |
| teleport | action | Move the verified trigger token to a compatible same-scene destination; requires token context. | Complete graph |
| counter | branch | Pass on the second event, preserving memory between runs. | Complete graph |
| once | branch | Pass once, then choose false on subsequent events with the same node memory. | Complete graph |
| cooldown | branch | Pass immediately, then block for 10 seconds using the server clock. | Complete graph |
Use and verify the examples
In the editor, create a compatible owner and the nodes from the downloaded graph; bind resources through real selectors. File IDs are synthetic. Validation checks shape and evaluation predicts actions; neither resolves permissions, resource existence or target compatibility. The setRegion graph belongs to a region; setAppearance uses an explicit dynamic surface reference. Bind actual targets before live use. A predicted action is not proof of server application.
Run the fixture in a development installation
Extract the example bundle to data/blueprint-examples inside a disposable checkout of the documented host. From the checkout root, run:
uv run --locked python data/blueprint-examples/check-examples.py --host .The checker configures an in-memory database, blocks database queries and calls the real clean_blueprint and evaluate_graph functions. It validates all four object kinds, both connection kinds and all 44 node types, including requestRoll and setQuestStatus. It checks both roll visibilities, all six quest statuses and continuing execution without drawing dice or changing journals. This verifies document shape and predicted actions. Test behavior is still needed to check real targets, authorization and the complete server chain.
requestRoll validates its dice expression, label, visibility (public or gm) and audience, but only predicts a prompt. Eligible recipients explicitly roll through the native window; streamers receive no roll request. setQuestStatus binds an existing campaign quest and accepts draft, available, active, completed, failed or archived. Live execution uses an active GM authority through the journal service; interacting players gain no general journal editing permission. A synthetic UUID in resources.quest is not proof of quest ownership. The checker resumes Delay through the real continuation and evaluates Counter twice while preserving memory. Interact, Emit event and Timer request later work: the local evaluator does not execute receiver graphs. Teleport requires a real triggering token; invented browser context does not authorize movement.
Central configuration of every example
event
Start the interact graph; then request state:open.
{
"id": "start",
"type": "event",
"x": 40,
"y": 80,
"event": "interact"
}Download complete Blueprint for event
light
Enable a chosen native light by targetId; dynamic lighting must be available.
{
"id": "sample",
"type": "light",
"x": 300,
"y": 80,
"targetId": "22222222-2222-4222-8222-222222222222",
"enabled": true
}Download complete Blueprint for light
sound
Play the chosen campaign sound at volume 0.5.
{
"id": "sample",
"type": "sound",
"x": 300,
"y": 80,
"trackId": "33333333-3333-4333-8333-333333333333",
"volume": 0.5
}Download complete Blueprint for sound
state
Set the door to open; no extra event is emitted.
{
"id": "sample",
"type": "state",
"x": 300,
"y": 80,
"targetState": "open"
}Download complete Blueprint for state
interact
Request a referenced door’s interaction; the server executes the queued chain and enforces its limits.
{
"id": "sample",
"type": "interact",
"x": 300,
"y": 80
}Download complete Blueprint for interact
condition
Check closed and choose true → open. Connected Test overrides the fallback state check.
{
"id": "sample",
"type": "condition",
"x": 300,
"y": 80,
"state": "closed"
}Download complete Blueprint for condition
sequence
Run then1 → open; append then2–then4 for ordered actions.
{
"id": "sample",
"type": "sequence",
"x": 300,
"y": 80
}Download complete Blueprint for sequence
sprite
Use a campaign image on a compatible door/image Target; preserve the authored box.
{
"id": "sample",
"type": "sprite",
"x": 300,
"y": 80,
"appearance": "asset",
"assetId": "44444444-4444-4444-8444-444444444444"
}Download complete Blueprint for sprite
property
Read starting state → compare closed → condition → open.
{
"id": "sample",
"type": "property",
"x": 300,
"y": 80,
"property": "state"
}Download complete Blueprint for property
compare
Return whether the state is closed; its Boolean result feeds condition.test.
{
"id": "sample",
"type": "compare",
"x": 300,
"y": 80,
"state": "closed"
}Download complete Blueprint for compare
reference
Send an element UUID from door to a state action’s target input.
{
"id": "sample",
"type": "reference",
"x": 300,
"y": 80,
"targetId": "11111111-1111-4111-8111-111111111111"
}Download complete Blueprint for reference
reveal
Reveal a secret door; use a compatible door target.
{
"id": "sample",
"type": "reveal",
"x": 300,
"y": 80
}Download complete Blueprint for reveal
barrier
Let movement pass through a door without changing its other barrier channels.
{
"id": "sample",
"type": "barrier",
"x": 300,
"y": 80,
"channel": "movement",
"mode": "pass"
}Download complete Blueprint for barrier
soundControl
Stop a selected track; choose volume for an explicit volume adjustment.
{
"id": "sample",
"type": "soundControl",
"x": 300,
"y": 80,
"trackId": "33333333-3333-4333-8333-333333333333",
"action": "stop",
"volume": 0.5
}Download complete Blueprint for soundControl
flame
Light a composed torch’s configured enabled components; preserve its mechanism.
{
"id": "sample",
"type": "flame",
"x": 300,
"y": 80,
"enabled": true
}Download complete Blueprint for flame
all
Require two connected closed comparisons to be true; fewer than two inputs returns false.
{
"id": "sample",
"type": "all",
"x": 300,
"y": 80
}Download complete Blueprint for all
any
Accept either of two closed comparisons; at least two inputs are required.
{
"id": "sample",
"type": "any",
"x": 300,
"y": 80
}Download complete Blueprint for any
getVariable
Read Boolean element variable ready, default true → condition → open.
{
"id": "sample",
"type": "getVariable",
"x": 300,
"y": 80,
"scope": "element",
"name": "ready",
"valueType": "boolean",
"default": true
}Download complete Blueprint for getVariable
setVariable
Store Boolean ready=true in the element scope.
{
"id": "sample",
"type": "setVariable",
"x": 300,
"y": 80,
"scope": "element",
"name": "ready",
"valueType": "boolean",
"value": true
}Download complete Blueprint for setVariable
compareValue
Compare a Boolean value to false; an unconnected Boolean Value defaults to false.
{
"id": "sample",
"type": "compareValue",
"x": 300,
"y": 80,
"valueType": "boolean",
"operator": "eq",
"expected": false
}Download complete Blueprint for compareValue
emitEvent
Queue signal:ready on Self; the included receiver requests state:open.
{
"id": "sample",
"type": "emitEvent",
"x": 300,
"y": 80,
"scope": "element",
"name": "ready"
}Download complete Blueprint for emitEvent
delay
Wait 3 seconds before open; the evaluator exposes a continuation, the server schedules it.
{
"id": "sample",
"type": "delay",
"x": 300,
"y": 80,
"seconds": 3
}Download complete Blueprint for delay
timer
Start a 3-second one-shot timer whose expiry emits signal:ready.
{
"id": "sample",
"type": "timer",
"x": 300,
"y": 80,
"name": "ready",
"action": "start",
"seconds": 3
}Download complete Blueprint for timer
switch
Match text open to case1 → open; unmatched values use default.
{
"id": "sample",
"type": "switch",
"x": 300,
"y": 80,
"valueType": "text",
"value": "open",
"cases": [
{
"id": "case1",
"value": "open"
}
]
}Download complete Blueprint for switch
random
Choose between two equally weighted branches; local deterministic evaluator defaults to branch1.
{
"id": "sample",
"type": "random",
"x": 300,
"y": 80,
"weights": [
1,
1
]
}Download complete Blueprint for random
elementGroup
Send two ordered door UUIDs to a state target; the runtime resolves each member.
{
"id": "sample",
"type": "elementGroup",
"x": 300,
"y": 80,
"name": "Gates",
"memberType": "element",
"targetIds": [
"11111111-1111-4111-8111-111111111111",
"11111111-1111-4111-8111-111111111112"
]
}Download complete Blueprint for elementGroup
lightReference
Bind a native light through light → light.target.
{
"id": "sample",
"type": "lightReference",
"x": 300,
"y": 80,
"targetId": "22222222-2222-4222-8222-222222222222"
}Download complete Blueprint for lightReference
soundReference
Bind a sound through sound → sound.target.
{
"id": "sample",
"type": "soundReference",
"x": 300,
"y": 80,
"trackId": "33333333-3333-4333-8333-333333333333"
}Download complete Blueprint for soundReference
eventContext
Read trusted occupancy count → numeric comparison1 → condition → open.
{
"id": "sample",
"type": "eventContext",
"x": 300,
"y": 80,
"property": "count"
}Download complete Blueprint for eventContext
move
Move a compatible element one grid cell on x; dx/dy are cell units.
{
"id": "sample",
"type": "move",
"x": 300,
"y": 80,
"dx": 1,
"dy": 0
}Download complete Blueprint for move
rotate
Rotate a compatible element 90 degrees; region rotations must be multiples of 90.
{
"id": "sample",
"type": "rotate",
"x": 300,
"y": 80,
"degrees": 90
}Download complete Blueprint for rotate
setInteraction
Enable direct player interaction for a compatible door or mechanism.
{
"id": "sample",
"type": "setInteraction",
"x": 300,
"y": 80,
"enabled": true
}Download complete Blueprint for setInteraction
setRegion
Enable presence detection on the region owner; a door Target is incompatible.
{
"id": "sample",
"type": "setRegion",
"x": 300,
"y": 80,
"enabled": true
}Download complete Blueprint for setRegion
setVisibility
Show artwork on a compatible visual Target, without changing mechanism state.
{
"id": "sample",
"type": "setVisibility",
"x": 300,
"y": 80,
"visible": true
}Download complete Blueprint for setVisibility
setAppearance
Choose a material for a compatible dynamic surface Target; preserve its base restoration data.
{
"id": "sample",
"type": "setAppearance",
"x": 300,
"y": 80,
"assetId": "44444444-4444-4444-8444-444444444444"
}Download complete Blueprint for setAppearance
showMessage
Show original text to the trigger audience after server authorization.
{
"id": "sample",
"type": "showMessage",
"x": 300,
"y": 80,
"text": "The gate answers.",
"audience": {
"scope": "trigger"
}
}Download complete Blueprint for showMessage
showHandout
Present an existing authorized journal to trigger; use a real campaign journal ID.
{
"id": "sample",
"type": "showHandout",
"x": 300,
"y": 80,
"journalId": "55555555-5555-4555-8555-555555555555",
"audience": {
"scope": "trigger"
}
}Download complete Blueprint for showHandout
requestRoll
Ask the trigger to roll 1d20+2 with a public result. The recipient chooses Roll; the graph continues without a result branch.
{
"id": "sample",
"type": "requestRoll",
"x": 300,
"y": 80,
"expression": "1d20+2",
"label": "Inspect the chest",
"visibility": "public",
"audience": {
"scope": "trigger"
}
}Download complete Blueprint for requestRoll
setQuestStatus
Request active status for an existing campaign quest through a GM-authored action; this grants no general journal editing permission.
{
"id": "sample",
"type": "setQuestStatus",
"x": 300,
"y": 80,
"journalId": "88888888-8888-4888-8888-888888888888",
"status": "active"
}Download complete Blueprint for setQuestStatus
cameraFocus
Focus trigger’s camera at 25%, 40% scene coordinates.
{
"id": "sample",
"type": "cameraFocus",
"x": 300,
"y": 80,
"focusX": 25,
"focusY": 40,
"audience": {
"scope": "trigger"
}
}Download complete Blueprint for cameraFocus
teleport
Move the verified trigger token to a compatible same-scene destination; requires token context.
{
"id": "sample",
"type": "teleport",
"x": 300,
"y": 80,
"destinationId": "66666666-6666-4666-8666-666666666666"
}Download complete Blueprint for teleport
counter
Pass on the second event, preserving memory between runs.
{
"id": "sample",
"type": "counter",
"x": 300,
"y": 80,
"target": 2
}Download complete Blueprint for counter
once
Pass once, then choose false on subsequent events with the same node memory.
{
"id": "sample",
"type": "once",
"x": 300,
"y": 80
}Download complete Blueprint for once
cooldown
Pass immediately, then block for 10 seconds using the server clock.
{
"id": "sample",
"type": "cooldown",
"x": 300,
"y": 80,
"seconds": 10
}Download complete Blueprint for cooldown
Test as GM and player
Run Simulate to inspect one local event. Then use Test behavior to rehearse through the server; its changes are rolled back. Generate or update the scene as GM, then test a synthetic scene with a GM and an authorized player. Verify that a streamer cannot write. After editing the project again, use Update scene before expecting different live behavior.
For Target nodes, test a compatible real resource, a missing UUID and a resource from another campaign. For messages/handouts, test trigger audience and a second player. For memory/time, repeat with the same node and then intentionally reset memory through GM controls. Inspect every action outcome in Automation, including unsupported targets.
How to use AI to adapt any node
I target Gravewright 0.3.1, source 0e91fef. Adapt the complete Blueprint for node [type] to [goal]. Inspect blueprints.py, blueprint_runtime.py and the Map Builder guide. Distinguish document validation, evaluator prediction and server application. Select a compatible owner/Target and campaign-owned resources. Return complete JSON, editor steps, expected result and GM/player tests for missing target, permission denial and repetition. Preserve typed ports, memory and continuations where relevant.