Mechanics

skills

Every skill in the game — class, requirements, mana cost, damage scaling, function-pointer columns, and the per-skill calc/Param input fields.

skills.txt is the largest schema in the game data — every active ability, passive, aura, mastery, and engine-internal pseudo-skill lives here, with the columns describing how the ability behaves on the server, how it renders on the client, what missiles it spawns, what state it applies, what damage it deals (physical and elemental, with per-level scaling), what mana it costs, what it requires, and which class it belongs to. Other tables consult this table for skill IDs, costs, prerequisites, and item-mod scaling.

429 rows, 322 columns. The 8 player classes contribute exactly 30 skills each (240 total class skills); the remaining 189 rows are monster skills, hireling skills, item-effect skills (the proc skills used by Properties.txt), summon skills, and engine-internal pseudo-skills (SwapWeapons, Map, ShowItems, RunToggle — 4 rows are flagged InGame=blank, treated as control inputs rather than combat abilities).

The 322 columns are wide because each row carries the full configuration for both the server-side and client-side execution paths, plus the visual / audio overlay set, the aura system, the passive system, the summoning system, the progressive-charge system, the item-triggered variants, and ten generic numeric calc fields and twenty generic Param fields used as inputs to the skill-specific functions.

Architecture: function pointers + numeric inputs

Skills are not described declaratively in this table. Instead, each row points to a numbered C function in the engine (one for the server-side start, one for the server-side do, one for the client-side mirror, etc.) and provides the numeric inputs those functions consume. The pattern is consistent throughout the schema:

  • Function-pointer columns (srvstfunc, srvdofunc, cltstfunc, cltdofunc, etc.) hold a numeric ID corresponding to a hard-coded engine routine. The same routine may serve dozens of skills with different parameter values.
  • Generic input columns (calc1calc10, Param1Param20) hold the numeric values those functions consume. Each generic column is paired with a sibling comment column (*calc1 desc, *Param1 Description) so authors can remember what a particular skill is using each slot for. The * prefix marks it as a comment field the engine ignores.
  • Specialized columns (mana, requirements, damage scaling, missile pointers, target flags) configure the framework around the function call.

This means understanding a skill row requires looking at three layers: which function it dispatches to, which generic inputs that function reads, and which framework columns gate when the function runs. The function-code tables below are large because they enumerate the entire dispatch space — but a typical row uses only a handful of codes and fills only a few calc / Param slots.

What's in a row

The 322 columns split into the following functional groups.

Identity

ColumnMeaning
skillUnique skill name. The row order in the file determines the engine's skill ID, so rows must not be reordered.
*IdNumeric index — comment-only mirror of the row's position.
charclassPlayer-class binding (ama, sor, nec, pal, bar, dru, ass, war). When set, the skill is class-specific (gated for that class, eligible for class-skill bonuses, scaled by class-skill +N item modifiers). Blank = a non-class skill (monster ability, item-trigger skill, engine pseudo-skill).
skilldescPointer to a SkillDesc.txt row that controls the tooltip and skill-tree UI display.

Server-side execution: start / do / stop

The runtime executes a skill in three phases. Each phase has a function-pointer column and an optional progressive-charge variant.

