Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Entry, exit, and quest handoff

The scene graph and the questphase graph meet through names, but they remain different graph systems. First Contact exposes scene entry start, exposes named scene exit contact_done, and gives a questSceneNodeDefinition sockets with exactly those names.

Canonical four-node scene

The completed scene has four scene-node IDs:

                         +-> Section 2 -> End 3 [contact_done]
Start 1 -- one fan-out --+
                         +-> scnQuestNode 4 / PuppetAI [fire-and-forget]

Start uses one output socket with two destinations. The section controls the line’s duration and reaches End. The PuppetAI branch has no output destination, so it is deliberately fire-and-forget and does not join the line branch before the named exit.

The exact semantic edges and stamps are:

Source nodeSource output stampDestinationDestination input stamp
Start 1name 0, ordinal 0Section 2name 0, ordinal 0
Start 1name 0, ordinal 0PuppetAI wrapper 4name 0, ordinal 1
Section 2 normalname 0, ordinal 0End 3name 0, ordinal 0
Section 2 cancelname 1, ordinal 0no destination—
PuppetAI wrapper 4name 0, ordinal 0no destination—
End 3no output sockets——

Do not turn the two Start destinations into two differently stamped outputs. The fixture has one 0/0 fan-out. Likewise, the PuppetAI destination’s 0/1 is an input stamp, not the wrapper’s output stamp.

The graph declares its boundary nodes independently of their appearance in the graph array:

startNodes: [scnNodeId(1)]
endNodes:   [scnNodeId(3)]

entryPoints:
  start -> scnNodeId(1)

exitPoints:
  contact_done -> scnNodeId(3)

startNodes/endNodes identify the graph’s boundary nodes. entryPoints and exitPoints publish named routes for callers. Preserve both layers; merely naming an exit does not add End to endNodes, and merely listing End does not publish contact_done.

The scene-local PuppetAI node

Scene node 4 is an scnQuestNode wrapper around a questPuppetAIManagerNodeDefinition, also with graph-local ID 4 in this focused fixture. Its internal quest node has:

PropertyValue
Entry targetContact entity reference beneath #cqa005_com_contact
aiTierCinematic
Quest socketsCutDestination, In, Out
Wrapper isockMappingsCutDestination, In
Wrapper osockMappingsOut
Wrapper output destinationsnone

The wrapper’s input ordinal 1 maps Start’s destination to internal socket In; ordinal 0 is the CutDestination mapping. This is why changing the destination stamp from 0/1 to 0/0 is a semantic edit, not cosmetic graph layout.

The branch requests the contact’s Cinematic AI tier alongside the spoken section. It neither ends the scene nor emits a completion signal. The section branch alone reaches End 3. Since no join waits for an AI output, treat this arrangement as fire-and-forget and test teardown separately.

Questphase scene node contract

The child questphase launches the archived scene through one questSceneNodeDefinition. Its interface is exact:

SocketSocket typeFirst Contact connection
CutDestinationCutDestinationUnconnected
startInputConnected from the child flow after actor readiness/setup
contact_doneOutputConnected to success-state and cleanup progression
Default INTOutputUnconnected
Default RETOutputUnconnected

There is no output socket named end. The successful join is the exact scene-exit name contact_done. Adding a questphase end output does not make it match the scene’s End node.

The decisive non-socket properties are:

questSceneNodeDefinition
├── interruptionOperations: []
├── notAllowedToBeFrozen: 0
├── reapplyInterruptionOperationsAfterGameLoad: 0
├── syncToMusic: 0
├── sceneFile:
│   ├── DepotPath: mod\cqa\cqa005\scenes\cqa005_first_contact.scene
│   └── Flags: Soft
└── sceneLocation: scnWorldMarker
    └── nodeRef: #cqa005_sm_contact

The soft sceneFile is a depot reference to a .scene carried in the packed archive. It is not an ArchiveXL root registration. ArchiveXL registers the quest root and localization branches in this design; the active questphase resolves the soft scene resource when execution reaches this node.

sceneLocation is a typed scnWorldMarker. Its local NodeRef must resolve beneath the prefab scope available to the active phase composition. A valid scene path cannot supply a missing marker, and a registered marker cannot supply a missing scene. See Quest prefabs and NodeRefs.

Empty interruptionOperations and unconnected default interruption/return outputs are exact boundaries for this small lab. They do not prove that a larger quest can omit interruption handling, nor that CutDestination has been runtime-validated.

Start checkpoint boundary

The downloadable start checkpoint keeps a safe scene shell with only:

Start 1 (output 0/0) -> End 3 (input 0/0)

It still declares startNodes[1], endNodes[3], entry start, and exit contact_done. The root and child start quest graphs must not invoke that scene node. The shell exists so the learner edits a native resource with its actor/debug/localization/reference scaffold intact; it is not a playable pre-completion shortcut.