4. Add the First Quest and Letter
This checkpoint turns Mara’s rumor into playable campaign state. The player can start The Missing Courier, find a world-placed satchel, and receive the sealed letter.
Start from Checkpoint 3 or download Checkpoint 4.
What you will learn
Section titled “What you will learn”- How quest and objective IDs are structured
- How objective markers reference campaign objects
- How campaign-owned items enter inventory
- How a town-relative world placement differs from a service placement
- How dialogue actions start and advance a quest
- Why a validator-clean checkpoint can still be intentionally incomplete
Add Brother Oren’s NPC shell
Section titled “Add Brother Oren’s NPC shell”Add this record to npcs:
"tutorial_codex:brother_oren": { "id": "tutorial_codex:brother_oren", "name": "Brother Oren", "role": "shrine_keeper", "bark": "Some warnings are late. That does not make them useless.", "dialogueRoot": "tutorial_codex:brother_oren_dialogue", "placement": { "type": "town", "townId": "tutorial_codex:greyhaven" }}Oren’s placement means somewhere in or around Greyhaven. It intentionally omits a service POI. The design does not require him to render inside the generated shrine.
Add a minimal matching dialogue root:
"tutorial_codex:brother_oren_dialogue": { "id": "tutorial_codex:brother_oren_dialogue", "npcId": "tutorial_codex:brother_oren", "greeting": [ { "text": "Oren watches the northern hills as though waiting for them to answer." } ], "topics": { "name": { "text": "Brother Oren. I keep Greyhaven's shrine and the records people prefer not to remember." }, "job": { "text": "I tend the shrine, read its seals, and make certain old warnings are not mistaken for old superstitions." }, "quest": [ { "text": "The shrine has old records of the belfry, but no warning recent enough to explain tonight's toll.", "actions": [ { "endDialogue": true } ] } ] }, "keywords": {}}The story-resolution branch is deliberately deferred until Chapter 6.
Add the sealed letter
Section titled “Add the sealed letter”Replace the empty items object with:
"items": { "tutorial_codex:sealed_letter": { "id": "tutorial_codex:sealed_letter", "name": "Sealed Courier Letter", "type": "QUEST", "value": 0, "desc": "A damp letter bearing the wax seal of a neighboring shrine.", "tags": [ "QUEST", "CAMPAIGN_ITEM", "LORE" ] }}The item is owned by this campaign’s namespace. value: 0 and the quest-oriented tags communicate that it is story state, not ordinary vendor loot.
Add The Missing Courier
Section titled “Add The Missing Courier”Replace the empty quests object with:
"quests": { "tutorial_codex:missing_courier": { "id": "tutorial_codex:missing_courier", "title": "The Missing Courier", "summary": "Mara Vey is waiting for a courier who never reached Greyhaven. Search near the town and recover whatever the courier was carrying.", "objectives": [ { "id": "hear_maras_request", "text": "Speak with Mara about the missing courier.", "detail": "Find Mara Vey inside Greyhaven's tavern and ask about the missing courier.", "marker": { "targetId": "tutorial_codex:mara_vey" } }, { "id": "recover_letter", "text": "Recover the courier's sealed letter.", "detail": "Search near Greyhaven for the courier's satchel.", "marker": { "targetId": "tutorial_codex:courier_satchel" } }, { "id": "show_letter_to_oren", "text": "Bring the sealed letter to Brother Oren.", "detail": "Brother Oren can identify the shrine seal and explain the warning.", "marker": { "targetId": "tutorial_codex:brother_oren" } } ] }}Objective IDs are local to the quest. Actions refer to an objective with both the quest ID and objective ID:
[ "tutorial_codex:missing_courier", "hear_maras_request"]Markers are navigation hints. A marker target does not automatically complete an objective.
Place the courier’s satchel
Section titled “Place the courier’s satchel”Replace the empty worldPlacements array with:
"worldPlacements": [ { "id": "tutorial_codex:courier_satchel_scene", "placement": { "type": "town", "townId": "tutorial_codex:greyhaven" }, "contents": [ { "type": "chest", "id": "tutorial_codex:courier_satchel", "name": "Courier's Satchel", "loot": { "gold": 0, "food": 0, "items": [ "tutorial_codex:sealed_letter" ] } } ] }]Like Oren, the satchel uses general town-relative placement. It does not invent a street, roadside, or service anchor.
Replace Mara’s quest topic
Section titled “Replace Mara’s quest topic”Replace the Chapter 3 quest array with:
"quest": [ { "when": { "questActive": "tutorial_codex:missing_courier" }, "text": "The courier should have come from the north road. Search near town and look for a satchel or shrine seal.", "actions": [ { "endDialogue": true } ] }, { "when": { "all": [ { "not": { "questActive": "tutorial_codex:missing_courier" } }, { "not": { "questCompleted": "tutorial_codex:missing_courier" } } ] }, "text": "A courier from the eastern shrine never reached Greyhaven. Search near the north road and bring back whatever they carried.", "actions": [ { "startQuest": "tutorial_codex:missing_courier" }, { "completeQuestObjective": [ "tutorial_codex:missing_courier", "hear_maras_request" ] }, { "showMessage": "The Missing Courier begins. Search near Greyhaven for the courier's satchel." }, { "playSFX": "quest_progress" }, { "endDialogue": true } ] }, { "text": "The north road is quiet now, but quiet and safe are not the same thing.", "actions": [ { "endDialogue": true } ] }]The active-quest reminder comes before the start branch. The unconditional fallback remains last.
Validate the reference graph
Section titled “Validate the reference graph”The validator should resolve:
Mara quest action → missing_courier questhear_maras_request action → objective in missing_courierrecover_letter marker → courier_satchel chestsatchel loot → sealed_letter itemshow_letter_to_oren marker → Brother OrenOren dialogueRoot → Oren dialogueChapter 5 will deliberately break one of these references so you can practice reading the resulting validator finding.
Playtest the checkpoint
Section titled “Playtest the checkpoint”Verify:
- Mara starts The Missing Courier.
hear_maras_requestcompletes.- The quest log points toward the satchel.
- The Courier’s Satchel appears near Greyhaven.
- Opening it adds the Sealed Courier Letter to inventory.
- Brother Oren appears somewhere in or around Greyhaven and his basic topics work.
This is a useful boundary: the content pieces exist and validate, but the full progression path has not been wired yet.
Checkpoint 4
Section titled “Checkpoint 4”Your campaign now contains:
- one active quest,
- three stable objective IDs,
- one campaign-owned quest item,
- one world-placed chest,
- Brother Oren’s NPC and dialogue shells,
- Mara’s ordered quest-start logic.
Continue to Chapter 5: Diagnose a Validator Error.