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.
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 (
calc1–calc10, Param1–Param20) 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
| Column | Meaning |
|---|
skill | Unique skill name. The row order in the file determines the engine's skill ID, so rows must not be reordered. |
*Id | Numeric index — comment-only mirror of the row's position. |
charclass | Player-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). |
skilldesc | Pointer 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.
| Column | Meaning |
|---|
srvstfunc | Server 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). |
srvdofunc | Server 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*). |
srvstopfunc | Server Stop function ID — cleanup when the skill ends. Mostly used for sustained skills (Whirlwind). |
prgstack | 1 = the skill stacks progressive charges in a queue rather than overwriting them. |
srvprgfunc1 / srvprgfunc2 / srvprgfunc3 | Three alternate Do functions selected by the unit's progressive-charge count. Used by charge-up skills (Tiger Strike → Cobra Strike → Phoenix Strike). |
prgcalc1 / prgcalc2 / prgcalc3 | Per-charge calc inputs to the progressive functions. |
prgdam | Per-charge damage multiplier. |
Missiles
| Column | Meaning |
|---|
srvmissile | The primary missile this skill spawns server-side. Pointer to a Missiles.txt row. |
srvmissilea / srvmissileb / srvmissilec | Alternate missiles selected by progressive charges or other branching logic in the server function. |
useServerMissilesOnRemoteClients | 1 = remote clients render the server's missiles instead of their own client-side reproduction. |
srvoverlay | Server-side overlay applied during the skill execution. |
decquant | 1 = consume one ammunition unit per cast. |
lob | 1 = 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.
| Column | Meaning |
|---|
aurafilter | Bit-mask filter selecting which target types the aura affects. |
aurastate | The state code (from States.txt) that marks the aura as active on the caster. |
auratargetstate | The state code applied to units affected by the aura. |
auralencalc | Calc formula controlling the duration of the applied state. |
aurarangecalc | Calc formula controlling the aura's radius. |
aurastat1 … aurastat6 | Up to six stats granted by the aura's state. References to itemstatcost.Stat. |
aurastatcalc1 … aurastatcalc6 | Calc formulas for the corresponding stat values. |
auraevent1 … auraevent4 | Event hooks the aura responds to (from Events.txt). |
auraeventfunc1 … auraeventfunc4 | Event-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.
| Column | Meaning |
|---|
passivestate | The persistent state code (from States.txt) applied to the caster while the passive is learned. |
passiveitype | Item-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). |
passivereqweaponcount | Number of equipped weapons required for the passive to fire (used by dual-wield-only passives). |
passivestat1 … passivestat14 | Up to 14 stats granted by the passive. References to itemstatcost.Stat. |
passivecalc1 … passivecalc14 | Calc formulas for the corresponding stat values. |
Summon system
For skills that create pets (Raise Skeleton, Valkyrie, Iron Golem, Shadow Master, Hydra, etc.).
| Column | Meaning |
|---|
summon | The unit class (from monstats.txt) of the summoned pet. |
pettype | Pointer to PetType.txt defining shared properties (max count per skill, replacement rules, AI archetype). |
petmax | Hard cap on the number of pets of this type the caster can have active. |
requirespettype | Required 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). |
summode | Animation mode the summon plays on creation. |
sumskill1 … sumskill5 | Skills granted to the summoned pet at creation. |
sumsk1calc … sumsk5calc | Calc formulas for the granted skill levels. |
sumumod | Unique-monster modifier to apply to the pet (from MonUMod.txt). |
sumoverlay | Overlay applied on the pet at summon time. |
Sounds and overlays
| Column | Meaning |
|---|
stsound, stsoundclass, stsounddelay | Sounds played at the skill's start frame. |
weaponsnd | 1 = play the weapon's swing sound on the start frame. |
dosound, dosound a, dosound b | Sounds played at the do frame (a for player casters, b for monster casters). |
tgtoverlay, tgtsound | Overlay and sound applied to the target. |
prgoverlay, prgsound | Progressive-charge visual / audio cues. |
castoverlay | Overlay on the caster during the cast animation. |
cltoverlaya, cltoverlayb | Client-side overlay variants. |
stsuccessonly | 1 = 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.
| Column | Meaning |
|---|
cltstfunc | Client Start function ID. 53 numbered routines documented. |
cltdofunc | Client Do function ID. 96 numbered routines documented. |
cltstopfunc | Client Stop function ID. Only one routine besides "do nothing": 1 = Whirlwind cleanup. |
cltprgfunc1 / cltprgfunc2 / cltprgfunc3 | Per-charge client Do variants for progressive skills. |
cltmissile | Primary client-side missile. |
cltmissilea / cltmissileb / cltmissilec / cltmissiled | Alternate 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
| Column | Meaning |
|---|
warp | 1 = skill warps/teleports the unit; trigger a scene-transition loading screen if needed. |
immediate | 1 = a periodic skill fires immediately on activation (otherwise waits one perdelay). |
enhanceable | 1 = included in "+N to All Skills" item modifiers. |
attackrank | AI scoring — higher value = AI more likely to choose this skill. |
noammo | 1 = the skill ignores ammo requirements even if the weapon would normally consume them. |
range | none, h2h (melee weapon required), rng (ranged weapon required), both, or loc (location-based, no weapon requirement). |
weapsel | Dual-wield handling: 0 = either hand, 1 = left hand, 2 = left and/or right, 3 = always both, 4 = ignore the weapon. |
requiresweapon | 1 = 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."
| Column | Meaning |
|---|
itypea1 / itypea2 / itypea3 | Allowed item types in set A (codes from itemtypes.txt). |
etypea1 / etypea2 | Excluded item types in set A. |
itypeb1 / itypeb2 / itypeb3 | Allowed item types in set B (an alternate, simultaneously-checked filter set). |
etypeb1 / etypeb2 | Excluded item types in set B. |
Animation and sequences
| Column | Meaning |
|---|
anim | Player animation mode (A1, A2, SC = Spell Cast, SQ = Sequence, KK = Kick, TH = Throw, etc.). References PlrMode.txt. |
seqtrans | If anim = SQ, this controls how Faster Cast Rate modifies the sequence. |
monanim | Monster animation mode (parallel to anim for non-player casters). |
seqnum | Index into a hard-coded sequence-animation table (1–23 documented; e.g. 1 = Jab, 10 = Whirlwind, 15 = Double Throw). |
seqinput | Frames to wait inside the sequence before re-cast is permitted. |
durability | 1 = check item quantity / durability when the skill ends (used for ammo-consuming skills). |
UseAttackRate | 1 = update the unit's attack speed after the skill (driven by the attackrate stat). |
Targeting and validation
| Column | Meaning |
|---|
LineOfSight | Collision-filter mode for valid target locations. 6 documented modes. |
TargetableOnly | 1 = the skill requires a unit target (can't be cast on empty ground). |
SearchEnemyXY | 1 = on cast at a location, scan outward for the first enemy. |
SearchEnemyNear | 1 = auto-find the nearest enemy (overrides SearchEnemyXY and SearchOpenXY). |
SearchOpenXY | 1 = on cast at a location, scan outward in radius 7 for an open spot. |
SelectProc | Corpse-validation function ID (1=Corpse Explode, 2=Raise Skeleton, 3=Revive, 4=Heart Monster, 5=Item Monster, 6=Ward Monster). |
TargetCorpse, TargetPet, TargetAlly, TargetItem | Per-target-class permission flags. |
AttackNoMana | 1 = if mana is insufficient, fall back to a basic Attack instead of failing silently. |
TgtPlaceCheck | 1 = validate that the target location can spawn a unit (used by monster-summon skills). |
KeepCursorStateOnKill, ContinueCastUnselected, ClearSelectedOnHold | Mouse-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).
| Column | Meaning |
|---|
ItemEffect | Server Do function ID for item-triggered casts. |
ItemCltEffect | Client Do function ID for item-triggered casts. |
ItemTgtDo | 1 = the item-triggered cast originates from the target instead of the caster. |
ItemTarget | Targeting mode (0 = attacker, 1 = caster, 2 = random nearby, 3 = nearby corpse, 4 = attacker with fallback). |
ItemUseRestrict | 1 = honor the restrict field from States.txt for the trigger. |
ItemCheckStart | 1 = run the normal srvstfunc for item triggers. |
ItemCltCheckStart | 1 = run the normal cltstfunc for item triggers (used to mark dead targets unselectable). |
ItemCastSound, ItemCastOverlay | Sound and overlay for item-triggered casts. |
Skill points and requirements
| Column | Meaning |
|---|
skpoints | Skill Points required to invest one level in the skill. Most skills cost 1 point per level. |
reqlevel | Minimum 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. |
maxlvl | Maximum base level (excluding +N to skills from items). 20 for most class skills. |
reqstr / reqdex / reqint / reqvit | Attribute prerequisites. Rare; most class skills don't use them. |
reqskill1 / reqskill2 / reqskill3 | Up to three prerequisite skill names. Each prerequisite must have at least one base point invested. |
State restriction
| Column | Meaning |
|---|
restrict | How 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 / State3 | Specific state pointers used by restrict. |
Casting timing
| Column | Meaning |
|---|
localdelay | Cooldown for this skill specifically, in frames (25 frames = 1 second). |
globaldelay | Cooldown for all other delay-having skills triggered by casting this one. |
leftskill / rightskill | 1 = the skill is assignable to the left / right mouse button. |
repeat | 1 = the skill auto-repeats while the mouse is held. |
alwayshit | 1 = bypass the attack-rating-vs-defense check; the skill always hits. |
usemanaondo | 1 = consume mana on the Do function instead of the Start function (so failed casts don't waste mana). |
Mana cost
| Column | Meaning |
|---|
startmana | Minimum mana required to begin casting. Floors the cost so per-level cost reductions can't trick the engine. |
minmana | Minimum mana to actually execute the Do phase. |
manashift | Bit-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. |
mana | Base mana cost at skill level 1, in raw units (interpreted by manashift). |
lvlmana | Per-level change in raw mana, also interpreted by manashift. |
Behavior modifiers
| Column | Meaning |
|---|
interrupt | 1 = the skill is interruptible by being hit during the cast. |
InTown | 1 = the skill can be cast in town. |
aura | 1 = treat as an aura (periodic execution while the aurastate is active). |
periodic | 1 = treat as periodic (similar to aura but not necessarily a paladin-style aura). |
perdelay | Frame interval between periodic executions (minimum 5). |
periodicClearAura | 1 = the periodic execution clears the aura state on completion. |
finishing | 1 = a finishing-move skill (consumes progressive charges differently and renders differently in the tooltip). |
prgchargestocast | Number of progressive charges required to cast the skill. |
prgchargesconsumed | Number of progressive charges consumed when the cast hits an enemy. |
passive | 1 = the skill is a passive (no skill-bar slot, no Do function). |
progressive | 1 = the skill is a charge-up skill that builds progressive charges (Tiger Strike, etc.). |
scroll | 1 = the skill has a scroll-item version (used by item proc-skill scrolls). |
Generic calculation slots
| Column | Meaning |
|---|
calc1 … calc10 | Up 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 … *calc10desc | Comment 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 %"). |
Param1 … Param20 | Up to twenty generic numeric parameters. Same role as calc# but holding integer literals rather than calc-formula strings. |
*Param1 Description … *Param20Description | Comment columns. |
Damage (physical)
| Column | Meaning |
|---|
InGame | 1 = 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. |
ToHit | Bonus Attack Rating at skill level 1. |
LevToHit | Per-level Attack Rating bonus. |
ToHitCalc | Calc formula that overrides ToHit / LevToHit if not blank. |
ResultFlags, HitFlags | Bit-masked flags affecting the post-hit reaction and damage flow. Both are integers checked bitwise. |
HitClass | Encodes 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. |
Kick | 1 = use the kick-damage formula (factors in Strength and Dexterity, ignores standard damage fields). |
HitShift | Damage-precision bit shift, capped 0–8. 8 = 256/256 (100%); each step down halves the percentage. |
SrcDam | Percentage of weapon damage transferred to the skill (out of 128). 64 = 50% weapon-damage carryover. |
MinDam / MaxDam | Baseline physical damage at skill level 1. |
MinLevDam1 … MinLevDam5 | Per-level physical-damage minimums across 5 level-tier brackets: levels 2–8, 9–16, 17–22, 23–28, 29+. |
MaxLevDam1 … MaxLevDam5 | Per-level physical-damage maximums for the same 5 brackets. |
DmgSymPerCalc | Calc 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).
| Column | Meaning |
|---|
EType | Elemental damage type (fire, cold, ltng, pois, mag, none, etc.). Empty = no elemental damage. |
EMin / EMax | Baseline elemental damage at level 1. |
EMinLev1 … EMinLev5, EMaxLev1 … EMaxLev5 | Per-level scaling across the same 5 brackets as physical damage. |
EDmgSymPerCalc | Calc formula for percentage elemental-damage increase. |
ELen | Baseline duration in frames (25 = 1 second). Only meaningful for elemental types with a duration. |
ELevLen1 / ELevLen2 / ELevLen3 | Per-level duration scaling across 3 brackets: levels 2–8, 9–16, 17+. |
ELenSymPerCalc | Calc formula for duration increase. |
AI and gold cost
| Column | Meaning |
|---|
aitype | AI 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. |
aibonus | Shadow Master AI: flat bonus added to the skill-selection score. |
cost mult | Multiplicative gold-cost modifier (in 1024ths) when an item carries a stat referencing this skill. Read by itemstatcost.Encode codes 1–3. |
cost add | Flat gold-cost addition for the same purpose. |
Row terminator
| Column | Meaning |
|---|
*eol | End-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.
| Column | Value | Notes |
|---|
skill | Fire Ball | The skill's unique ID. |
*Id | 47 | Row index. |
charclass | sor | Sorceress class skill. |
skilldesc | fire ball | Tooltip pointer to SkillDesc.txt. |
srvmissile | fireball | The 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 / maxlvl | 12 / 20 | Available at character level 12, hard cap 20 base points. |
reqskill1 | Fire Bolt | At least 1 base point in Fire Bolt is required to learn Fire Ball. |
mana / lvlmana / manashift | 10 / 1 / 7 | With 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. |
EType | fire | Elemental damage type. |
EMin / EMax | 12 / 28 | Skill level 1 deals 12–28 fire damage. |
EMinLev1 / EMaxLev1 | 13 / 15 | At level 2 (in the 2–8 bracket), damage becomes 12+13 to 28+15 = 25–43; at level 3, 38–58; etc. |
anim | SC | Spell-Cast animation. |
range | none | No weapon-type restriction (Sorceresses commonly cast unarmed or with a staff). |
leftskill / rightskill | 1 / 1 | Assignable to either mouse button. |
calc1 / *calc1 desc | par1 / Explosion Radius | The 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.
| Column | Value | Notes |
|---|
skill | Concentration | Skill name. |
*Id | 113 | Row index. |
charclass | pal | Paladin. |
reqlevel / maxlvl | 18 / 20 | Tier-3 aura. |
mana / manashift | 0 / 8 | No per-cast mana — auras consume mana via different bookkeeping. manashift=8 is the default. |
aura | 1 | Marks the row as an aura. |
perdelay | 50 | The aura's server function fires every 50 frames (= 2 seconds) while active. |
aurastate | concentration | When 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 / rightskill | 0 / 1 | Right-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, aurastat1–aurastat6 (which stats they grant), and the calc formulas controlling those stats' values.
Cross-references
SkillDesc.txt — skilldesc references this table for tooltip strings, icons, skill-tree positions, and synergy descriptions.
Missiles.txt — srvmissile / srvmissile[abc] and cltmissile / cltmissile[abcd] reference missile rows here for projectile behavior, damage, and visual.
States.txt — aurastate, auratargetstate, passivestate, State1–State3 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.txt — aurastat1–aurastat6 and passivestat1–passivestat14 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 Skill1–Skill8) bind monsters to skills defined here.
PetType.txt — pettype 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.txt — anim / monanim reference player and monster animation modes.
PlayerClass.txt — charclass references this table.
itemtypes.txt — itypea1–itypea3, etypea1–etypea2, itypeb1–itypeb3, etypeb1–etypeb2, 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.txt — Mana per Magic, Life per Vitality, Stamina per Vitality are consulted indirectly via itemstatcost op functions when stats granted by skills/auras are calculated.