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

Lab 1: First Signal

Lab 1 establishes the smallest useful native quest loop: register a root questphase, show one objective, wait ten real-time seconds, complete the objective and quest, persist a one-shot guard, and terminate.

RecordValue
Structural validation date2026-07-27
Runtime test dateNot yet recorded

The supplied resources pass WolvenKit 8.19.0 deserialization and round-trip checks. Follow the test chapter to verify activation, timing, journal state, reload, reinstall, and clean replay in your game.

The complete manual WolvenKit authoring, installation, test, and reset walkthrough builds this design from the empty checkpoint. This page remains the concise resource and graph reference.

Outcome

On a clean save, the intended player-facing sequence is:

root quest starts
  -> already completed?
     +-> yes: terminate
     +-> no: show First Signal and Wait for the signal.
          -> wait 10 real-time seconds
          -> complete objective
          -> persist cqa001_completed = 1
          -> complete quest
          -> terminate

There is no trigger, marker, scene, character, device, combat encounter, or custom world resource. Those systems enter in later labs.

Prerequisites and tested baseline

Read Foundations first. The lab assumes you can distinguish resource ownership, socket semantics, identifier domains, and save-backed state.

Use the exact pinned version set: Cyberpunk 2077 2.31a, WolvenKit 8.19.0, ArchiveXL 1.27.0, RED4ext 1.30.0, and the pinned redscript 0.5.31 (ArchiveXL requires 0.5.31 or newer).

The example has two checkpoints:

The source directories remain available on GitHub.

Use a dedicated test save. The completion fact is stored in the save and is deliberately not reset by the quest.

Follow the manual authoring walkthrough to create the resources, enter the property paths, wire every socket, install the project, and run the Experimental clean-save acceptance matrix.

Resource model

Three native resources and one framework file divide responsibility:

ResourceDepot pathOwns
Root questphasemod\cqa\cqa001\phases\cqa001.questphaseExecution order, one-shot guard, delay, journal state changes, completion fact, and termination
Journalmod\cqa\cqa001\journal\cqa001.journalQuest, phase, and objective entries
Onscreen localizationmod\cqa\cqa001\localization\en-us\onscreens\cqa001.jsonPlayer-facing English strings referenced by journal entries
ArchiveXL registrationCQA_Lab01_OneShot.archive.xlAttaches the root questphase and merges the journal and localization resources

The questphase does not contain the text “First Signal.” It changes journal entry state. The journal contains localization keys, and the onscreen localization resource resolves those keys to text.

Journal tree

The journal resource supplies this exact tree:

quests
└── minor_quest
    └── cqa001                         gameJournalQuest
        └── cqa001_01                  gameJournalQuestPhase
            └── cqa001_01_obj_wait     gameJournalQuestObjective

Localization keys:

KeyEnglish text
cqa_cqa001_titleFirst Signal
cqa_cqa001_objective_waitWait for the signal.

Questphase journal paths use fileEntryIndex: 2, the zero-based path component for the containing cqa001 file entry in quests/minor_quest/cqa001/.... This value is not the leaf index and is not a CR2W handle.

Exact questphase

The figure is generated from the supplied WolvenKit CR2W-JSON. Match its node IDs, socket names, and connections to your graph; editor layout can differ.

IDRED node typeIncoming socketDecisive propertyPurpose
0questInputNodeDefinitionroot In1socket name In1Entry from the registered root
10questConditionNodeDefinitionIncqa001_completed Equal 0Evaluate once and choose True or False immediately
11questJournalNodeDefinitionActivepath quests/minor_quest/cqa001Activate and track the quest
12questJournalNodeDefinitionActiveobjective pathActivate and track the objective
13questPauseConditionNodeDefinitionInquestRealtimeDelay_ConditionType, 10 secondsHold this execution path until elapsed real time reaches ten seconds
14questJournalNodeDefinitionSucceededobjective pathMark the objective succeeded
15questFactsDBManagerNodeDefinitionInset cqa001_completed exactly to 1Persist one-shot completion state
16questJournalNodeDefinitionSucceededpath quests/minor_quest/cqa001Mark the quest succeeded
1questOutputNodeDefinitionInTerminatingEnd either the already-completed or first-run route

Condition and PauseCondition are not interchangeable. ID 10 snapshots a fact and immediately chooses one output. ID 13 keeps waiting until its time condition becomes true.

The completion fact is set after the objective succeeds but before the quest succeeds. If testing later exposes a save interruption between those nodes, the ordering must be revisited and recorded rather than silently called safe.

Registration

ArchiveXL registers the root and resource merges:

quest:
  phases:
  - path: mod\cqa\cqa001\phases\cqa001.questphase
    parent: base\quest\cyberpunk2077.quest

journal:
- mod\cqa\cqa001\journal\cqa001.journal

localization:
  onscreens:
    en-us:
    - mod\cqa\cqa001\localization\en-us\onscreens\cqa001.json

The parent path is a vanilla depot reference. The example cites it; it does not redistribute the base-game resource.

See Registering a root questphase for the difference between root reachability, location gates, resource merges, and runtime proof.

Verification plan

Structural checks already completed:

The supplied resources have been round-tripped with WolvenKit 8.19.0. Compare the node IDs, sockets, connections, journal tree, and localization keys with your authored project.

Runtime acceptance still required:

  1. start from a save that has never loaded cqa001;
  2. confirm the quest and objective activate once;
  3. confirm completion occurs after ten seconds of real time;
  4. confirm the objective and quest both show succeeded presentation;
  5. save, reload, and confirm the quest does not reactivate;
  6. inspect ArchiveXL and game logs for registration or lookup errors.

Until those checks pass, expected behavior is not runtime proof.

Common failure boundaries

  • If nothing starts, inspect ArchiveXL root-phase registration and the depot path before changing graph logic.
  • If text is blank, compare journal localization keys with onscreen secondary keys. Journal IDs are not localization IDs.
  • If the objective remains active, verify that the edge enters ID 14 through Succeeded, not Active.
  • If the quest repeats, check cqa001_completed on the exact save used for the second run.
  • If a test appears fixed after editing a device, journal, scene, or fact, repeat it on a clean save before attributing the change to the resource edit.

Lab sequence: All labs · Next: Author First Signal in WolvenKit.