---
title: Building quests
summary: Quests are goal/reward bundles with a quest master, a target, and an optional completion message. This guide covers qedit, the six quest types, prereq chains, and pairing with triggers.
order: 60
updated: 2026-05-19
---

# Building quests

Quests are structured goal/reward bundles. They have a name, description, type, target (mob/obj/room depending on type), point/gold/exp/object rewards, level limits, optional prereq chain, and optional time limit. You build them with `qedit`.

## Open the editor

```
qedit 8000        Create or edit quest vnum 8000
```

Quest vnums are usually grouped with the zone's mob/obj range — typical convention is `<zone>00`-`<zone>99`.

## Main menu

```
-- Quest Number    : [8000]
 1) Quest Name     : Lost Crown
 2) Description    : Find the lost crown of King Welmar.
 3) Accept Message
   The old herald hands you a moth-eaten map and gestures wearily.
 4) Completion Message
   The herald's face lights up. "Welmar's crown — you found it!"
 5) Quit Message
   The herald sighs. "Perhaps another day, friend."
 6) Quest Flags    : REPEATABLE
 7) Quest Type     : AQ_OBJ_RETURN  to herald [8001]
 8) Quest Master   : [8001] the old herald
 9) Quest Target   : [8050] a moth-eaten crown
 A) Quantity       : [1]
    Quest Point Rewards
 B) Completed      : [50]   C) Abandoned : [-10]
    Other Rewards
 G) Gold Coins     : [500]  T) Exp Points : [10000]  O) Object : [8051]
    Level Limits to Accept Quest
 D) Lower Level    : [5]    E) Upper Level : [25]
 F) Prerequisite   : [-1]   (none)
 L) Time Limit     : [60]   (minutes)
 N) Next Quest     : [8001]
 P) Previous Quest : [-1]
 X) Delete Quest
 Q) Quit
```

## Pick the quest type FIRST

Type determines what the **target** field means and how the engine checks completion.

| Type | Target | Completion check |
|---|---|---|
| `AQ_OBJ_FIND` | Object vnum | Player has the object in inventory |
| `AQ_OBJ_RETURN` | Object vnum + value[5] = return-to mob vnum | Player gives the object to the return mob |
| `AQ_ROOM_FIND` | Room vnum | Player enters the room |
| `AQ_ROOM_CLEAR` | Room vnum | No hostile mobs remain in the room |
| `AQ_MOB_FIND` | Mob vnum | Player encounters the mob (sees them in a room) |
| `AQ_MOB_KILL` | Mob vnum | Player kills the mob (`quantity` lets you require N kills) |
| `AQ_MOB_SAVE` | Mob vnum | Player saves the mob (via heal / rescue scripts) |

### Choosing the type

- **OBJ_RETURN** — most common quest type. Find item X, bring to mob Y. Quest auto-completes when the player `give`s the object.
- **MOB_KILL** — second most common. Kill N of mob X. Quest auto-completes when the kill count is met.
- **ROOM_FIND** — exploration goal. Find the hidden waterfall.
- **MOB_SAVE** — needs script support; the mob must call `quest save <questname>` from a trigger.
- **OBJ_FIND** — possession-based. Player must just have the item — they don't need to do anything else.

## Fields

### Name, description, messages (`1`-`5`)

- **Name** appears in `quest list` and quest tracking displays. Keep short.
- **Description** is the longer pitch shown when the player asks the quest master about it.
- **Accept message** displays when the player accepts. Set the tone.
- **Completion message** displays on success. The "thank you, brave adventurer" moment.
- **Quit message** displays on abandon. Lets you flavor failure.

Multi-line OK for all three messages.

### Quest flags (`6`)

| Flag | Meaning |
|---|---|
| `REPEATABLE` | Player can do this quest more than once. |
| `HIDDEN` | Doesn't show in `quest list` unless the player is eligible. |
| `IN_PROGRESS_OK` | Player can accept while already doing the quest (e.g. for cross-character quest sharing). |
| `INSTANT` | Auto-accept on quest-master interaction. No `accept` step. |

### Quest master (`8`)

The mob vnum that gives + receives this quest. The quest master needs a `Postmaster` or quest-handling spec proc (or DG trigger) to actually dispatch the accept/complete handshake. A bare mob without a quest hook will not auto-handle quests.

### Quest target (`9`)

Interpretation depends on type:

- For `OBJ_*` types — the object vnum.
- For `ROOM_*` types — the room vnum.
- For `MOB_*` types — the mob vnum.

For `AQ_OBJ_RETURN`, also set the **return-to mob** by editing the target's `value[5]` field (the editor labels it). This is who the player turns the item in to (often but not always the quest master).

### Quantity (`A`)

For `MOB_KILL`: how many of the target mob must die. For `OBJ_FIND`: how many of the target object must be in inventory. Default 1.

### Quest point rewards (`B`/`C`)

- **B (Completed)** — quest points granted on success.
- **C (Abandoned)** — quest points subtracted on quit. Often negative (penalty) but can be 0 (free quit).

Quest points are a separate currency from gold/exp; players spend them on quest-shop items.

### Other rewards (`G`/`T`/`O`)

