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
| Column | Meaning |
|---|---|
index | String key for the item's display name (The Gnasher, Shako, Harlequin Crest). The actual primary key for cross-references. |
*ID | Comment column — row index (0-based), not read by the game. |
*ItemName | Comment column — display name for reference, not read by the game. |
version | 0 = 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:
| Column | Meaning |
|---|---|
disabled | 1 = item cannot drop. Empty / 0 = eligible. Note: locbones documents an older enabled column with inverted logic; D2R uses disabled. |
spawnable | 1 = item appears in standard gameplay. 0 = scripted-only or unavailable content. |
disableChronicle | 1 = suppressed in Chronicles game mode. (D2R-era column.) |
firstLadderSeason / lastLadderSeason | Ladder-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. |
DropConditionCalc | Engine calc-DSL expression for situational gating. Rarely used. |
Base item & character gating
| Column | Meaning |
|---|---|
code | Item 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. |
lvl | Item level. Monsters/containers must roll ilvl ≥ this to be eligible to produce the item. |
lvl req | Character level required to equip. |
rarity | Relative 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. |
nolimit | 1 = item auto-identifies on drop. Rarely set. |
carry1 | 1 = 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:
| Columns | Meaning |
|---|---|
prop1..prop12 | Property code from Properties.txt. Empty = no stat in that slot. |
par1..par12 | Parameter 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..min12 | Minimum roll. |
max1..max12 | Maximum 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
| Column | Meaning |
|---|---|
chrtransform | Character-equip color shift (references Colors.txt). Empty = base item color. |
invtransform | Inventory icon color shift. Usually matches chrtransform. |
flippyfile | Ground-flip animation override. |
invfile | Inventory icon override. |
dropsound / dropsfxframe / usesound | Drop and use sound overrides. |
The iconic gold-orange unique color comes from chrtransform / invtransform.
Economy & DClone
| Column | Meaning |
|---|---|
cost mult | Multiplicative buy/sell/repair modifier. |
cost add | Flat addition after cost mult. |
diablocloneweight | Weight 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:
| Column | Value | Notes |
|---|---|---|
index | The Gnasher | Display key. |
code | hax | Hand Axe base. |
lvl | 7 | Drops from monsters/containers at ilvl ≥ 7. |
lvl req | 5 | Equip at clvl 5. |
rarity | 1 | Standard pick weight. |
spawnable | 1, disabled blank | Drops freely in any game mode. |
prop1 / min1 / max1 | str / 8 / 8 | +8 Strength (fixed). |
prop2 / min2 / max2 | openwounds / 50 / 50 | 50% Open Wounds (fixed). |
prop3 / min3 / max3 | crush / 20 / 20 | 20% Crushing Blow (fixed). |
prop4 / min4 / max4 | dmg% / 60 / 70 | 60–70% Enhanced Damage (variable roll). |
prop5..prop12 | empty | Slots 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:
| Item | Variable stat | Range |
|---|---|---|
| Shako (Harlequin Crest) | mag% (MF) | 25–50 |
| Stone of Jordan | mana% | 15–25 |
| Skin of the Vipermagi | res-all | 20–35 |
| Mara's Kaleidoscope | res-all | 20–30 |
| Tyrael's Might | dmg% | 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:
disabledblank or0? Yes → continue. No → never drops.spawnable = 1? Yes → continue.- Ladder-season window matches?
firstLadderSeasonempty or current season ≥ first;lastLadderSeasonempty or current season ≤ last → continue. Otherwise → not droppable this season. - 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/armor—coderesolves into one of these (orMisc.txtfor 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.itemstatcost—prop*codes ultimately resolve to stats here (viaProperties.txt).Properties.txt— defines the property-to-stat mapping referenced byprop1..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.