Items

armor

Armor base items — helms, body, shields, boots, gloves, belts.

armor.txt defines every armor base item across the helm, body, shield, gloves, belt, boots, and class-specific armor slots (Necro shrunken heads, Druid pelts, Barb helms, Pala auric shields, Pala helms, Sorc circlets). 218 rows × 168 columns. The high column count is mostly bookkeeping: 85 columns belong to the vendor-stocking pattern, leaving ~83 for actual armor properties. The engine loads armor.txt together with weapons.txt and misc.txt at runtime (in that order) into a unified item-base table.

The 217 spawnable rows partition into 73 distinct armor families (distinct normcode), most with a Normal / Exceptional / Elite tier chain — see The three-tier system. 12 armor types from tors (45 rows) down to circ (4 rows, sorceress circlets).

What's in a row

Columns split into ten groups by purpose.

Identity & taxonomy

ColumnMeaning
nameReference field for the item — does not need to be uniquely named (multiple rows can share a name).
codeUnique 3-letter/number identifier for this tier of the family (cap for Cap, xap for War Hat). Case-sensitive (a69A69). Can technically use 4 chars but Items.json won't process it.
type, type2Primary and secondary itemtypes codes. type2 is usually blank for armor; when set, it adds another item-type behavior.
namestrString-table key for the display name. Resolved through local/lng/strings/item-names.json.
version0 = Classic, 100 = Expansion (LoD/D2R).
compactsave1 = only the item's base stats are stored in the character save (no modifiers, no additional stats); 0 = full save.

Defense & block

ColumnMeaning
minac, maxacMinimum / maximum Defense (AC) the item can have. The engine rolls within this range on each drop; ac% affixes then multiply the rolled value.
blockBlock-chance percentage. Out of 100, but caps at 75. Non-zero only for shields.
mindam, maxdamMinimum / maximum physical damage the item provides. Almost always blank for armor; non-zero on shrunken heads and a handful of class-specific armor pieces.

Movement penalty

ColumnMeaning
speedWalk/run speed reduction while wearing the item. Heavy armor slows you down. (Not the WSM — speed on weapons means attack-speed reduction; same column name, different system per file.)

Requirements

ColumnMeaning
reqstrStrength attribute needed to equip.
reqdexDexterity attribute needed to equip. Almost always 0 for armor.
levelreqPlayer clvl needed to equip.
StrBonus, DexBonusPer-point damage scaling multipliers — almost always blank for armor (these are weapon properties). If equals 1, the engine defaults the value to 100.

Spawn & item metadata

ColumnMeaning
spawnable1 = drops naturally; 0 = engine-defined but not in the loot pool.
rarityDrop chance as 1/Nhigher value = rarer. Depends on spawnable=1, quest disabled, item level ≤ area level. Also affected by Act number: higher Act = more common drop.
levelBase item level (qlvl). Used for drop gating — items with level greater than the monster's mlvl or the area's level cannot drop. Higher-tier armor unlocks higher-tier affixes.
ShowLevel1 = display the item level next to the item name.
magic lvlMagic level of the item, affecting which magical modifiers can appear via automagic.
costBase gold cost when sold to an NPC. Affected by item modifiers and rarity.
gamble costGambling gold cost. Only functions for rings and amulets.
unique1 = item can ONLY spawn as Unique quality.
SkipName1 and item is Unique quality = skip adding the item's base name in its title.
questQuest class tied to the item. Any value > 0 flags it as a quest item — affects tooltip, trading, rarity, NPC sales. References the Quests Table.
questdiffcheck1 and quest enabled = the quest item is per-difficulty (player can hold one per Normal/Nightmare/Hell). 0 = only one across all difficulties.
Nameable1 = can be personalized by Anya for the Act 5 Betrayal of Harrogath quest reward.
PermStoreItem1 = always appears on the NPC's store; 0 = randomly appears when appropriate.
UICatOverrideUI category override (D2R-era addition, not in the legacy reference).
bitfield1Bitfield of capability flags. Test against bits with &:
BitBinaryDescription
11Item can have Magic quality
210Item is classified as metal
4100Item is classified as a spellcaster item (currently does nothing)
81000Item is classified as a skill-based item (currently does nothing)

The three-tier chain

