CLASSES

Six player classes — linear three-stage advancement at the standard breakpoints. Stat sums S1 ≈ 12 · S2 ≈ 16 · S3 ≈ 20 across Attack / Defense / Speed (max 10 per axis). Art pipeline mirrors the creature codex: raw generations placed for approval, crops after sign-off.

Class ultimates

One per line, upgrading with stage. Learned at class level 10 (authored as Learn_Level). Costs the avatar's action, once per battle, and resolves in a priority bracket ahead of every normal action regardless of Speed (two in one round tie on the round seed). Authored in codex/ultimates.csv. Full mechanics — redirect scope, vanish retargeting, echo rounding, autoplay — on the battle system page.

LineS1 / S2 / S3Effect
WARRIORHold the Line / Iron Bulwark / Martyr’s AegisTaunt for the round. S2 adds +10% Defense for the rest of the battle; S3 adds 5% of maximum HP healed per hit taken this round.
MAGEShardburst / Stonefall / CataclysmStrikes every enemy. Power 75 / 100 / 125 per target.
ARCHERSure Shot / Deadeye / GodpiercerStrikes one enemy. Power 180 / 240 / 300.
BRUTEBlood Price / Tyrant’s Toll / Wrath of the PitRetaliation stance for the round: each hit taken answers with a 50 / 65 / 80 power counter and raises Attack 4 / 5 / 6% for the rest of the battle, capped at +40 / 50 / 60%.
PROFESSORRecitation / Grand Thesis / RevelationEcho: every support ability in the hero’s soul slots fires at once on the whole party, the hero included — self-only and ally-type abilities alike, and the type gate does not apply. Bonuses land at 40 / 50 / 60% strength (a +50% buff becomes +20% / +25% / +30%) and durations are halved, rounded up. Whole-number effects of one step round away to nothing at 40%.
ASSASSINSlip Away / Shadowmeld / VanishStrikes one enemy. Power 120 / 180 / 240, then untargetable by single-target moves for 1 / 2 / 3 rounds.

Stage is derived, never stored

A class line advances at class level 33 and 66 (CLASS_STAGE_LV). The stage is computed from the class level every time it is needed — clsStageOf(lvl) returns 3 at level 66+, 2 at 33+, else 1 — and there is no stored stage anywhere that could drift. A save already past a breakpoint is therefore correct the instant it loads. clsAdv records which stage the player has accepted (clicked through the stage-up), so the advancement scene does not replay. Since #102 (2026-08-13) the avatar’s stats, art and name use the shown stage, clsStageShown() = min(clsStageOf(lvl), clsAdv): a class past a breakpoint keeps its old stage’s stats until the stage-up is accepted. The leaderboard power (src/power.js) reads it the same way since 2026-09-30. Only the class being played advances: clsStageNow(id) returns 1 for any line other than the active charSoul, because classXp belongs to the line in play.

Everything the player sees must derive its own stage. The client's CLASSLINES table carries curStage:1 and img:'CLS-<LINE>-1'; those two fields are fresh-save defaults and are not the stage. Reading them renders stage-1 content for a fully advanced character. Report #22 (2026-08-03) was exactly this: the equipment portrait read the pinned img while the name beside it derived correctly, so a class-Lv75 Paladin was shown the Warrior stage-1 art. The portrait now builds its path as CLS-<LINE>-<clsStageNow()>, the same way the battle avatar always did. Art exists for all three stages of all six lines (codex/images/classes/CLS-<LINE>-1|2|3.png), so a stage-1 portrait on an advanced character is always a binding defect, never missing art.

Every class has its own level

Each class line levels on its own (D 2026-10-01). classXp is the XP of the class being played and clsAdv its accepted stage; clsXpBy and clsAdvBy hold every other class’s. Switching banks the class left and loads the class taken — a newly bought class is level 1. Stats, ultimates, stage art, power and the PvP team builder all read the active class’s level; gear requirements read the account level, which stays shared. The server credits each battle’s class XP to the class that fought and clamps each class’s XP to its own credit.

Changelog