Skip to content

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.

  • 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 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.

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.

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.

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 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.

The validator should resolve:

Mara quest action → missing_courier quest
hear_maras_request action → objective in missing_courier
recover_letter marker → courier_satchel chest
satchel loot → sealed_letter item
show_letter_to_oren marker → Brother Oren
Oren dialogueRoot → Oren dialogue

Chapter 5 will deliberately break one of these references so you can practice reading the resulting validator finding.

Verify:

  1. Mara starts The Missing Courier.
  2. hear_maras_request completes.
  3. The quest log points toward the satchel.
  4. The Courier’s Satchel appears near Greyhaven.
  5. Opening it adds the Sealed Courier Letter to inventory.
  6. 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.

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.