Items

uniqueitems

The 439 unique-item definitions — base, level gating, ladder window, and up to 12 stat rolls.

uniqueitems.txt defines every unique item in D2R: from The Gnasher (Hand Axe) to Tyrael's Might (Sacred Armor). Each row pins a unique to a base item via code, gates its drop eligibility, and encodes up to 12 stat rolls using the same property/parameter/min/max layout that magicprefix, magicsuffix, automagic, and runes all share.

439 rows total. The *ID comment column tracks original row order; the *ItemName comment column carries the display name string for human reading (the actual lookup key is index).

What's in a row

The 67 columns split into seven groups.

Identity & display

ColumnMeaning
indexString key for the item's display name (The Gnasher, Shako, Harlequin Crest). The actual primary key for cross-references.
*IDComment column — row index (0-based), not read by the game.
*ItemNameComment column — display name for reference, not read by the game.
version0 = Classic, 100 = Expansion. Set per item; D2R reads both but most modern uniques are 100.

Drop eligibility & gating

The drop logic walks four independent gates:

ColumnMeaning
disabled1 = item cannot drop. Empty / 0 = eligible. Note: locbones documents an older enabled column with inverted logic; D2R uses disabled.
spawnable1 = item appears in standard gameplay. 0 = scripted-only or unavailable content.
disableChronicle1 = suppressed in Chronicles game mode. (D2R-era column.)
firstLadderSeason / lastLadderSeasonLadder-season window. Both empty = no ladder restriction. D2R replaced the old binary ladder column with a season range — same mechanism runes uses for runeword ladder-gating. 16 uniques set firstLadderSeason.
DropConditionCalcEngine calc-DSL expression for situational gating. Rarely used.

Base item & character gating

ColumnMeaning
codeItem base code (4-char). References weapons.code, armor.code, or Misc.txt .code — determines which base type the unique sits on top of. hax = Hand Axe, dib = Elite Diadem, gth = Greater Talons.
lvlItem level. Monsters/containers must roll ilvl ≥ this to be eligible to produce the item.
lvl reqCharacter level required to equip.
rarityRelative pick weight among all eligible uniques sharing a base. If three uniques share a base with rarity 3/5/7, they're picked at 3/15, 5/15, 7/15.
nolimit1 = item auto-identifies on drop. Rarely set.
carry11 = player can hold only one in inventory.

Stat encoding — prop/par/min/max ×12

The familiar T1* /mod* encoding from runes, magicprefix, and magicsuffix, but renamed and extended to 12 stat slots:

ColumnsMeaning
prop1..prop12Property code from Properties.txt. Empty = no stat in that slot.
par1..par12Parameter for the property — skill ID for oskill, skill-name string for gethit-skill/hit-skill, blank for simple stats. Usage depends on property's function ID.
min1..min12Minimum roll.
max1..max12Maximum roll. min == max = fixed value; min < max = engine rolls within.

This is the single shared property layer — granting +Strength via prop=str works the same on a unique, a magic-prefix item, or a runeword. Common codes: str, dex, hp, mana, res-all, dmg%, openwounds, crush, allskills, skilltab, skill, oskill.

Visual & audio overrides

ColumnMeaning
chrtransformCharacter-equip color shift (references Colors.txt). Empty = base item color.
invtransformInventory icon color shift. Usually matches chrtransform.
flippyfileGround-flip animation override.
invfileInventory icon override.
dropsound / dropsfxframe / usesoundDrop and use sound overrides.

The iconic gold-orange unique color comes from chrtransform / invtransform.

Economy & DClone

ColumnMeaning
cost multMultiplicative buy/sell/repair modifier.
cost addFlat addition after cost mult.
diablocloneweightWeight added to Diablo Clone progress when sold to an NPC online. Offline: selling an item with non-zero weight immediately spawns Diablo Clone. The classic SoJ DClone trigger.

Worked example: The Gnasher

A simple ilvl-7 Hand Axe unique. Four of the twelve stat slots used:

ColumnValueNotes
indexThe GnasherDisplay key.
codehaxHand Axe base.
lvl7Drops from monsters/containers at ilvl ≥ 7.
lvl req5Equip at clvl 5.
rarity1Standard pick weight.
spawnable1, disabled blankDrops freely in any game mode.
prop1 / min1 / max1str / 8 / 8+8 Strength (fixed).
prop2 / min2 / max2openwounds / 50 / 5050% Open Wounds (fixed).
prop3 / min3 / max3crush / 20 / 2020% Crushing Blow (fixed).
prop4 / min4 / max4dmg% / 60 / 7060–70% Enhanced Damage (variable roll).
prop5..prop12emptySlots 5–12 unused.

Three of four stats are fixed (min == max); dmg% rolls 60–70 each spawn. When reporting unique-item rolls, always show the range, not the average.

Variable rolls

Many uniques have one or more min < max slots. Examples to keep in mind when reporting stats:

ItemVariable statRange
Shako (Harlequin Crest)mag% (MF)25–50
Stone of Jordanmana%15–25
Skin of the Vipermagires-all20–35
Mara's Kaleidoscoperes-all20–30
Tyrael's Mightdmg%120–200

A "Shako with 30 MF" and a "Shako with 50 MF" are both Shakos; the variance lives in the min/max block.

Drop eligibility — when does it actually drop?

The pick walks the four gates in order:

  1. disabled blank or 0? Yes → continue. No → never drops.
  2. spawnable = 1? Yes → continue.
  3. Ladder-season window matches? firstLadderSeason empty or current season ≥ first; lastLadderSeason empty or current season ≤ last → continue. Otherwise → not droppable this season.
  4. Item ilvl ≥ uniqueitems.lvl? Yes → eligible for the rarity-weighted pick.

A unique with firstLadderSeason set and no lastLadderSeason is ladder-only and has not yet rotated off-ladder — same convention used by runes for runeword gating.

Common queries

-- All uniques on a specific base (Elite Diadem family)
SELECT "index", lvl, "lvl req", spawnable, disabled,
       prop1, min1, max1, prop2, min2, max2
FROM uniqueitems WHERE code = 'dib'
ORDER BY CAST(lvl AS INTEGER);

-- Ladder-season-gated uniques
SELECT "index", code, firstLadderSeason, lastLadderSeason
FROM uniqueitems WHERE firstLadderSeason != ''
ORDER BY CAST(firstLadderSeason AS INTEGER);

-- All +allskills uniques (any of the 12 prop slots)
SELECT "index", code, lvl
FROM uniqueitems
WHERE prop1='allskills' OR prop2='allskills' OR prop3='allskills'
   OR prop4='allskills' OR prop5='allskills' OR prop6='allskills'
ORDER BY "index";

Cross-references

  • weapons / armorcode resolves into one of these (or Misc.txt for charms / jewels / circlets).
  • itemtypes — base codes inherit from itypes; the same hierarchy walk applies for class restrictions.
  • magicprefix / magicsuffix / runes — share the same property/parameter/min/max stat-encoding layer.
  • itemstatcostprop* codes ultimately resolve to stats here (via Properties.txt).
  • Properties.txt — defines the property-to-stat mapping referenced by prop1..prop12.

Naming gotcha

uniqueitems is the unique items table. Despite the similar name, uniqueprefix, uniquesuffix, and uniqueappellation are unique-monster name pools — not item affixes. Item-side affix pools are magicprefix / magicsuffix / automagic.