Mechanics

skilldesc

Tooltip and skill-tree UI configuration for every player skill — icon position, localization string keys, and the three-section description line system with calc-DSL formulas.

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

ColumnMeaning
skilldescDescriptor name (primary lookup key). Referenced by skills.skilldesc.
SkillPageSkill tree tab. 0 = not displayed on any page; 1 = Tab 1; 2 = Tab 2; 3 = Tab 3.
SkillRowRow within the tab. 0 = not displayed; 1–6 = rows on the skill tree.
SkillColumnColumn within the tab. 0 = not displayed; 1 = left; 2 = middle; 3 = right.
ListRowPosition in the skill-select UI panel. 0 = common row; 1/2/3 = tree-specific rows; any other value = hidden from skill-select.
IconCelFrame index into the skill icon sprite sheet. Frame + 1 is used for the "pressed" visual state.
HireableIconCelIcon override for hireable (mercenary) versions of the skill. No pressed-state variant.

Tooltip string keys

ColumnMeaning
str nameLocalization key for the skill's display name in the tooltip header.
str shortKey for the brief description shown in shortcut bars and the skill-select overlay.
str longKey for the longer description shown on the skill tree hover.
str altKey for the skill name on the Character Screen when the skill is selected (labels the active skill button).

Damage display block

ColumnMeaning
descdamFunction code selecting how the damage line is computed and displayed. 0 = hidden.
ddam calc1 / ddam calc2Calc-DSL inputs to certain descdam functions (function 7 uses them as percent and flat bonuses).
p1dmelem / p1dmmin / p1dmmaxElement 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 / p2dmmaxSecond charge-up damage component.
p3dmelem / p3dmmin / p3dmmaxThird charge-up damage component.
descattDisplay 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/3Links 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

CodeBehavior
0Hidden — no damage line shown
1Basic attack damage (uses ddam calc1 as % bonus, ddam calc2 as flat bonus)
2Kick damage
3Throwing weapon damage
4Left-hand throwing damage
5Equipped weapon damage + skill physical and elemental damage
6Variant of 5 with elemental damage carry-over from the source missile
7Skill damage with ddam calc1 as % bonus, ddam calc2 as flat bonus (most common spell display)
8Periodic elemental damage display, every 25 frames (calc1 = multiplier, calc2 = divisor)
9Periodic elemental damage, multiplier always 3
10Holy Shield-style: shield-damage + skill bonus + Str/Dex stat bonuses
11Weapon damage + per-element percent additions from skill Calc1/Calc2/Calc3
12Concentration aura conditional bonus (Expansion vs. Classic branches)
13Throwing damage with Calc1 percent bonus
14Skill damage with Param5 overall percent penalty
15Skill damage + Param1/Param2 linear charge bonus + boot damage
16Skill damage + Calc1 charge bonus + boot damage
17Skill damage with physical + elemental displayed separately
18Function 7 variant
19Dual-wielding attack (falls back to normal attack if not dual-wielding)
20Function 19 without elemental damage
21Throwing weapon damage + skill elemental damage
22Dual-throwing display, two values
23Variant of 17 (physical + elemental separate)
24Variant of 5
25Function 5 with calc1/calc2 percent multiplier on min/max
26Weapon damage and skill damage shown as two values
27D2R-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.
28D2R-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:

CodeParametersBehavior
0 (or empty)Hidden — line is not rendered
13texta, calca, calcbComputes the linked-skill summon's Life value, modifies it by calca (% bonus) and calcb (flat bonus), inserts into texta
31texta, textb, calca, calcbComputes calca / AiCurseDivisor / calcb. Result == 1 → texta; otherwise → textb (singular/plural switch)
34textaComputes the linked-skill summon's Damage value and inserts into texta
36texta, textb, calca, calcbComputes calca / calcb. Result == 1 → texta; otherwise → textb
40texta, textb, calcaColor-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.
56Inserts the quantity of the linked item into the scrollbooktext string (used for scrolls / book skills)
74texta, calcaInserts calca into texta. Single-value line.
75texta, calca, calcbInserts both calca and calcb into texta. Range / two-value line.
76texta, textb, calcaInserts textb and calca into texta. The standard synergy line — textb is the source skill name, calca is the per-point bonus expression.
77texta, textb, calca, calcbInserts textb, calca, and calcb into texta. Extended synergy or two-value variant.

Section line counts: desc has 6 lines (descline1descline6), dsc2 has 5 lines (dsc2line1dsc2line5), dsc3 has 7 lines (dsc3line1dsc3line7).

Three description sections

PrefixTooltip placement
descMain stat block — current-level and next-level values shown side-by-side in the skill tooltip
dsc2Pinned lines after the main description (passive bonuses, persistent effects)
dsc3Pinned lines at the bottom — conventionally synergy descriptions (code 76) and styled section headers (code 40)

Item-proc display block

ColumnMeaning
item proc textLocalization 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 countNumber of description lines to render in the item-proc tooltip variant.

Cross-references

  • skills — each skill row's skilldesc column points here. Game mechanics live in skills, not skilldesc.
  • missilesdescmissile1/2/3 links 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.

ColumnValueReading
skilldescabyssRow name
SkillPage3Tab 3
SkillRow6, SkillColumn 3Top-right slot of the tree
str nameAbyssNameLocalization key for "Abyss"
descdam27D2R-era display routine — Warlock skills only

The dsc3 block — read it line by line, the line numbers don't all mean the same thing:

LineCodeReading
dsc3line1=40, dsc3textb1=AbyssName, dsc3calca1=240 = color-formatted headerRenders "Abyss" in the color whose code is 2 (green) — a styled section title, not a synergy entry.
dsc3line2=76, dsc3textb2=MiasmaBoltName, dsc3calca2=par876 = 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=par876 = synergy lineSame 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=par876 = synergy lineMiasma Chains synergy under the Magdplev template.
dsc3line5=76, dsc3textb5=MiasmaChainName, dsc3calca5=par876 = synergy lineMiasma Chains under the AMDImm template.
dsc3line6/7emptyUnused.

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;