Skip to content

8. Add the Dungeon and Boss

Quest 2 now has a companion and a reason to travel north. This chapter creates the destination: a two-level crypt beneath the ruined belfry, a funerary inscription on the first level, and the Echo Warden in the final chamber.

Start from Checkpoint 7 or download Checkpoint 8.

  • How an overworld dungeon record defines theme and level count
  • How quest markers reference a dungeon and a custom monster
  • How dungeon-relative placement uses verified levels and anchors
  • How conditional monster placement keeps a boss tied to campaign state
  • Why a monster needs authored sprite data even though an NPC may use appearance fallback
  • How to preserve an intentional curriculum boundary before event wiring

Replace the empty dungeons object with:

"dungeons": {
"tutorial_codex:drowned_belfry": {
"id": "tutorial_codex:drowned_belfry",
"name": "The Drowned Belfry",
"x": 124,
"y": 84,
"mainLandMass": true,
"theme": "crypt",
"maxLevels": 2,
"levelNames": {
"1": "The Drowned Belfry - The Sunken Steps",
"2": "The Drowned Belfry - The Bell Chamber"
}
}
}

The dungeon requests an overworld location at x: 124, y: 84 on the main landmass. Coordinate validity and practical reachability still require a runtime playtest.

theme: "crypt" selects a supported dungeon theme. maxLevels: 2 creates two levels, and levelNames provides player-facing names for each one.

The object keys in levelNames are JSON strings:

"1": "...",
"2": "..."

Do not add a third name when maxLevels is two.

Replace the Chapter 7 version of tutorial_codex:silence_drowned_bell with:

"tutorial_codex:silence_drowned_bell": {
"id": "tutorial_codex:silence_drowned_bell",
"title": "Silence the Drowned Bell",
"summary": "Recruit Lysa Fen, descend into the Drowned Belfry, defeat the Echo Warden, and return to Brother Oren.",
"objectives": [
{
"id": "recruit_lysa",
"text": "Ask Lysa Fen to join you.",
"detail": "Lysa is waiting in Greyhaven's tavern. Her knowledge of the bell may help in the crypt.",
"marker": {
"targetId": "tutorial_codex:lysa_fen"
},
"completeWhen": {
"hasFlag": "tutorial_codex:lysa_recruited"
}
},
{
"id": "enter_belfry",
"text": "Enter the Drowned Belfry.",
"detail": "Travel north of Greyhaven and descend into the ruined belfry.",
"marker": {
"targetId": "tutorial_codex:drowned_belfry"
}
},
{
"id": "defeat_warden",
"text": "Defeat the Echo Warden.",
"detail": "Reach the Bell Chamber on the final level and put the drowned guardian to rest.",
"marker": {
"targetId": "tutorial_codex:echo_warden"
}
},
{
"id": "return_to_oren",
"text": "Return to Brother Oren.",
"detail": "Tell Oren that the Echo Warden has fallen so he can finish the shrine's rite.",
"marker": {
"targetId": "tutorial_codex:brother_oren"
}
}
]
}

All four marker targets now exist by the end of this chapter.

Only recruit_lysa has automatic completion in Checkpoint 8. Chapter 9 will add targeted event producers for dungeon entry and boss victory, then connect those durable flags to the remaining objective completions.

Replace the empty monsters object with:

"monsters": {
"tutorial_codex:echo_warden": {
"id": "tutorial_codex:echo_warden",
"type": "tutorial_codex:echo_warden",
"name": "Echo Warden",
"hp": 85,
"maxHp": 85,
"attack": 11,
"defense": 5,
"speed": 4,
"vision": 8,
"xp": 125,
"lootValue": 50,
"lootTags": [
"QUEST"
],
"terrain": [
"DUNGEON"
],
"placement": {
"type": "dungeon",
"dungeonId": "tutorial_codex:drowned_belfry",
"level": "final",
"anchor": "final_room",
"role": "dungeon_boss",
"when": {
"questActive": "tutorial_codex:silence_drowned_bell"
},
"revealEffect": "shimmer"
},
"preCombatMessage": "The figure beneath the bell arch raises its head. Water runs from an empty helm, and every memory you have of mourning speaks at once.",
"sprite": [
" ",
" ssss ",
" sDssDs ",
" sssssss ",
" bbbb ",
" ddddddd ",
" dd ddd dd ",
" ddddddd ",
" HHHH ",
" H HH H ",
" H H ",
" "
]
}
}