ColumnMeaning
normcodeLinks to the Normal-tier code for this family. Always points at the Normal-tier row, even from Exceptional / Elite rows.
ubercodeLinks to the Exceptional-tier code for this family.
ultracodeLinks to the Elite-tier code for this family.
NightmareUpgradeLinks to another item's code. Used to determine which item replaces this one when generated in the NPC's store while playing in Nightmare difficulty. xxx = no change. Affects vendor stock only — drops are governed by treasure classes and area mlvl, not by this column.
HellUpgradeSame as above, but for Hell difficulty.
alternategfx3-letter graphics-override code. Determines what character graphics display when the item is equipped, separate from code.

See The three-tier system for the full picture.

Sockets

ColumnMeaning
hasinv1 = the item can be socketed at all (with runes, jewels, or gems); 0 = no sockets ever. gemsockets only matters when this is set.
gemsocketsMaximum number of sockets allowed. Limited by invwidth × invheight, and capped by the itemtypes MaxSockets1 field for the item's type.
gemapplytypeSocket-effect type — 1 for Armor or Helmet (uses gems helmMod* block), 2 for Shield (shieldMod* block). (Weapons use 0 with weaponMod*.)
gemoffsetStarting index into gems for socket eligibility, scoped by gemapplytype. If 9, the engine starts with index 9 (Chipped Emerald) and ignores lower-indexed entries — the item cannot roll those gems.

Auto-prefix (class armor)

ColumnMeaning
auto prefixautomagic group ID. Automatically picks an item affix from that group. Applies to all item qualities except sets and uniques. 45 armor rows set this — class-specific bases (Pala auric shields, Necro voodoo heads, Druid pelts, Barb helms, Pala helms, Sorc circlets) drawing from groups 304, 305, or 306.

Vendor stocking (85 columns)

For each of 17 vendors there are 5 columns — <NPC>Min, <NPC>Max, <NPC>MagicMin, <NPC>MagicMax, <NPC>MagicLvl — controlling how many of this base type the vendor stocks at white quality vs magic quality, with a magic-level cap. <NPC>Max must be ≥ <NPC>Min. See Vendor stocking for the vendor → act mapping.

Inventory, sound, paperdoll, cosmetics

ColumnMeaning
invwidth, invheightInventory grid footprint.
componentAnimation layer when the item is equipped. References a Token entry in Composit.txt.
flippyfile, invfile, uniqueinvfile, setinvfileDC6 sprite asset paths. All four are Legacy View Only — the D2R sprite system uses different assets.
useable1 = item can be used with right-click (only meaningful for specific belt items or quest items).
stackable, minstack, maxstack, spawnstackStack-size handling. Almost always blank for armor; relevant on misc/ammo.
Transmogrify, TMogType, TMogMin, TMogMaxAll four do not function — present in the schema but the transmogrify system was never wired up.
dropsound, dropsfxframe, usesoundAudio hooks referencing Sounds.txt.
transparent1 = drawn transparent on the player model (similar to ethereal).
transtblTransparency-table type used when transparent=1.
lightradiusLight-radius value applied on monsters carrying the item (not the player). Ignored if the item's component is lit, med, or hvy.
beltFor belt-class items: row index in Belts.txt selecting belt-quality (Sash → Light Belt → Belt → Heavy Belt → Girdle, with corresponding slot counts).
missiletypeReferences Missiles.txt. Almost always blank for armor.
durability, nodurability, durwarningBase durability the item spawns with; nodurability=1 means no durability at all; durwarning is the UI threshold to display the low-durability warning. An item must have durability to roll ethereal.
qntwarningUI threshold to display the low-quantity warning (stack-based items only).
Transform, InvTransColor-transform palette indices for the character model graphics and the inventory graphics, respectively. References the Inventory Transform Table.

Paperdoll animation classes

These columns assign the animation-weight class for each body part when wearing the armor — they control which animation set the engine plays, not which body parts the armor "covers":

ColumnMeaning
rArm, lArmRight / left arm animation class.
TorsoTorso animation class.
LegsLegs animation class.
rSPad, lSPadRight / left shoulder pad animation class.

All six use the same value mapping: 0 = Light (lit), 1 = Medium (med), 2 = Heavy (hvy). Body armor sets all six (e.g. Full Plate Mail = all 2 for the heavy-look animation). Helms only set head-region values; gloves only set hand-region values; etc.

