Items

weapons

Weapon base items — swords, axes, bows, staves, throwing.

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

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 (hax for Hand Axe, 9ha for Cleaver, 7ha for Small Crescent). Case-sensitive (a69A69). Can technically use 4 chars but Items.json won't process it.
type, type2Primary and secondary itemtypes codes. type2 is sometimes blank; otherwise it's a more-specific subtype.
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.

Damage

ColumnMeaning
mindam, maxdamMinimum / maximum physical damage. For one-handed wielding (and the only damage source for bows and crossbows).
2handmindam, 2handmaxdamMinimum / maximum damage when wielded two-handed. Only used when 2handed=1 or when the Barbarian wields a 1or2handed weapon two-handed.
1or2handed1 = treated as both one-handed AND two-handed by the Barbarian class; 0 = restricted to one or the other.
2handed1 = always two-handed; 0 = one-handed.
minmisdam, maxmisdamMinimum / maximum physical damage for throwing weapons (throwing knives, throwing axes, javelins, throwing potions). Bows and crossbows use mindam/maxdam.
rangeadderBonus melee range in grid spaces. The baseline melee range is 1; this field adds to it.

Speed (the IAS input)

ColumnMeaning
speedAttack-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.)
wclassAnimation 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.
2handedwclassAnimation class for two-handed wielding.
hit classHit class — used to pick which SFX to play when the weapon hits an enemy. References HitClass.txt.

Requirements & bonuses

ColumnMeaning
reqstr, reqdexStrength / dexterity needed to equip.
levelreqPlayer clvl needed to equip.
StrBonus, DexBonusPer-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.

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 weapons unlock 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 (the 9ha of Hand Axe).
ultracodeLinks to the Elite-tier code for this family (the 7ha of Hand Axe).
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. 51 weapons set this.
HellUpgradeSame as above, but for Hell difficulty. 53 weapons set this.
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 weapon's type.
gemapplytypeSocket-effect type — 0 for Weapons (uses gems weaponMod* block). (Armor uses 1 for helmets/body and 2 for shields.)
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 weapon cannot roll those gems.

Auto-prefix (class weapons)

ColumnMeaning
auto prefixautomagic 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

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 — e.g. throwing potions).
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.
durability, nodurability, durwarningBase 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.
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.

Throwing & stacking

ColumnMeaning
stackable1 = stacks in inventory (throwing potions, throwing knives, throwing axes, javelins).
minstack, maxstack, spawnstackStack-size bounds for drops. Depend on stackable=1.
beltFor belt-eligible items: row index in Belts.txt. Throwing potions use this so they can occupy belt slots.
missiletypeReferences the *ID field in Missiles.txt, determining what missile entity is fired/thrown by the weapon.

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 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:

Tiercodenamelevelmindammaxdamreqstr
NormalhaxHand Axe33–6
Exceptional9haCleaver~36scaledscaled
Elite7haSmall Crescent~58scaledscaled

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:

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 taxonomy is where weapon-class hierarchy (meleswor7sw) 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).
  • automagicauto 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.