Characters and creatures
Classes
Class tree, experience, ranks
Overview
Character classes, experience and ranks. Four server tables and the client Character.edf, where classes, ranks and experience are separate blocks with the same row and number.
Class.dat ── m_strCh_Class[8] ──> Class.dat (next grade)
│ m_strLinkClassSkill[10] ──> ClassSkill.dat
│ m_strDefaultItem[9] ──> item tables (by code)
└─ client: Character.edf, block 0
Exp.dat ── row number = level ──> Character.edf, block 5
Grade.dat ── (level, ranking place) → rank 0–7 ──> Character.edf, block 1
PlayerCharacter.dat ── race and sex ──> PlayerCharacter.edf
How it works
- A class is two records: a
Class.datrow and a block 0 row ofCharacter.edfwith the same number. The client one is derived from the server one: next-class and item codes are packed, the item quantity is a byte, skill group bonuses do not go to the client, flags are collected into a mask. - The row number is the key: it is stored in the character DB (the current class by code, the history by number). Rows cannot be inserted in the middle or reordered; rows 45 (
BSB0) and 49 (BSS2) are hard-coded in the server. - The class tree is a graph over
m_strCh_Class: codes of the same race, grade one higher, at most 8 transitions per row, history no deeper than 3 changes. Class change is request 11/6, reset is 11/24; the change reward is given once per grade. - Class flags and bonuses act over the whole class history of the character (as a sum or “any of”).
Exp.dat: the server reads only the Bellato column, the other columns and the three client columns are copies of it; ≥ 50 rows, values increase.Grade.dat: rows of one level are consecutive in increasingm_fRanking, the last is 1.0; 8 ranks per race.PlayerCharacter.datandPlayerCharacter.edfare one entity of 5 rows (race and sex).
Character.edf — 7 blocks, all derived from server tables (classes, ranks, monsters, ?, mastery limits, experience, animus); except block 3 (Action), whose source was not found in the digests. The monster and animus blocks are described in their own domains and only repeated here as part of the file.
Files of the category
6 in the registry| File | Side | Format | Level | Corpora | Record | Digest | Note |
|---|---|---|---|---|---|---|---|
script\Class.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 2256, GU 2256, Sirin 2256 | classes.md, skills.md | classes.md §2 |
script\Exp.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 260, GU 260, Sirin 260 | classes.md | classes.md §6.1 |
script\Grade.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 76, GU 76, Sirin 76 | classes.md | classes.md §7 |
script\PlayerCharacter.dat | server | dat | ready for full | AoP ✓, GU ✓, Sirin ✓ | AoP 168, GU 168, Sirin 168 | classes.md | classes.md §8 |
DataTable\Character.edf | client | edf | derived | AoP ✓, GU ✓, Sirin ✓ | AoP 7 sections: 1532/112/224/48/46/24/112, G… | classes.md, monsters.md, skills.md, animus.md | Derived from: Class.dat, Grade.dat, MonsterCharacter.dat, *MasteryLimit.dat, Exp.dat, animus tables. 7 blocks: classes, ranks, monsters, actions, mastery limits, experience, animus (classes.md §9, monsters.md §7.1) |
DataTable\PlayerCharacter.edf | client | edf | derived | AoP ✓, GU ✓, Sirin ✓ | AoP 72, GU 72, Sirin 72 | classes.md | Derived from: PlayerCharacter.dat. |
“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.
Player characters (race and sex)
DataTable\PlayerCharacter.edf; script\PlayerCharacter.dat
Total 19 Known 12 Derived 6 Unused 1Unused 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\Character.edf client file
Record: ClassLimit (Class)
| Offset | Field | Why unused | Data |
|---|---|---|---|
+0x002 | --11_u8-- | padding before the u32 of the numberclasses.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP | always 0 |
+0x003 | --12_u8-- | padding before the u32 of the numberclasses.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP | always 0 |
+0x1F5 | --5_u8-- | padding before the u32 of flagsclasses.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP | always 0 |
+0x1F6 | --6_u8-- | padding before the u32 of flagsclasses.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP | always 0 |
+0x1F7 | --7_u8-- | padding before the u32 of flagsclasses.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP | always 0 |
Record: Rank
| Offset | Field | Why unused | Data |
|---|---|---|---|
+0x061 | --1_u8-- | padding before the u32 of iconsclasses.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP | always 0 |
+0x062 | --2_u8-- | padding before the u32 of iconsclasses.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP | always 0 |
+0x063 | --3_u8-- | padding before the u32 of iconsclasses.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP | always 0 |
DataTable\PlayerCharacter.edf client file
| Offset | Field | Why unused | Data |
|---|---|---|---|
+0x02A | (2 bytes) ×2 | padding before floatclasses.md §9.5; unused: padding bytes (after a byte field up to the field at the next multiple of 4; unnamed bytes have no reads in MSVC code except whole-record copies; 2004 source citemdatamgr.h); 0 everywhere in AoP | always 0 / 0 |
script\Exp.dat server file
| Offset | Field | Why unused | Data |
|---|---|---|---|
+0x084 | m_strCora | unused classes.md §9.5: the experience table is referenced in code only by 1400C6F30 (reads +0x44), the loader and the g_Main constructor/destructor (search for all references to g_Main+0x388EB0D0/1797DE440 in dzs.txt); records are not stored in objects; the client does not receive the file | 66 values; most often 0 (2%) |
+0x0C4 | m_strAccretia | unused classes.md §9.5: the experience table is referenced in code only by 1400C6F30 (reads +0x44), the loader and the g_Main constructor/destructor (search for all references to g_Main+0x388EB0D0/1797DE440 in dzs.txt); records are not stored in objects; the client does not receive the file | 66 values; most often 0 (2%) |