SkillDesc.txt is the presentation layer for player skills: it controls what the in-game skill tree and tooltip display. 263 rows, 119 columns. Every player-class skill has a corresponding skilldesc row that defines its position on the skill tree, its icon, its tooltip text keys, and up to three sections of description lines — each with a display function, paired localization string keys, and calc-DSL formulas evaluated at the current skill level.
This table has no effect on game mechanics. Damage, mana cost, prerequisites, synergies, and animation data all live in skills. SkillDesc.txt is purely the UI render specification.
Relationship to skills.txt
skills.txt rows reference this table via their skilldesc column, which maps to skilldesc.skilldesc (the row name). The relationship is many-to-one: multiple skill rows can share a single descriptor (e.g., variants of the same ability), and some skill rows that are not player-facing (monster skills, engine pseudo-skills) have no skilldesc entry at all.
The text columns here (str name, str short, str long, str alt) hold localization keys like AbyssName or skillname66 — pointers into string.txt / expansionstring.txt, not the human-readable text the player sees. The string tables themselves are not part of the data-guide.
Identity and skill-tree position
| Column | Meaning |
|---|---|
skilldesc | Descriptor name (primary lookup key). Referenced by skills.skilldesc. |
SkillPage | Skill tree tab. 0 = not displayed on any page; 1 = Tab 1; 2 = Tab 2; 3 = Tab 3. |
SkillRow | Row within the tab. 0 = not displayed; 1–6 = rows on the skill tree. |
SkillColumn | Column within the tab. 0 = not displayed; 1 = left; 2 = middle; 3 = right. |
ListRow | Position in the skill-select UI panel. 0 = common row; 1/2/3 = tree-specific rows; any other value = hidden from skill-select. |
IconCel | Frame index into the skill icon sprite sheet. Frame + 1 is used for the "pressed" visual state. |
HireableIconCel | Icon override for hireable (mercenary) versions of the skill. No pressed-state variant. |
Tooltip string keys
| Column | Meaning |
|---|---|
str name | Localization key for the skill's display name in the tooltip header. |
str short | Key for the brief description shown in shortcut bars and the skill-select overlay. |
str long | Key for the longer description shown on the skill tree hover. |
str alt | Key for the skill name on the Character Screen when the skill is selected (labels the active skill button). |
Damage display block
| Column | Meaning |
|---|---|
descdam | Function code selecting how the damage line is computed and displayed. 0 = hidden. |
ddam calc1 / ddam calc2 | Calc-DSL inputs to certain descdam functions (function 7 uses them as percent and flat bonuses). |
p1dmelem / p1dmmin / p1dmmax | Element type and min/max calc expressions for the first charge-up damage display (used on the Character Screen by charge-up skills like Fists of Fire). |
p2dmelem / p2dmmin / p2dmmax | Second charge-up damage component. |
p3dmelem / p3dmmin / p3dmmax | Third charge-up damage component. |
descatt | Display code for the Attack Rating line. 0 = hidden; 1 = primary weapon AR; 2 = dual-wield AR for each weapon; 3 = throwing right-hand; 4 = throwing left-hand; 5 = finishing-move AR. |
descmissile1/2/3 | Links missiles from missiles as reference values for calc-DSL expressions in the description lines (e.g., miss('abysscenter'.par1) to read a missile parameter into the tooltip). |
descdam function codes
| Code | Behavior |
|---|---|
| 0 | Hidden — no damage line shown |
| 1 | Basic attack damage (uses ddam calc1 as % bonus, ddam calc2 as flat bonus) |
| 2 | Kick damage |
| 3 | Throwing weapon damage |
| 4 | Left-hand throwing damage |
| 5 | Equipped weapon damage + skill physical and elemental damage |
| 6 | Variant of 5 with elemental damage carry-over from the source missile |
| 7 | Skill damage with ddam calc1 as % bonus, ddam calc2 as flat bonus (most common spell display) |
| 8 | Periodic elemental damage display, every 25 frames (calc1 = multiplier, calc2 = divisor) |
| 9 | Periodic elemental damage, multiplier always 3 |
| 10 | Holy Shield-style: shield-damage + skill bonus + Str/Dex stat bonuses |
| 11 | Weapon damage + per-element percent additions from skill Calc1/Calc2/Calc3 |
| 12 | Concentration aura conditional bonus (Expansion vs. Classic branches) |
| 13 | Throwing damage with Calc1 percent bonus |
| 14 | Skill damage with Param5 overall percent penalty |
| 15 | Skill damage + Param1/Param2 linear charge bonus + boot damage |
| 16 | Skill damage + Calc1 charge bonus + boot damage |
| 17 | Skill damage with physical + elemental displayed separately |
| 18 | Function 7 variant |
| 19 | Dual-wielding attack (falls back to normal attack if not dual-wielding) |
| 20 | Function 19 without elemental damage |
| 21 | Throwing weapon damage + skill elemental damage |
| 22 | Dual-throwing display, two values |
| 23 | Variant of 17 (physical + elemental separate) |
| 24 | Variant of 5 |
| 25 | Function 5 with calc1/calc2 percent multiplier on min/max |
| 26 | Weapon damage and skill damage shown as two values |
| 27 | D2R-era extension. Used by Warlock skills (Abyss, Flame Wave, Miasma Bolt, Miasma Chains). Not documented in locbones; behavior inferred from data: physical + elemental displayed separately with periodic-damage framing. Treat as opaque. |
| 28 | D2R-era extension. Used by echoing strike only. Treat as opaque. |
Description lines — display function codes
All three description sections (desc*, dsc2*, dsc3*) use the same per-line shape:
descline<N> — display function code
desctexta<N> — first localization string key
desctextb<N> — second localization string key (alternate / plural / two-value)
desccalca<N> — first calc-DSL expression
desccalcb<N> — second calc-DSL expression
The function code (descline<N>) selects how the four inputs combine:
| Code | Parameters | Behavior |
|---|---|---|
| 0 (or empty) | — | Hidden — line is not rendered |
| 13 | texta, calca, calcb | Computes the linked-skill summon's Life value, modifies it by calca (% bonus) and calcb (flat bonus), inserts into texta |
| 31 | texta, textb, calca, calcb | Computes calca / AiCurseDivisor / calcb. Result == 1 → texta; otherwise → textb (singular/plural switch) |
| 34 | texta | Computes the linked-skill summon's Damage value and inserts into texta |
| 36 | texta, textb, calca, calcb | Computes calca / calcb. Result == 1 → texta; otherwise → textb |
| 40 | texta, textb, calca | Color-formatted line. calca is a color code (0–12, ranging from white through red, green, blue, gold, grey, purple, etc.); inserts textb into texta in that color. Used for styled headers, not stat values. |
| 56 | — | Inserts the quantity of the linked item into the scrollbooktext string (used for scrolls / book skills) |
| 74 | texta, calca | Inserts calca into texta. Single-value line. |
| 75 | texta, calca, calcb | Inserts both calca and calcb into texta. Range / two-value line. |
| 76 | texta, textb, calca | Inserts textb and calca into texta. The standard synergy line — textb is the source skill name, calca is the per-point bonus expression. |
| 77 | texta, textb, calca, calcb | Inserts textb, calca, and calcb into texta. Extended synergy or two-value variant. |
Section line counts: desc has 6 lines (descline1–descline6), dsc2 has 5 lines (dsc2line1–dsc2line5), dsc3 has 7 lines (dsc3line1–dsc3line7).
Three description sections
| Prefix | Tooltip placement |
|---|---|
desc | Main stat block — current-level and next-level values shown side-by-side in the skill tooltip |
dsc2 | Pinned lines after the main description (passive bonuses, persistent effects) |
dsc3 | Pinned lines at the bottom — conventionally synergy descriptions (code 76) and styled section headers (code 40) |
Item-proc display block
| Column | Meaning |
|---|---|
item proc text | Localization key for the description shown when this skill is granted as an item proc (charged-skill or oskill). 2 rows use it. |
item proc descline count | Number of description lines to render in the item-proc tooltip variant. |
Cross-references
- skills — each skill row's
skilldesccolumn points here. Game mechanics live in skills, not skilldesc. - missiles —
descmissile1/2/3links missile rows as reference values for tooltip calc formulas. - String tables (
string.txt,expansionstring.txt) — contain the human-readable strings that the localization keys here resolve to. Not in d2r-query.
Worked example: Abyss
Abyss is the Warlock summoning spell that drops poison sigils — a useful walkthrough because it touches every part of the table: a D2R-era descdam extension, a styled section-header line, and four real synergy lines.
| Column | Value | Reading |
|---|---|---|
skilldesc | abyss | Row name |
SkillPage | 3 | Tab 3 |
SkillRow | 6, SkillColumn 3 | Top-right slot of the tree |
str name | AbyssName | Localization key for "Abyss" |
descdam | 27 | D2R-era display routine — Warlock skills only |
The dsc3 block — read it line by line, the line numbers don't all mean the same thing:
| Line | Code | Reading |
|---|---|---|
dsc3line1=40, dsc3textb1=AbyssName, dsc3calca1=2 | 40 = color-formatted header | Renders "Abyss" in the color whose code is 2 (green) — a styled section title, not a synergy entry. |
dsc3line2=76, dsc3textb2=MiasmaBoltName, dsc3calca2=par8 | 76 = synergy line | "Miasma Bolt" boost — par8 is the per-point % bonus from the linked skill's Param8 column. Lives under the Magdplev (magic damage per level) text template. |
dsc3line3=76, dsc3textb3=MiasmaBoltName, dsc3calca3=par8 | 76 = synergy line | Same source skill (Miasma Bolt) but a different stat — the AMDImm template (AoE / immunity-related). Synergies routinely contribute to two distinct stats. |
dsc3line4=76, dsc3textb4=MiasmaChainName, dsc3calca4=par8 | 76 = synergy line | Miasma Chains synergy under the Magdplev template. |
dsc3line5=76, dsc3textb5=MiasmaChainName, dsc3calca5=par8 | 76 = synergy line | Miasma Chains under the AMDImm template. |
dsc3line6/7 | empty | Unused. |
Code 76 simply renders "[textb] [texta-template-with-calca-substituted]" — the actual phrasing ("adds %d% per point", "increases magic damage by %d%") comes from whichever string the texta localization key resolves to, not from this table. Don't paraphrase it as "[textb] adds [calca]% per level" without reading the string template.
-- All Warlock skills with their tree positions
SELECT s.skill, sd.SkillPage, sd.SkillRow, sd.SkillColumn,
sd."str name", sd.descdam
FROM skills s
JOIN skilldesc sd ON s.skilldesc = sd.skilldesc
WHERE s.charclass = 'war'
ORDER BY sd.SkillPage,
CAST(sd.SkillRow AS INTEGER),
CAST(sd.SkillColumn AS INTEGER);
-- Every dsc3 synergy line (descline 76) and its source-skill localization key
SELECT skilldesc,
dsc3textb1 AS source1, dsc3calca1 AS bonus1,
dsc3textb2 AS source2, dsc3calca2 AS bonus2,
dsc3textb3 AS source3, dsc3calca3 AS bonus3
FROM skilldesc
WHERE dsc3line1 = '76' OR dsc3line2 = '76' OR dsc3line3 = '76'
ORDER BY skilldesc
LIMIT 20;
-- All skills using the D2R-era descdam extensions
SELECT skilldesc, descdam
FROM skilldesc
WHERE descdam IN ('27', '28')
ORDER BY descdam, skilldesc;