- **G** — gold coins on completion.
- **T** — exp points on completion.
- **O** — object vnum to give the player on completion (set to -1 for no item reward).

### Level limits (`D`/`E`)

Lower and upper level required to accept the quest. Players outside this range can't pick it up. `0` for no limit on that end.

### Prereq (`F`)

A quest vnum that must be completed before this one can be accepted. Chain prereqs to build quest arcs:

- Quest A: "Find the broken sword" — no prereq.
- Quest B: "Forge the broken sword" — prereq = A's vnum.
- Quest C: "Slay the dark lord with the sword" — prereq = B's vnum.

Players who don't have the prereq complete won't see Quest C in `quest list`.

### Time limit (`L`)

Minutes from accept to auto-fail. `0` = no limit. Useful for time-pressure quests ("save the village within 30 minutes").

### Next / Previous quest (`N`/`P`)

Linked navigation between related quests — `quest info` shows the chain. Mostly cosmetic; doesn't enforce sequencing (use `Prerequisite` for that).

## Workflow

A typical quest build:

1. **Build the target first.** Mob to kill / object to find / room to enter / mob to save.
2. **Build the quest master.** Usually an NPC with quest-handler spec proc or DG triggers.
3. **`qedit <vnum>`** the quest.
4. **Wire the quest master** so it knows about your quest. The simplest path: a `Postmaster`-style proc that handles quest commands generically. Or DG triggers on COMMAND that match `quest accept` etc.
5. **Test the happy path.** Accept → progress → complete. Check rewards land.
6. **Test the failure paths.** Quit. Time limit. Level too low. Prereq missing.
7. **Verify level limits and rewards balance.** A 5-25 level quest awarding 100k gold is broken.

## Common patterns

### Fetch quest (OBJ_RETURN)

Quest type: `AQ_OBJ_RETURN`. Target = item vnum. value[5] = return-to mob.

Player accepts → looks for item → finds it → gives to mob → quest completes.

Make sure the item is reachable (zone reset spawns it, or it drops from a specific mob). Don't put it behind another quest's reward unless that's intentional.

### Kill quest (MOB_KILL)

Quest type: `AQ_MOB_KILL`. Target = mob vnum. Quantity = number of kills.

For a "kill 10 wolves" quest, set quantity to 10. Each kill increments the player's progress counter.

For unique-boss kills, quantity = 1.

### Exploration quest (ROOM_FIND)

Quest type: `AQ_ROOM_FIND`. Target = room vnum.

Player enters → quest completes automatically. Pair with a memorable destination — a hidden glade, a secret chamber.

### Multi-stage quest chains

Use `Prerequisite` (`F`) to link quests. Quest B requires Quest A done. Quest C requires Quest B. The game enforces the order — players can't skip to C.

For a long arc (5+ quests), consider whether each step has its own satisfying mini-reward, or whether the chain is just a single long quest broken up.

### Time-pressure quest

Set Time Limit (`L`) to N minutes. Be generous — players reading descriptions, looking up wiki pages, and walking to the destination take longer than you think.

Pair with a flavor description that hints at urgency ("the village has only an hour before…").

### Repeatable daily quest

Set flag `REPEATABLE`. Pair with a DG trigger or spec proc on the quest master that resets the player's "daily count" once per game-day.

## Quest commands (player-side)

Players interact via these standard commands:

```
quest list                        Show available quests
quest info <num>                  Detail on one quest
quest history                     What I've completed
quest accept <num>                Accept a quest
quest quit                        Abandon current quest
quest progress                    How far along am I?
```

Some quest masters override `accept` and `quit` via triggers — they want the player to `say accept` or `bow` to the quest giver. That's a per-quest-master choice you make as the builder.

## Integration: triggers

For quests that need scripted behavior (custom dialogue, mid-quest events), attach DG triggers to the quest master:

- `MTRIG_COMMAND` matching `accept` for custom acceptance behavior.
- `MTRIG_RECEIVE` for `OBJ_RETURN` quests — react when the player hands over the item.
- `MTRIG_TELL` for "ask npc about quest" style dialogue.
- `MTRIG_DEATH` on the target mob for `MOB_KILL` quests with scripted aftermath.

See [Building triggers](/builders/triggers).

## Save + test

`Q` → `y` saves the quest to `lib/world/qst/<zone>.qst`. The next zone reset (or `qedit reload`) registers it.

Testing checklist:

1. Quest master shows the quest in their dialogue / `say` response.
2. `quest list` shows it (assuming you meet level limits + prereqs).
3. `quest accept <num>` works and the accept message displays.
4. Progress against the target works (kill the mob, find the item).
5. Completion fires the message AND grants all three reward types (gold, exp, object).
6. `quest history` shows the completion.
7. Re-do it (or fail to) based on REPEATABLE flag.
8. Prereq quests gate access correctly.

## See also

- [Building mobiles](/builders/mobiles) — quest masters and quest-target mobs.
- [Building objects](/builders/objects) — quest-target objects.
- [Building triggers](/builders/triggers) — scripted quest behavior.
- [Building zones](/builders/zones) — placing quest content via zone resets.
