monlvl.txt provides the per-level scaling multipliers that convert a monster's base stats (stored in monstats) into actual in-game values at a given monster level and difficulty. Every monster stat — HP, defense, attack rating, damage, and XP — is multiplied by the factor from this table before reaching the player.
111 rows (levels 0–110). Level 0 is an identity row (all multipliers = 1). Effective monster levels in the live game run from 1 (Act 1 Normal entry areas) to ~99 (Hell Act 5 boss encounters), but the table extends to 110 to accommodate mods and potential future content.
Two column families: Classic and Expansion
The table carries two parallel multiplier sets. D2R always runs in Expansion mode and reads the L-* columns:
| Family | Columns | Used by |
|---|---|---|
| Classic | AC, TH, HP, DM, XP (+ (N) and (H) variants) | D2 Classic (no expansion) |
| Expansion | L-AC, L-TH, L-HP, L-DM, L-XP (+ (N) and (H) variants) | Lord of Destruction and D2R |
At high monster levels the Expansion multipliers are substantially higher. At mlvl 85 Hell: L-HP(H) = 6182 vs HP(H) = 4637 — about 33% more HP in Expansion mode.
What's in a row
| Column | Description |
|---|---|
Level | Monster level index (0–110). Matches the Level(H) / Level(N) / Level values in monstats. |
AC / AC(N) / AC(H) | Classic defense multiplier × 100. |
TH / TH(N) / TH(H) | Classic attack rating multiplier × 100. |
HP / HP(N) / HP(H) | Classic HP multiplier × 100. |
DM / DM(N) / DM(H) | Classic damage multiplier × 100. Applies to all attack types including elemental. |
XP / XP(N) / XP(H) | Classic XP multiplier × 100. |
L-AC / L-AC(N) / L-AC(H) | Expansion defense multiplier × 100. |
L-TH / L-TH(N) / L-TH(H) | Expansion attack rating multiplier × 100. |
L-HP / L-HP(N) / L-HP(H) | Expansion HP multiplier × 100. |
L-DM / L-DM(N) / L-DM(H) | Expansion damage multiplier × 100. |
L-XP / L-XP(N) / L-XP(H) | Expansion XP multiplier × 100. |
The scaling formula
in-game stat = monstats.base_stat × monlvl.multiplier / 100
For HP: the engine rolls [monstats.minHP, monstats.maxHP] and multiplies by L-HP / 100.
For Defense: monstats.AC × L-AC / 100.
For XP: monstats.Exp × L-XP / 100.
Level 0 (all multipliers = 1) acts as the baseline: a monster at mlvl 0 has exactly the stats listed in monstats.
Hell multipliers at key endgame levels (Expansion/D2R)
SELECT Level, "L-HP(H)", "L-DM(H)", "L-AC(H)", "L-XP(H)", "L-TH(H)"
FROM monlvl
WHERE CAST(Level AS INTEGER) IN (75, 80, 83, 85, 87, 90, 99)
ORDER BY CAST(Level AS INTEGER);
| mlvl | L-HP(H) | L-DM(H) | L-AC(H) | L-XP(H) | L-TH(H) |
|---|---|---|---|---|---|
| 75 | 5032 | 85 | 1475 | 37605 | 3028 |
| 80 | 5607 | 91 | 1563 | 44400 | 3218 |
| 83 | 5952 | 94 | 1616 | 48477 | 3332 |
| 85 | 6182 | 96 | 1651 | 51195 | 3408 |
| 87 | 6412 | 98 | 1686 | 53913 | 3484 |
| 90 | 6757 | 102 | 1739 | 57990 | 3598 |
| 99 | 7792 | 111 | 1898 | 70221 | 3940 |
mlvl 85 is the endgame threshold: all canonical farming areas in Hell push monster levels to 85 via the MonLvlEx(H) column in levels.txt, ensuring champions and uniques spawn at this tier to enable the broadest item drop pool.
Worked example — mlvl 85 monster
A monster at mlvl 85 Hell with monstats base stats of minHP(H)=100, maxHP(H)=160, AC(H)=80, A1MinD(H)=25, A1MaxD(H)=40, Exp(H)=200 resolves to:
| Stat | Formula | In-game value |
|---|---|---|
| HP range | 100–160 × 6182/100 | 6,182 – 9,891 HP |
| Defense | 80 × 1651/100 | 1,321 defense |
| Physical damage | 25–40 × 96/100 | 24 – 38 damage |
| XP on kill | 200 × 51195/100 | 102,390 XP (before clvl penalty) |
The XP value here is the raw server-side kill XP before the character-level penalty curve is applied. The d2r-xp MCP applies that curve for accurate per-character projections.
Relationship to other tables
monstats— holdsLevel(H)per monster type, which is the index intomonlvl.levels—MonLvlEx(H)overrides the effective monster level for drop/stat purposes in expansion mode. When an area'sMonLvlEx(H)=85, monsters in that area use mlvl 85 multipliers regardless of their baseLevel(H).d2r-xpMCP — wraps the full XP formula (monlvl + party size + character level penalty) for per-run calculations.
Common queries
-- Full Hell multiplier ladder for endgame range
SELECT Level, "L-HP(H)", "L-DM(H)", "L-AC(H)", "L-XP(H)"
FROM monlvl
WHERE CAST(Level AS INTEGER) BETWEEN 75 AND 95
ORDER BY CAST(Level AS INTEGER);
-- HP difference between mlvl 85 and mlvl 75
SELECT
CAST((SELECT "L-HP(H)" FROM monlvl WHERE Level = '85') AS DECIMAL) /
CAST((SELECT "L-HP(H)" FROM monlvl WHERE Level = '75') AS DECIMAL) AS hp_ratio;
-- ≈ 1.23 (23% more HP at mlvl 85 vs mlvl 75)
-- Show the full row for a specific level
SELECT * FROM monlvl WHERE Level = '85';