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.
| Record | Value |
|---|---|
| Structural validation date | 2026-07-27 |
| Runtime test date | Not 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:
- Download the start checkpoint, an empty WolvenKit project;
- Download the completed checkpoint, containing the mod-owned resource set and serialized review artifacts.
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:
| Resource | Depot path | Owns |
|---|---|---|
| Root questphase | mod\cqa\cqa001\phases\cqa001.questphase | Execution order, one-shot guard, delay, journal state changes, completion fact, and termination |
| Journal | mod\cqa\cqa001\journal\cqa001.journal | Quest, phase, and objective entries |
| Onscreen localization | mod\cqa\cqa001\localization\en-us\onscreens\cqa001.json | Player-facing English strings referenced by journal entries |
| ArchiveXL registration | CQA_Lab01_OneShot.archive.xl | Attaches 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:
| Key | English text |
|---|---|
cqa_cqa001_title | First Signal |
cqa_cqa001_objective_wait | Wait 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.
| ID | RED node type | Incoming socket | Decisive property | Purpose |
|---|---|---|---|---|
0 | questInputNodeDefinition | root In1 | socket name In1 | Entry from the registered root |
10 | questConditionNodeDefinition | In | cqa001_completed Equal 0 | Evaluate once and choose True or False immediately |
11 | questJournalNodeDefinition | Active | path quests/minor_quest/cqa001 | Activate and track the quest |
12 | questJournalNodeDefinition | Active | objective path | Activate and track the objective |
13 | questPauseConditionNodeDefinition | In | questRealtimeDelay_ConditionType, 10 seconds | Hold this execution path until elapsed real time reaches ten seconds |
14 | questJournalNodeDefinition | Succeeded | objective path | Mark the objective succeeded |
15 | questFactsDBManagerNodeDefinition | In | set cqa001_completed exactly to 1 | Persist one-shot completion state |
16 | questJournalNodeDefinition | Succeeded | path quests/minor_quest/cqa001 | Mark the quest succeeded |
1 | questOutputNodeDefinition | In | Terminating | End 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:
- start from a save that has never loaded
cqa001; - confirm the quest and objective activate once;
- confirm completion occurs after ten seconds of real time;
- confirm the objective and quest both show succeeded presentation;
- save, reload, and confirm the quest does not reactivate;
- 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
14throughSucceeded, notActive. - If the quest repeats, check
cqa001_completedon 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.