The collection key, id, and custom type all use:

tutorial_codex:echo_warden

This gives the campaign a stable target for placement, quest markers, and the victory event added in Chapter 9.

The placement means:

  • use the Drowned Belfry,
  • use its final level,
  • use the final_room anchor,
  • treat the monster as the dungeon boss,
  • spawn it only while Quest 2 is active,
  • reveal it with the supported shimmer effect.

These are contract values, not descriptive prose. Keep their spelling exact.

NPCs can use the new generic appearance fallback. Custom monsters do not use that NPC path.

The compact 12×12 sprite is therefore functional presentation data: it gives the Echo Warden a drawable map and combat image without burying the chapter under a 40×40 character array. A later sprite recipe can replace or refine the art while preserving the monster’s IDs and progression references.

Append this entry to worldPlacements after the courier satchel scene:

{
"id": "tutorial_codex:sunken_steps_scene",
"placement": {
"type": "dungeon",
"dungeonId": "tutorial_codex:drowned_belfry",
"level": 1,
"anchor": "stairs_up"
},
"contents": [
{
"type": "feature",
"id": "tutorial_codex:cracked_inscription",
"name": "Cracked Funerary Inscription",
"featureType": "inscription",
"text": "The stone reads: “Ring once for the lost. Ring twice for the remembered. Never ring a fourth time.”",
"actions": [
{
"setFlag": "tutorial_codex:inscription_read"
},
{
"showMessage": "The inscription suggests the bell was meant to guide the dead home, not call them back."
}
]
}
]
}

level: 1 and anchor: "stairs_up" place the feature in a verified first-level context. Do not invent an atmospheric anchor name merely because it sounds appropriate.

The feature’s actions record that it was read and provide a concise interpretation. The flag is optional story memory at this checkpoint; it does not gate the main quest.

The validator should resolve:

enter_belfry marker → drowned_belfry dungeon
defeat_warden marker → echo_warden monster
return_to_oren marker → Brother Oren
Echo Warden dungeonId → drowned_belfry
Echo Warden questActive → silence_drowned_bell
Sunken Steps dungeonId → drowned_belfry

Also confirm the exact registry values:

theme: crypt
terrain: DUNGEON
level: final
anchor: final_room
role: dungeon_boss
revealEffect: shimmer

Validation does not prove that the dungeon generated at a reachable location, the anchor was populated as expected, or the boss is fair for the intended party.

Use a fresh game, complete Quest 1, and recruit Lysa.

Verify:

  1. The Drowned Belfry appears north of Greyhaven and can be reached.
  2. Entering it produces a two-level crypt.
  3. The first level uses the Sunken Steps name.
  4. The inscription appears near the first-level stairs_up context.
  5. Interacting with it shows its text and records tutorial_codex:inscription_read.
  6. The second level uses the Bell Chamber name.
  7. The Echo Warden appears in the final room only while Quest 2 is active.
  8. The Warden is visible and its pre-combat message appears.
  9. The encounter can be completed by the intended early-game party.

The campaign now includes:

  • a two-level crypt-themed dungeon,
  • all four Quest 2 objectives and valid marker targets,
  • a first-level story feature,
  • a conditionally placed custom boss,
  • compact authored boss art,
  • a deliberate boundary before victory-event wiring.

Continue to Chapter 9: Add Victory and the Ending.