weapons.txt defines every weapon base item — swords, axes, bows, staves, throwing potions, claws, the lot. 307 rows × 170 columns. The high column count is mostly bookkeeping: 85 columns belong to the vendor-stocking pattern, leaving ~85 for actual weapon properties. The engine loads weapons.txt together with armor.txt and misc.txt at runtime (in that order) into a unified item-base table.
The 297 spawnable rows partition into 110 distinct weapon families (distinct normcode), each with a Normal / Exceptional / Elite tier chain — see The three-tier system. 23 weapon types from swor (42 rows) down to ajav (3 rows, Amazon javelin elite-tier).
What's in a row
Columns split into eleven 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 (hax for Hand Axe, 9ha for Cleaver, 7ha for Small Crescent). 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 sometimes blank; otherwise it's a more-specific subtype. |
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. |
Damage
| Column | Meaning |
|---|
mindam, maxdam | Minimum / maximum physical damage. For one-handed wielding (and the only damage source for bows and crossbows). |
2handmindam, 2handmaxdam | Minimum / maximum damage when wielded two-handed. Only used when 2handed=1 or when the Barbarian wields a 1or2handed weapon two-handed. |
1or2handed | 1 = treated as both one-handed AND two-handed by the Barbarian class; 0 = restricted to one or the other. |
2handed | 1 = always two-handed; 0 = one-handed. |
minmisdam, maxmisdam | Minimum / maximum physical damage for throwing weapons (throwing knives, throwing axes, javelins, throwing potions). Bows and crossbows use mindam/maxdam. |
rangeadder | Bonus melee range in grid spaces. The baseline melee range is 1; this field adds to it. |
| Column | Meaning |
|---|
speed | Attack-speed reduction while wielding the item — the WSM (Weapon Speed Modifier) in community parlance. Ranges from -60 (fastest, Phase Blade) to +20 (slowest, two-handed mauls); lower = faster. Load-bearing for the IAS calculator — WSM is the primary input to breakpoint calculation. (Same column name as armor's speed, but on armor it means walk/run-speed reduction — different system per file.) |
wclass | Animation class for one-handed wielding (1hs, 1ht, bow, xbo, etc.). Determines which combat animation the engine plays and which IAS table applies. References the Weapon Class Table. |
2handedwclass | Animation class for two-handed wielding. |
hit class | Hit class — used to pick which SFX to play when the weapon hits an enemy. References HitClass.txt. |
Requirements & bonuses
| Column | Meaning |
|---|
reqstr, reqdex | Strength / dexterity needed to equip. |
levelreq | Player clvl needed to equip. |
StrBonus, DexBonus | Per-point damage scaling multipliers (% damage per attribute point). 100 = standard scaling. Bows scale on dex; clubs scale on str. If the field equals 1, the engine defaults the value to 100. |
| 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 weapons unlock 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 (the 9ha of Hand Axe). |
ultracode | Links to the Elite-tier code for this family (the 7ha of Hand Axe). |
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. 51 weapons set this. |
HellUpgrade | Same as above, but for Hell difficulty. 53 weapons set this. |
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 weapon's type. |
gemapplytype | Socket-effect type — 0 for Weapons (uses gems weaponMod* block). (Armor uses 1 for helmets/body and 2 for shields.) |
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 weapon cannot roll those gems. |
Auto-prefix (class weapons)
| Column | Meaning |
|---|
auto prefix | automagic group ID. Automatically picks an item affix from that group. Applies to all item qualities except sets and uniques. 30 weapon rows set this — Amazon class weapons (groups 300, 302) and a few orbs/wands (group 303). |
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, 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 — e.g. throwing potions). |
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. |
durability, nodurability, durwarning | Base durability the weapon 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. |
Throwing & stacking
| Column | Meaning |
|---|
stackable | 1 = stacks in inventory (throwing potions, throwing knives, throwing axes, javelins). |
minstack, maxstack, spawnstack | Stack-size bounds for drops. Depend on stackable=1. |
belt | For belt-eligible items: row index in Belts.txt. Throwing potions use this so they can occupy belt slots. |
missiletype | References the *ID field in Missiles.txt, determining what missile entity is fired/thrown by the weapon. |
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 weapons are blank; SoJs and a few specific items have non-zero values. |
The three-tier system
Most weapon families have three tiers — Normal, Exceptional, Elite — represented as three separate rows with different code values but the same normcode. Hand Axe is the canonical example:
| Tier | code | name | level | mindam–maxdam | reqstr |
|---|
| Normal | hax | Hand Axe | 3 | 3–6 | — |
| Exceptional | 9ha | Cleaver | ~36 | scaled | scaled |
| Elite | 7ha | Small Crescent | ~58 | scaled | scaled |
All three rows share normcode=hax, ubercode=9ha, ultracode=7ha — the Normal row points at itself plus its higher tiers; the Exceptional and Elite rows point back at the Normal normcode. This lets queries walk the family in either direction.
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 Hand Axes in Normal but Cleavers in Nightmare. Drops are not affected by these columns — Cleavers dropping in Nightmare from monsters of appropriate level are governed by treasure classes referencing the area's mlvl.
Auto-prefix (Amazon class weapons)
30 weapon rows have auto prefix set, all pointing at three automagic groups:
- Group 300 — Amazon Bow & Crossbow weapons (Stag Bow, Reflex Bow, Maiden Spear, etc.). Auto-prefix grants
+1/+2/+3 to the Bow & Crossbow Skills tab.
- Group 302 — Amazon Spear & Javelin weapons. Auto-prefix grants
+1/+2/+3 to the Javelin & Spear Skills tab.
- Group 303 — Sorceress orbs and a few wands. Auto-prefix grants life or mana from the Jackal/Wolf/Tiger or Lizard/Drake/Wyrm ladder.
The auto-prefix attaches in addition to any other affixes — a magic-quality Stag Bow has its auto-prefix and a magic prefix and a magic suffix.
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 weapon type the vendor can stock at white quality (Akara might stock 1 Hand Axe, 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 / type2 reference the item-type taxonomy. The taxonomy is where weapon-class hierarchy (mele → swor → 7sw) lives, which most affix and runeword applicability rules walk. Also caps gemsockets via MaxSockets1.
armor — same metadata shape (vendor stocking, tier system, sockets, auto-prefix); different physics (defense / block instead of damage / WSM).
automagic — auto prefix references group IDs there. 30 of 297 spawnable weapons carry auto-mods.
gems — socketed gems and runes apply via gemapplytype=0 (the weaponMod* block). gemoffset filters which entries are accessible.
magicprefix, magicsuffix — the affix pools that roll on magic / rare / crafted weapons. The level column here gates which affix tiers are eligible.
- IAS calculator — consumes
speed (WSM) and wclass to compute attack-speed breakpoints.
d2r-docs/STAFFMODS.md — staff-mods (the +N to specific class skills affixes that roll on caster weapons) live in magicsuffix but are documented separately in this constellation doc.