World
Quests
Quests, trigger events, Quest.edf and texts
Overview
A quest is a composite entity of two server tables (Quest.dat and HolyStoneKeepperQuest.dat — race war quests), nine trigger event tables Quest*Event.dat, the client Quest.edf (12 sections) and the texts NDQuest.edf in every language. The client files are derived entirely from the server data and texts: it takes a build with code packing, not editing of client bytes.
Server (RF_Bin\Script) Client (DataTable)
Quest.dat ─┐ Quest.edf (12 sections)
HolyStoneKeepperQuest.dat ├─ build ──► events 0–6, quests, QuestItem,
Quest*Event.dat × 9 ─┘ (code→number) race lists ×3
(no texts on the server) <language>\NDQuest.edf — texts
How it works
- The quest record: up to 3 targets (actions), rewards (money, experience, points, up to 6 items, up to 2 masteries, skill, force), up to 5 transitions to next quests and a transition after failure, up to 3 failure conditions, a repeat group and
m_dRepeatTime. - A trigger event is a row of one of the 9 tables: when and to whom to give the quest; inside are 3 race blocks, each with up to 5 conditions and up to 5 quest references. Rows of one NPC are consecutive; a LevelUp quest is received only by characters that reach the level after the release.
- Three numbering systems: dense row positions (
m_dwIndex, renumbered at build), stableNDQuesttext indexes (never renumbered) and identity in the project. Changing the index of a released quest breaks players' active quests. - Repeatable quests of one group are mutually exclusive: while one is taken the others are hidden, after turning it in the whole group waits
m_dRepeatTime. QuestItemis the client table of quest trophies with its own name section inNDQuest.
What matters when editing
- Slot limits 3 / 6 / 2 / 5 / 3, quantities ≤ 255, text lengths in encoding bytes, a quest item name ≤ 31 bytes.
- References to monsters, NPCs and items exist; the NPC has a quest button in
StoreList; a shared quest is in all three race lists.
Quest.edf is derived from Quest.dat, HolyStoneKeepperQuest.dat and the nine Quest*Event.dat (rules in quests.md §9). The race lists (sections 9–11, 4 bytes each) are not described as a separate structure in the Quest.edf.strs schema; their rule is §9.5.
Files of the category
13 in the registry| File | Side | Format | Level | Corpora | Record | Digest | Note |
|---|---|---|---|---|---|---|---|
script\HolyStoneKeepperQuest.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2408, GU 2408, Sirin 2408 | quests.md | quests.md §3 (HSK) |
script\Quest.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2408, GU 2408, Sirin 2408 | quests.md | quests.md §3–7 |
script\QuestDummyEvent.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2184, GU 2184, Sirin 2184 | quests.md | quests.md §8 |
script\QuestGainItemEvent.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2184, GU 2184, Sirin 2184 | quests.md | quests.md §8 |
script\QuestGradeEvent.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2184, GU 2184, Sirin 2184 | quests.md | quests.md §8 |
script\QuestKillOtherRaceEvent.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2184, GU 2184, Sirin 2184 | quests.md | quests.md §8 |
script\QuestLvLimitEvent.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2184, GU 2184, Sirin 2184 | quests.md | quests.md §8 |
script\QuestLvUpEvent.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2184, GU 2184, Sirin 2184 | quests.md | quests.md §8 |
script\QuestMasteryEvent.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2184, GU 2184, Sirin 2184 | quests.md | quests.md §8 |
script\QuestNPCEvent.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2184, GU 2184, Sirin 2184 | quests.md | quests.md §8 |
script\QuestPromoteEvent.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2184, GU 2184, Sirin 2184 | quests.md | quests.md §8 |
DataTable\<language>\NDQuest.edf | client | edf | derived | AoP ✓ (en-ph, ru-ru), GU ✓ (en-gb, ru-ru), Sirin ✓ (en-gb, ru-ru) | AoP 2 sections: 32/16, GU 2 sections: 32/16,… | quests.md, localization.md | Derived from: quest texts and QuestItem names. quests.md §11.1; STRS does not support dynamic strings (client-codecs.md §2.4) |
DataTable\Quest.edf | client | edf | derived | AoP ✓, GU ✓, Sirin ✓ | AoP 12 sections: 336×7/424/44/4×3, GU 12 sec… | quests.md | Derived from: Quest.dat, HolyStoneKeepperQuest.dat, Quest*Event.dat. 12 sections (quests.md §9.1) |
“ready for full” — the format is understood and the fields are described; “derived” — the file is assembled from another; “opaque” — the format is not fully known; “postponed” and “out of scope” — the studio does not edit the file.
Sections of the category
The files of the category are split into groups; every group and subgroup has its own page with the fields of its files only.
Client: Quest.edf and texts
DataTable\<language>\NDQuest.edf; DataTable\Quest.edf
Total 71 Known 1 Derived 63 Unused 7Unused parameters
Fields that neither the server nor the client reads. For each: why it was decided so and where that was established. The editor keeps their bytes as they are.
DataTable\<language>\NDQuest.edf client file
Record: Indexes (something)
| Offset | Field | Why unused | Data |
|---|---|---|---|
+0x004 | QuestCode | 0 in all 5 279 AoP records; the AoP client does not read it quests.md §11.1: the index table ( [027BDBE0]+0x60) is taken only by the loader 005E2020 (+0x08, +0x0C), destructor 005E1C10 (+0x0C) and getter 005E2470, whose result is read by 005E15A0 and 005E1A30 (only +0x0C); there are no other accesses to +0x60 of the object or its methods (clines); the generic table functions 005CD7C0/005CD8C0/005CD870 do not parse fields | — |
+0x00C | ?? | unused: 005E2020 writes the address of the allocated text here and does not read the file valuequests.md §11.1 | — |
DataTable\Quest.edf client file
Record: QuestDummyEvent, QuestNPCEvent, QuestKillOtherRaceEvt, QuestLevelUPEvt, QuestPromoteEvent, QuestGradeEvent, QuestGainItemEvent (QuestHappenEvent)
| Offset | Field | Why unused | Data |
|---|---|---|---|
+0x008 | EventNo | EventNo ( & 0xFF); nobody reads itquests.md §8.4 (Q4): AoP and 2.2.3.2 server — EventNo is not read; AoP client — byte +0x08 is not read anywhere (the table is read only by 005E2270, 00462320, 00588420) | 11 values; most often -1 (83%) |
Record: Quest
| Offset | Field | Why unused | Data |
|---|---|---|---|
+0x00C | bSelMannually | bSelMannually in STRS; the client does not read itquests.md §9.2 (Q11): tracking the record pointer ( qtaint.py) and reviewing all [reg+0Ch] in 51 quest record functions — no reads | always 0 |
+0x118 | LinkedQuest ×5 | 5 LinkedQuest pairs: (0,0) for a server-side transition, (−1,−1) when empty; the client does not read themquests.md §9.2 (Q1): indexed accesses [reg+reg*8+118h…] and pointer tracking — no reads | 3 values; most often -1 / -1 / -1 / -1 … (77%) |
+0x11C | LinkedQuest ×5 | 5 LinkedQuest pairs: (0,0) for a server-side transition, (−1,−1) when empty; the client does not read themquests.md §9.2 (Q1): indexed accesses [reg+reg*8+118h…] and pointer tracking — no reads | 3 values; most often -1 / -1 / -1 / -1 … (77%) |
+0x198 | Under Inv ×3 | 3 × i32, (−1, −1, 0) everywhere; the client does not read itquests.md §9.2: tracking the record pointer and searching offsets in the quest record functions — no reads | always -1 / -1 / 0 |
script\HolyStoneKeepperQuest.dat, script\Quest.dat server file
| Offset | Field | Why unused | Data |
|---|---|---|---|
+0x81C | m_strFailBriefCode | Always −1 in the data. The server does not read the field (search for +0x81C accesses in dzs.txt) [code, Q3]quests.md §3: digest — “2076 | m_strFailBriefCode | cstr64 | Always −1 in the data. The server does not read the field (search for +0x81C accesses in dzs.txt) [code, Q3]”; does not go to the client file (the Quest.edf record is mapped, quests.md §9.2) | always -1 |
QuestDummyEvent.dat, QuestGainItemEvent.dat, QuestGradeEvent.dat … server file
| Offset | Field | Why unused | Data |
|---|---|---|---|
+0x044 | m_nEevntNo | event number quests.md §8.4 (Q4): AoP server ( dzs.txt) and 2.2.3.2 (capstone) — EventNo is not read; AoP client — the byte is not read | always -1 |