DClone trigger

ColumnMeaning
diablocloneweightWeight added to the Diablo Clone progress bar when this item is sold. When offline, selling this item instead immediately spawns Diablo Clone. Most armor is blank; SoJs and a few specific items have non-zero values.

The three-tier system

Most armor families have three tiers — Normal, Exceptional, Elite — represented as three separate rows with different code values but the same normcode. Cap is the canonical example:

Tiercodenamelevelminacmaxacreqstr
NormalcapCap13–50
ExceptionalxapWar Hatscaledscaledscaled
EliteuapShakoscaledscaledscaled

All three rows share normcode=cap, ubercode=xap, ultracode=uap — the Normal row points at itself plus its higher tiers; the Exceptional and Elite rows point back at the Normal normcode.

The NightmareUpgrade and HellUpgrade columns control NPC store substitution only: when Charsi opens her store in Nightmare, the engine reads NightmareUpgrade on the Normal row and stocks the Exceptional code instead. This is why Charsi sells Caps in Normal but War Hats in Nightmare. Drops are not affected by these columns — Cleavers/War Hats etc. dropping in higher difficulties are governed by treasure classes referencing the area's mlvl.

Note that armor has fewer NM/Hell upgrade entries than weapons (34 / 26 vs 51 / 53). Some niche armor types skip the upgrade chain entirely.

Auto-prefix (class armor)

45 armor rows have auto prefix set, all pointing at three automagic groups:

  • Group 304 — class shields and orbs that grant resists or attack rating (Shimmering / Sharp / Rainbow ladders).
  • Group 305 — class armor that grants poison damage (of Blight / of Venom / of Pestilence / of Anthrax).
  • Group 306 — class armor that grants magic or fire damage (of Shadows / of Ember / of Despair ladders).

The auto-prefix attaches in addition to any other affixes — a magic-quality Druid Pelt has its auto-prefix and a magic prefix and a magic suffix. Class-skill-bonus auto-prefixes (e.g. +1 to Druid skills on a Pelt) likely use a separate mechanism not visible in automagic.txt directly.

Vendor stocking (the 85-column pattern)

17 NPC vendors, 5 columns each. The pattern: <NPC>Min and <NPC>Max set how many copies of this armor type the vendor can stock at white quality (Akara might stock 1 Cap, Charsi 2). <NPC>MagicMin and <NPC>MagicMax set the magic-quality stocking range. <NPC>MagicLvl caps the magic-affix level on those magic-quality drops. Both Max columns must be their Min counterpart.

Blank rows mean "this vendor doesn't stock this base." 255 in the MagicLvl column also means "doesn't stock magic" (the engine's null-equivalent).

The 17 vendors and their acts:

VendorActRole
Akara1Healer, scrolls, basic gear
Charsi1Blacksmith, weapons & armor
Gheed1General merchant, gambler
Drognan2Magic vendor (staves, scrolls)
Elzix2General merchant, smith
Fara2Blacksmith, healer
Lysander2Potions
Alkor3Alchemist (potions, magic)
Asheara3Iron Wolf hireling vendor
Hratli3Blacksmith, magic
Ormus3Magic vendor
Cain4Identifier (also Acts 1, 2, 5 cameos)
Halbu4Blacksmith
Jamella4Healer / general
Anya5Magic vendor
Larzuk5Blacksmith, socket quest
Malah5Healer

Cross-references

  • itemtypestype / type2 reference the item-type taxonomy. The hierarchy here (armotorslite) gates affix and runeword applicability, body-slot eligibility, and class restrictions on auric shields / pelts / voodoo heads. Also caps gemsockets via MaxSockets1.
  • weapons — same metadata shape (vendor stocking, tier system, sockets, auto-prefix); different physics (defense / block instead of damage / WSM).
  • automagicauto prefix references group IDs there. 45 of 217 spawnable armor rows carry auto-mods, exclusively from groups 304/305/306.
  • gems — socketed gems and runes apply via gemapplytype=1 (helms / body — helmMod* block) or gemapplytype=2 (shields — shieldMod* block). gemoffset filters which entries are accessible.
  • magicprefix, magicsuffix — the affix pools that roll on magic / rare / crafted armor. The level column here gates which affix tiers are eligible.