ColumnMeaning
srvstfuncServer Start function ID — runs when the cast begins (validates target, consumes mana, sets up state). The engine documents 68 numbered routines, ranging from generic (1 = standard melee Attack, 2 = Kick, 3 = Unsummon) to highly specialized per-skill implementations (e.g. Whirlwind, Blade Fury, Battle Cry, Diablo's Lightning Inferno).
srvdofuncServer Do function ID — runs at the skill's "do" frame (deals damage, spawns missiles, summons pets). The engine documents 150+ numbered routines, organized roughly by class prefix (Ama*, Sor*, Nec*, Pal*, Bar*, Dru*, Ass*, Mon*).
srvstopfuncServer Stop function ID — cleanup when the skill ends. Mostly used for sustained skills (Whirlwind).
prgstack1 = the skill stacks progressive charges in a queue rather than overwriting them.
srvprgfunc1 / srvprgfunc2 / srvprgfunc3Three alternate Do functions selected by the unit's progressive-charge count. Used by charge-up skills (Tiger Strike → Cobra Strike → Phoenix Strike).
prgcalc1 / prgcalc2 / prgcalc3Per-charge calc inputs to the progressive functions.
prgdamPer-charge damage multiplier.

Missiles

ColumnMeaning
srvmissileThe primary missile this skill spawns server-side. Pointer to a Missiles.txt row.
srvmissilea / srvmissileb / srvmissilecAlternate missiles selected by progressive charges or other branching logic in the server function.
useServerMissilesOnRemoteClients1 = remote clients render the server's missiles instead of their own client-side reproduction.
srvoverlayServer-side overlay applied during the skill execution.
decquant1 = consume one ammunition unit per cast.
lob1 = launch the missile via the lobbing-trajectory function (arcs upward) rather than a linear path.

Aura system

A large block of columns implements skills that apply ongoing state effects within a radius. Auras are skills with aura = 1 that periodically run their server function (every perdelay frames) while active.

ColumnMeaning
aurafilterBit-mask filter selecting which target types the aura affects.
aurastateThe state code (from States.txt) that marks the aura as active on the caster.
auratargetstateThe state code applied to units affected by the aura.
auralencalcCalc formula controlling the duration of the applied state.
aurarangecalcCalc formula controlling the aura's radius.
aurastat1aurastat6Up to six stats granted by the aura's state. References to itemstatcost.Stat.
aurastatcalc1aurastatcalc6Calc formulas for the corresponding stat values.
auraevent1auraevent4Event hooks the aura responds to (from Events.txt).
auraeventfunc1auraeventfunc4Event-handler functions invoked when the corresponding event fires.

Passive system

For skills with passive = 1. 30 of 429 rows are passive — Mastery skills, Iron Skin, Natural Resistance, all the +X-to-stat skills that take effect on level-up rather than on cast.

ColumnMeaning
passivestateThe persistent state code (from States.txt) applied to the caster while the passive is learned.
passiveitypeItem-type gate — passive only applies when the unit has an equipped item of this type. Used for weapon Masteries (e.g. Sword Mastery requires swor).
passivereqweaponcountNumber of equipped weapons required for the passive to fire (used by dual-wield-only passives).
passivestat1passivestat14Up to 14 stats granted by the passive. References to itemstatcost.Stat.
passivecalc1passivecalc14Calc formulas for the corresponding stat values.

Summon system

For skills that create pets (Raise Skeleton, Valkyrie, Iron Golem, Shadow Master, Hydra, etc.).

ColumnMeaning
summonThe unit class (from monstats.txt) of the summoned pet.
pettypePointer to PetType.txt defining shared properties (max count per skill, replacement rules, AI archetype).
petmaxHard cap on the number of pets of this type the caster can have active.
requirespettypeRequired existing pet type — used by upgrades that depend on a base pet (e.g. Skeletal Mage requires that the Necromancer has the basic Raise Skeleton learned).
summodeAnimation mode the summon plays on creation.
sumskill1sumskill5Skills granted to the summoned pet at creation.
sumsk1calcsumsk5calcCalc formulas for the granted skill levels.
sumumodUnique-monster modifier to apply to the pet (from MonUMod.txt).
sumoverlayOverlay applied on the pet at summon time.

Sounds and overlays

ColumnMeaning
stsound, stsoundclass, stsounddelaySounds played at the skill's start frame.
weaponsnd1 = play the weapon's swing sound on the start frame.
dosound, dosound a, dosound bSounds played at the do frame (a for player casters, b for monster casters).
tgtoverlay, tgtsoundOverlay and sound applied to the target.
prgoverlay, prgsoundProgressive-charge visual / audio cues.
castoverlayOverlay on the caster during the cast animation.
cltoverlaya, cltoverlaybClient-side overlay variants.
stsuccessonly1 = the start sound only plays if the skill validation succeeded (so failed casts don't trigger the sound).

Client-side execution

Mirrors the server-side execution structure for client-only effects (visual missiles, sound effects, animation timing). The client side is what other players see.

ColumnMeaning
cltstfuncClient Start function ID. 53 numbered routines documented.
cltdofuncClient Do function ID. 96 numbered routines documented.
cltstopfuncClient Stop function ID. Only one routine besides "do nothing": 1 = Whirlwind cleanup.
cltprgfunc1 / cltprgfunc2 / cltprgfunc3Per-charge client Do variants for progressive skills.
cltmissilePrimary client-side missile.
cltmissilea / cltmissileb / cltmissilec / cltmissiledAlternate client missiles selected by progressive charges or other branching.
cltcalc1 / cltcalc2 / cltcalc3 (+ *cltcalc# desc)Calc inputs to the client functions, with sibling comment columns.

Skill behavior flags

ColumnMeaning
warp1 = skill warps/teleports the unit; trigger a scene-transition loading screen if needed.
immediate1 = a periodic skill fires immediately on activation (otherwise waits one perdelay).
enhanceable1 = included in "+N to All Skills" item modifiers.
attackrankAI scoring — higher value = AI more likely to choose this skill.
noammo1 = the skill ignores ammo requirements even if the weapon would normally consume them.
rangenone, h2h (melee weapon required), rng (ranged weapon required), both, or loc (location-based, no weapon requirement).
weapselDual-wield handling: 0 = either hand, 1 = left hand, 2 = left and/or right, 3 = always both, 4 = ignore the weapon.
requiresweapon1 = the skill cannot be cast without a valid weapon.

Item-type filters

Up to two parallel sets of item-type include / exclude filters. Each set has 3 includes and 2 excludes, so a skill can require, for example, "axe or sword, but not a two-handed sword."

ColumnMeaning
itypea1 / itypea2 / itypea3Allowed item types in set A (codes from itemtypes.txt).
etypea1 / etypea2Excluded item types in set A.
itypeb1 / itypeb2 / itypeb3Allowed item types in set B (an alternate, simultaneously-checked filter set).
etypeb1 / etypeb2Excluded item types in set B.

Animation and sequences

ColumnMeaning
animPlayer animation mode (A1, A2, SC = Spell Cast, SQ = Sequence, KK = Kick, TH = Throw, etc.). References PlrMode.txt.
seqtransIf anim = SQ, this controls how Faster Cast Rate modifies the sequence.
monanimMonster animation mode (parallel to anim for non-player casters).
seqnumIndex into a hard-coded sequence-animation table (1–23 documented; e.g. 1 = Jab, 10 = Whirlwind, 15 = Double Throw).
seqinputFrames to wait inside the sequence before re-cast is permitted.
durability1 = check item quantity / durability when the skill ends (used for ammo-consuming skills).
UseAttackRate1 = update the unit's attack speed after the skill (driven by the attackrate stat).

Targeting and validation

ColumnMeaning
LineOfSightCollision-filter mode for valid target locations. 6 documented modes.
TargetableOnly1 = the skill requires a unit target (can't be cast on empty ground).
SearchEnemyXY1 = on cast at a location, scan outward for the first enemy.
SearchEnemyNear1 = auto-find the nearest enemy (overrides SearchEnemyXY and SearchOpenXY).
SearchOpenXY1 = on cast at a location, scan outward in radius 7 for an open spot.
SelectProcCorpse-validation function ID (1=Corpse Explode, 2=Raise Skeleton, 3=Revive, 4=Heart Monster, 5=Item Monster, 6=Ward Monster).
TargetCorpse, TargetPet, TargetAlly, TargetItemPer-target-class permission flags.
AttackNoMana1 = if mana is insufficient, fall back to a basic Attack instead of failing silently.
TgtPlaceCheck1 = validate that the target location can spawn a unit (used by monster-summon skills).
KeepCursorStateOnKill, ContinueCastUnselected, ClearSelectedOnHoldMouse-input behavior flags during sustained casting.

Item-triggered execution

For the proc-skill system: when a Properties.txt mod fires a skill (e.g. "10% chance to cast level 5 Frost Nova when struck"), the engine uses these columns instead of the normal start/do functions, because the trigger context is different (no mana cost, no weapon check, possibly different target).

ColumnMeaning
ItemEffectServer Do function ID for item-triggered casts.
ItemCltEffectClient Do function ID for item-triggered casts.
ItemTgtDo1 = the item-triggered cast originates from the target instead of the caster.
ItemTargetTargeting mode (0 = attacker, 1 = caster, 2 = random nearby, 3 = nearby corpse, 4 = attacker with fallback).
ItemUseRestrict1 = honor the restrict field from States.txt for the trigger.
ItemCheckStart1 = run the normal srvstfunc for item triggers.
ItemCltCheckStart1 = run the normal cltstfunc for item triggers (used to mark dead targets unselectable).
ItemCastSound, ItemCastOverlaySound and overlay for item-triggered casts.

Skill points and requirements

ColumnMeaning
skpointsSkill Points required to invest one level in the skill. Most skills cost 1 point per level.
reqlevelMinimum character level to invest the first point. Every player class follows the same tier progression: exactly 6 skills at each of reqlevel = 1, 6, 12, 18, 24, 30 (= 30 skills per class), including Warlock. The tier breakpoints are universal.
maxlvlMaximum base level (excluding +N to skills from items). 20 for most class skills.
reqstr / reqdex / reqint / reqvitAttribute prerequisites. Rare; most class skills don't use them.
reqskill1 / reqskill2 / reqskill3Up to three prerequisite skill names. Each prerequisite must have at least one base point invested.

State restriction

ColumnMeaning
restrictHow the skill behaves under restricting states (Stunned, Frozen, etc.): 0 = cannot be used, 1 = can be used under any restrict state, 2 = can only be used under a restrict state, 3 = can be used at any time and removes the restrict state when used.
State1 / State2 / State3Specific state pointers used by restrict.

Casting timing

ColumnMeaning
localdelayCooldown for this skill specifically, in frames (25 frames = 1 second).
globaldelayCooldown for all other delay-having skills triggered by casting this one.
leftskill / rightskill1 = the skill is assignable to the left / right mouse button.
repeat1 = the skill auto-repeats while the mouse is held.
alwayshit1 = bypass the attack-rating-vs-defense check; the skill always hits.
usemanaondo1 = consume mana on the Do function instead of the Start function (so failed casts don't waste mana).

Mana cost

ColumnMeaning
startmanaMinimum mana required to begin casting. Floors the cost so per-level cost reductions can't trick the engine.
minmanaMinimum mana to actually execute the Do phase.
manashiftBit-shift modifier controlling the precision of mana-cost calculation. The engine stores mana internally in 256ths; this field is the bit-shift exponent. The actual mana cost is mana × 2^(manashift − 8). So manashift = 8 means cost-equals-mana (full integer), manashift = 7 means cost is mana / 2 (half-points), manashift = 6 means mana / 4.
manaBase mana cost at skill level 1, in raw units (interpreted by manashift).
lvlmanaPer-level change in raw mana, also interpreted by manashift.

Behavior modifiers

ColumnMeaning
interrupt1 = the skill is interruptible by being hit during the cast.
InTown1 = the skill can be cast in town.
aura1 = treat as an aura (periodic execution while the aurastate is active).
periodic1 = treat as periodic (similar to aura but not necessarily a paladin-style aura).
perdelayFrame interval between periodic executions (minimum 5).
periodicClearAura1 = the periodic execution clears the aura state on completion.
finishing1 = a finishing-move skill (consumes progressive charges differently and renders differently in the tooltip).
prgchargestocastNumber of progressive charges required to cast the skill.
prgchargesconsumedNumber of progressive charges consumed when the cast hits an enemy.
passive1 = the skill is a passive (no skill-bar slot, no Do function).
progressive1 = the skill is a charge-up skill that builds progressive charges (Tiger Strike, etc.).
scroll1 = the skill has a scroll-item version (used by item proc-skill scrolls).

Generic calculation slots

ColumnMeaning
calc1calc10Up to ten generic calc inputs. Each holds a calc formula (a small expression DSL with references like lvl, par1, min, clc1, etc., and operators like ln12, 1+lvl, etc.) or a literal numeric value. The engine functions called by srvstfunc / srvdofunc / cltdofunc read whichever of these slots they need.
*calc1 desc*calc10descComment columns the engine ignores. Authors use them to label what each calc# represents on this specific skill (e.g. "Explosion Radius", "Number of Charges", "Damage Bonus %").
Param1Param20Up to twenty generic numeric parameters. Same role as calc# but holding integer literals rather than calc-formula strings.
*Param1 Description*Param20DescriptionComment columns.

Damage (physical)

ColumnMeaning
InGame1 = the skill is enabled. 425 of 429 rows are 1 — the 4 disabled rows (SwapWeapons, Map, ShowItems, RunToggle) are engine-internal control inputs treated as skills.
ToHitBonus Attack Rating at skill level 1.
LevToHitPer-level Attack Rating bonus.
ToHitCalcCalc formula that overrides ToHit / LevToHit if not blank.
ResultFlags, HitFlagsBit-masked flags affecting the post-hit reaction and damage flow. Both are integers checked bitwise.
HitClassEncodes the physical hit type (8-bit field combining a base hit class — Hand-to-Hand, One-Handed Swing Small/Large, Two-Handed Swing, Thrust, Club, Staff, Bow, Crossbow, Claw — with a layer modifier for Fire / Cold / Lightning / Poison / Stun / Bash / Thorns / Sanctuary / Silent Voice / Goo). Drives hit sounds and overlay selection.
Kick1 = use the kick-damage formula (factors in Strength and Dexterity, ignores standard damage fields).
HitShiftDamage-precision bit shift, capped 0–8. 8 = 256/256 (100%); each step down halves the percentage.
SrcDamPercentage of weapon damage transferred to the skill (out of 128). 64 = 50% weapon-damage carryover.
MinDam / MaxDamBaseline physical damage at skill level 1.
MinLevDam1MinLevDam5Per-level physical-damage minimums across 5 level-tier brackets: levels 2–8, 9–16, 17–22, 23–28, 29+.
MaxLevDam1MaxLevDam5Per-level physical-damage maximums for the same 5 brackets.
DmgSymPerCalcCalc formula for percentage damage increase.

Damage (elemental)

The elemental block parallels the physical block — a base + 5 per-level-bracket scaling fields, plus a duration field if the elemental type has one (Cold, Burn, Poison, Freeze).

ColumnMeaning
ETypeElemental damage type (fire, cold, ltng, pois, mag, none, etc.). Empty = no elemental damage.
EMin / EMaxBaseline elemental damage at level 1.
EMinLev1EMinLev5, EMaxLev1EMaxLev5Per-level scaling across the same 5 brackets as physical damage.
EDmgSymPerCalcCalc formula for percentage elemental-damage increase.
ELenBaseline duration in frames (25 = 1 second). Only meaningful for elemental types with a duration.
ELevLen1 / ELevLen2 / ELevLen3Per-level duration scaling across 3 brackets: levels 2–8, 9–16, 17+.
ELenSymPerCalcCalc formula for duration increase.

AI and gold cost

ColumnMeaning
aitypeAI archetype affecting how mercenaries / Shadow Warriors choose this skill: 0 = none, 1 = Buff, 2 = Debuff, 3 = Summon, 4 = Melee, 5 = Ranged, 6 = Aura, 7 = Teleport, 8 = Heal, 9 = Resurrect, 10 = Passive, 11 = Area Range, 12 = Steal, 13 = Move Attack.
aibonusShadow Master AI: flat bonus added to the skill-selection score.
cost multMultiplicative gold-cost modifier (in 1024ths) when an item carries a stat referencing this skill. Read by itemstatcost.Encode codes 1–3.
cost addFlat gold-cost addition for the same purpose.

Row terminator

ColumnMeaning
*eolEnd-of-row marker, always 0. Reference-only.

Worked example: Sorceress Fire Ball

A standard tier-2 caster skill — single missile, no aura, no progressive charges, requires a prerequisite skill, scales physical-free elemental damage per level.

ColumnValueNotes
skillFire BallThe skill's unique ID.
*Id47Row index.
charclasssorSorceress class skill.
skilldescfire ballTooltip pointer to SkillDesc.txt.
srvmissilefireballThe server spawns the fireball missile from Missiles.txt; that missile carries the explosion behavior, so the skill itself doesn't need a custom srvdofunc.
reqlevel / maxlvl12 / 20Available at character level 12, hard cap 20 base points.
reqskill1Fire BoltAt least 1 base point in Fire Bolt is required to learn Fire Ball.
mana / lvlmana / manashift10 / 1 / 7With manashift = 7, the actual cost is mana / 2. So skill level 1 = 10/2 = 5 mana; level 2 = 11/2 = 5.5 mana; +0.5 mana per level.
ETypefireElemental damage type.
EMin / EMax12 / 28Skill level 1 deals 12–28 fire damage.
EMinLev1 / EMaxLev113 / 15At level 2 (in the 2–8 bracket), damage becomes 12+13 to 28+15 = 25–43; at level 3, 38–58; etc.
animSCSpell-Cast animation.
rangenoneNo weapon-type restriction (Sorceresses commonly cast unarmed or with a staff).
leftskill / rightskill1 / 1Assignable to either mouse button.
calc1 / *calc1 descpar1 / Explosion RadiusThe skill reuses the engine's missile-explosion logic; calc1 = par1 means it reads the explosion radius from Param1 of this skill row. The comment column documents that for the modder's benefit.

Notice what's not populated: no srvstfunc or srvdofunc (the missile carries the behavior), no MinDam/MaxDam (no physical damage), no aura columns, no passive columns, no summon columns, no progressive columns. Most of the 322 columns are blank for a typical caster missile — they exist for the rare skills that need them.

Worked example: Paladin Concentration aura

A passive-style aura that auto-runs while active.

ColumnValueNotes
skillConcentrationSkill name.
*Id113Row index.
charclasspalPaladin.
reqlevel / maxlvl18 / 20Tier-3 aura.
mana / manashift0 / 8No per-cast mana — auras consume mana via different bookkeeping. manashift=8 is the default.
aura1Marks the row as an aura.
perdelay50The aura's server function fires every 50 frames (= 2 seconds) while active.
aurastateconcentrationWhen active, the caster is marked with the concentration state from States.txt. Item-mod systems and other skills that interact with auras read this state.
leftskill / rightskill0 / 1Right-mouse-only (Paladin auras always go on the right hand).

All 16 Paladin auras share perdelay = 50 and the same overall structure — they differ in aurastate, aurastat1aurastat6 (which stats they grant), and the calc formulas controlling those stats' values.

Cross-references

  • SkillDesc.txtskilldesc references this table for tooltip strings, icons, skill-tree positions, and synergy descriptions.
  • Missiles.txtsrvmissile / srvmissile[abc] and cltmissile / cltmissile[abcd] reference missile rows here for projectile behavior, damage, and visual.
  • States.txtaurastate, auratargetstate, passivestate, State1State3 reference state codes here.
  • Properties.txt — proc-skill and class-skill mods reference skills here by *Id or by skill name; gold-cost calculations use this table's cost mult / cost add.
  • itemstatcost.txtaurastat1aurastat6 and passivestat1passivestat14 reference stat names here; Encode = 1/2/3 stats consult cost mult / cost add.
  • monstats.txt — monster skills (the rows where charclass is blank and the skill is referenced as a monster's Skill1Skill8) bind monsters to skills defined here.
  • PetType.txtpettype references this table for pet-summon shared properties.
  • MonStats2.txt — many srvdofunc codes consult MonStats2.txt flags (e.g. soft, large, small) to branch behavior.
  • PlrMode.txt / MonMode.txtanim / monanim reference player and monster animation modes.
  • PlayerClass.txtcharclass references this table.
  • itemtypes.txtitypea1itypea3, etypea1etypea2, itypeb1itypeb3, etypeb1etypeb2, and passiveitype reference item-type codes here.
  • Sounds.txt, Overlay.txt, Events.txt — sound, overlay, and event hooks throughout the schema reference these tables.
  • CharStats.txtMana per Magic, Life per Vitality, Stamina per Vitality are consulted indirectly via itemstatcost op functions when stats granted by skills/auras are calculated.