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
| Column | Meaning |
|---|---|
name | Reference field for the item — does not need to be uniquely named (multiple rows can share a name). |
code | Unique 3-letter/number identifier for this tier of the family (cap for Cap, xap for War Hat). Case-sensitive (a69 ≠ A69). Can technically use 4 chars but Items.json won't process it. |
type, type2 | Primary and secondary itemtypes codes. type2 is usually blank for armor; when set, it adds another item-type behavior. |
namestr | String-table key for the display name. Resolved through local/lng/strings/item-names.json. |
version | 0 = Classic, 100 = Expansion (LoD/D2R). |
compactsave | 1 = only the item's base stats are stored in the character save (no modifiers, no additional stats); 0 = full save. |
Defense & block
| Column | Meaning |
|---|---|
minac, maxac | Minimum / maximum Defense (AC) the item can have. The engine rolls within this range on each drop; ac% affixes then multiply the rolled value. |
block | Block-chance percentage. Out of 100, but caps at 75. Non-zero only for shields. |
mindam, maxdam | Minimum / 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
| Column | Meaning |
|---|---|
speed | Walk/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
| Column | Meaning |
|---|---|
reqstr | Strength attribute needed to equip. |
reqdex | Dexterity attribute needed to equip. Almost always 0 for armor. |
levelreq | Player clvl needed to equip. |
StrBonus, DexBonus | Per-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
| Column | Meaning |
|---|---|
spawnable | 1 = drops naturally; 0 = engine-defined but not in the loot pool. |
rarity | Drop chance as 1/N — higher value = rarer. Depends on spawnable=1, quest disabled, item level ≤ area level. Also affected by Act number: higher Act = more common drop. |
level | Base 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. |
ShowLevel | 1 = display the item level next to the item name. |
magic lvl | Magic level of the item, affecting which magical modifiers can appear via automagic. |
cost | Base gold cost when sold to an NPC. Affected by item modifiers and rarity. |
gamble cost | Gambling gold cost. Only functions for rings and amulets. |
unique | 1 = item can ONLY spawn as Unique quality. |
SkipName | 1 and item is Unique quality = skip adding the item's base name in its title. |
quest | Quest class tied to the item. Any value > 0 flags it as a quest item — affects tooltip, trading, rarity, NPC sales. References the Quests Table. |
questdiffcheck | 1 and quest enabled = the quest item is per-difficulty (player can hold one per Normal/Nightmare/Hell). 0 = only one across all difficulties. |
Nameable | 1 = can be personalized by Anya for the Act 5 Betrayal of Harrogath quest reward. |
PermStoreItem | 1 = always appears on the NPC's store; 0 = randomly appears when appropriate. |
UICatOverride | UI category override (D2R-era addition, not in the legacy reference). |
bitfield1 | Bitfield of capability flags. Test against bits with &: |
| Bit | Binary | Description |
|---|---|---|
1 | 1 | Item can have Magic quality |
2 | 10 | Item is classified as metal |
4 | 100 | Item is classified as a spellcaster item (currently does nothing) |
8 | 1000 | Item is classified as a skill-based item (currently does nothing) |
The three-tier chain
| Column | Meaning |
|---|---|
normcode | Links to the Normal-tier code for this family. Always points at the Normal-tier row, even from Exceptional / Elite rows. |
ubercode | Links to the Exceptional-tier code for this family. |
ultracode | Links to the Elite-tier code for this family. |
NightmareUpgrade | Links 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. |
HellUpgrade | Same as above, but for Hell difficulty. |
alternategfx | 3-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
| Column | Meaning |
|---|---|
hasinv | 1 = the item can be socketed at all (with runes, jewels, or gems); 0 = no sockets ever. gemsockets only matters when this is set. |
gemsockets | Maximum number of sockets allowed. Limited by invwidth × invheight, and capped by the itemtypes MaxSockets1 field for the item's type. |
gemapplytype | Socket-effect type — 1 for Armor or Helmet (uses gems helmMod* block), 2 for Shield (shieldMod* block). (Weapons use 0 with weaponMod*.) |
gemoffset | Starting 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)
| Column | Meaning |
|---|---|
auto prefix | automagic 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
| Column | Meaning |
|---|---|
invwidth, invheight | Inventory grid footprint. |
component | Animation layer when the item is equipped. References a Token entry in Composit.txt. |
flippyfile, invfile, uniqueinvfile, setinvfile | DC6 sprite asset paths. All four are Legacy View Only — the D2R sprite system uses different assets. |
useable | 1 = item can be used with right-click (only meaningful for specific belt items or quest items). |
stackable, minstack, maxstack, spawnstack | Stack-size handling. Almost always blank for armor; relevant on misc/ammo. |
Transmogrify, TMogType, TMogMin, TMogMax | All four do not function — present in the schema but the transmogrify system was never wired up. |
dropsound, dropsfxframe, usesound | Audio hooks referencing Sounds.txt. |
transparent | 1 = drawn transparent on the player model (similar to ethereal). |
transtbl | Transparency-table type used when transparent=1. |
lightradius | Light-radius value applied on monsters carrying the item (not the player). Ignored if the item's component is lit, med, or hvy. |
belt | For belt-class items: row index in Belts.txt selecting belt-quality (Sash → Light Belt → Belt → Heavy Belt → Girdle, with corresponding slot counts). |
missiletype | References Missiles.txt. Almost always blank for armor. |
durability, nodurability, durwarning | Base 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. |
qntwarning | UI threshold to display the low-quantity warning (stack-based items only). |
Transform, InvTrans | Color-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":
| Column | Meaning |
|---|---|
rArm, lArm | Right / left arm animation class. |
Torso | Torso animation class. |
Legs | Legs animation class. |
rSPad, lSPad | Right / 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
| Column | Meaning |
|---|---|
diablocloneweight | Weight 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:
| Tier | code | name | level | minac–maxac | reqstr |
|---|---|---|---|---|---|
| Normal | cap | Cap | 1 | 3–5 | 0 |
| Exceptional | xap | War Hat | scaled | scaled | scaled |
| Elite | uap | Shako | scaled | scaled | scaled |
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:
| Vendor | Act | Role |
|---|---|---|
| Akara | 1 | Healer, scrolls, basic gear |
| Charsi | 1 | Blacksmith, weapons & armor |
| Gheed | 1 | General merchant, gambler |
| Drognan | 2 | Magic vendor (staves, scrolls) |
| Elzix | 2 | General merchant, smith |
| Fara | 2 | Blacksmith, healer |
| Lysander | 2 | Potions |
| Alkor | 3 | Alchemist (potions, magic) |
| Asheara | 3 | Iron Wolf hireling vendor |
| Hratli | 3 | Blacksmith, magic |
| Ormus | 3 | Magic vendor |
| Cain | 4 | Identifier (also Acts 1, 2, 5 cameos) |
| Halbu | 4 | Blacksmith |
| Jamella | 4 | Healer / general |
| Anya | 5 | Magic vendor |
| Larzuk | 5 | Blacksmith, socket quest |
| Malah | 5 | Healer |
Cross-references
itemtypes—type/type2reference the item-type taxonomy. The hierarchy here (armo→tors→lite) gates affix and runeword applicability, body-slot eligibility, and class restrictions on auric shields / pelts / voodoo heads. Also capsgemsocketsviaMaxSockets1.weapons— same metadata shape (vendor stocking, tier system, sockets, auto-prefix); different physics (defense / block instead of damage / WSM).automagic—auto prefixreferences group IDs there. 45 of 217 spawnable armor rows carry auto-mods, exclusively from groups 304/305/306.gems— socketed gems and runes apply viagemapplytype=1(helms / body —helmMod*block) orgemapplytype=2(shields —shieldMod*block).gemoffsetfilters which entries are accessible.magicprefix,magicsuffix— the affix pools that roll on magic / rare / crafted armor. Thelevelcolumn here gates which affix tiers are eligible.