Loot & Drops

How items drop — base drop chance, the rarity roll, item level, and exactly what Magic Find does (and doesn't).

On this page

Every kill runs an independent drop roll per gear slot the enemy carries. If a roll succeeds, the game then rolls an item level, picks a base item, and finally rolls a rarity (Normal / Magic / Rare / Unique). These are four separate stages — Magic Find only touches the last one. This page walks each stage with the real formulas.

Stage 1 — Base drop chance

The global per-slot drop chance is GLOBAL_ITEM_DROP_CHANCE = 0.04 (4%). A plain (common) enemy has exactly one drop entry at this chance.

Rare and special enemies get a second drop entry at half the base chance (0.04 / 2 = 0.02). Both of their entries are then scaled by the enemy’s rarity drop-chance multiplier (ENEMY_RARITY_SCALING.dropChance): common ×1, rare ×2, special ×4.

common enemy   : 1 roll  @ 0.04
rare enemy     : roll A  @ 0.04 × 2 = 0.08 ,  roll B  @ 0.02 × 2 = 0.04
special enemy  : roll A  @ 0.04 × 4 = 0.16 ,  roll B  @ 0.02 × 4 = 0.08

Each entry rolls independently, so a special enemy can drop zero, one, or two items.

Dungeon ×1.5

Inside a dungeon, every drop entry’s chance is multiplied by DUNGEON_ITEM_DROP_CHANCE_MULTIPLIER = 1.5 at roll time, then clamped to [0, 1]:

effectiveDropChance = clamp(entry.chance × 1.5, 0, 1)
EnemyOverworldIn a dungeon
Common0.040.06
Rare0.08 + 0.040.12 + 0.06
Special0.16 + 0.080.24 + 0.12

Note this ×1.5 is drop quantity/frequency — it is a completely separate bonus from the dungeon Magic Find bonus (Stage 4), which affects rarity.

Stage 2 — Item level

Once a roll succeeds, the dropped item’s level is rolled around the enemy’s level:

itemLevel = clamp(enemyLevel + randInt(-5, +5), 1, 99)

randInt(-5, +5) is inclusive on both ends (11 possible offsets). The upper clamp is HERO_MAX_LEVEL = 99 and it applies everywhere — no drop anywhere in the game rolls above item level 99. Pushing a region with Region Resonance raises the rarity of what drops (via Magic Find) and the material drop rate, never the item level.

Item level drives the affix roll ranges (higher ilvl → stronger affix tiers), so it matters even beyond picking the base. Magic Find does not change item level.

Stage 3 — Base item & tier

The tier cap is derived purely from the rolled item level:

getItemTier(itemLevel) = clamp(ceil(max(1, itemLevel) / 20), 1, 5)
Item levelTier cap
1–201
21–402
41–603
61–804
81–995

A tier is then drawn from TIER_DROP_WEIGHTS[tierCap] — higher tiers still include lower tiers with decreasing weight:

tier 1: [1]
tier 2: [0.75, 0.25]
tier 3: [0.375, 0.375, 0.25]
tier 4: [0.25, 0.25, 0.25, 0.25]
tier 5: [0.225, 0.225, 0.225, 0.225, 0.10]

So a tier-5 enemy (ilvl 81+) drops a genuine tier-5 base only 10% of the time; the rest spreads evenly across tiers 1–4 at 22.5% each.

Within the chosen tier, the specific base item is picked by a fit weight so drops stay mostly equippable. For each candidate base with level requirement levelReq:

gap    = levelReq − itemLevel
weight = gap ≤ 0 ? 1 : 1 / (1 + gap)

Bases you can already use get full weight; a base whose requirement is a few levels above the drop level becomes an “aspirational” rare pick; a wildly-too-high base is near-impossible. See Item Bases.

Every base in the tier shares one flat pool — there is no per-slot quota, so a slot’s share of drops is simply its share of the base items at that tier. Each tier holds 43 gear bases, two of them rings, so adding the two ring families thinned every other family’s share by about 4.7%.

Stage 4 — The rarity roll (this is what Magic Find touches)

Rarity is decided by rollItemRarity using three sequential gates. magicFind is a fraction (e.g. 1.0 = +100% MF), and:

magicFactor  = 1 + max(0, magicFind)
magicChance  = clamp(0.25 × magicFactor, 0, 0.75)   // base→Magic gate
rareChance   = clamp(0.25 × magicFactor, 0, 0.75)   // Magic→Rare gate
uniqueChance = clamp(0.05 × magicFactor, 0, 0.50)   // Rare→Unique gate

The gates run in order, each rolling Math.random():

  1. If the roll fails magicChanceNormal (stop).
  2. Else if it fails rareChanceMagic (stop).
  3. Else if it passes uniqueChanceUnique, otherwise → Rare.

That yields the closed-form odds:

P(Normal) = 1 − magicChance
P(Magic)  = magicChance × (1 − rareChance)
P(Rare)   = magicChance × rareChance × (1 − uniqueChance)
P(Unique) = magicChance × rareChance × uniqueChance

Odds at MF 0

With magicFactor = 1: magicChance = rareChance = 0.25, uniqueChance = 0.05.

P(Normal) = 1 − 0.25                    = 0.75      → 75%
P(Magic)  = 0.25 × 0.75                 = 0.1875    → 18.75%
P(Rare)   = 0.25 × 0.25 × 0.95          = 0.059375  → 5.9375%
P(Unique) = 0.25 × 0.25 × 0.05          = 0.003125  → 0.3125%

(These sum to exactly 100%.)

Rarity → affix count

  • Normal — no affixes (base stats only). For jewelry — amulets and rings — there is no Normal base item, so a failed Magic gate means no drop at all rather than a white amulet or ring. This keeps jewelry Unique odds equal to every other slot instead of 4× higher.
  • Magic — 2 affixes.
  • Rare — 3 affixes.
  • Unique — a hand-authored Unique for that base. If no unique exists for the base, it falls back to a “near-unique” Rare with 4 affixes.

Magic Find — reality check

Magic Find only re-weights the rarity gates in Stage 4. It does not:

  • increase drop quantity or drop chance (that is Stage 1 — the dungeon ×1.5 is separate),
  • change item level (Stage 2),
  • change which base item drops (Stage 3),
  • change affix values — those roll from the item-level tier ranges regardless of MF.

MF also caps out: the Magic and Rare gates are clamped at 0.75, so once magicFactor ≥ 3 (i.e. MF ≥ +200%) those two gates stop improving. Past that point, extra MF only pushes the Unique gate — and that one is clamped at 0.50, reached at magicFactor = 10 (MF ≥ +900%), so unique odds keep climbing far longer than the other two.

Worked example — MF +200%

magicFind = 2.0magicFactor = 1 + 2.0 = 3:

magicChance  = clamp(0.25 × 3, 0, 0.75) = 0.75   (capped)
rareChance   = clamp(0.25 × 3, 0, 0.75) = 0.75   (capped)
uniqueChance = clamp(0.05 × 3, 0, 0.50) = 0.15   (not yet capped)

P(Normal) = 1 − 0.75                    = 0.25      → 25%
P(Magic)  = 0.75 × 0.25                 = 0.1875    → 18.75%
P(Rare)   = 0.75 × 0.75 × 0.85          = 0.478125  → 47.81%
P(Unique) = 0.75 × 0.75 × 0.15          = 0.084375  → 8.44%

Because both leading gates are pinned at 0.75, P(Magic) has actually risen back to 18.75% and P(Normal) can never drop below 25% no matter how much more MF you stack — the only remaining lever is the Unique gate.

Odds table by Magic Find

RarityMF 0MF +50%MF +100%MF +200%
Normal75%62.5%50%25%
Magic18.75%23.44%25%18.75%
Rare5.94%13.01%22.5%47.81%
Unique0.31%1.05%2.5%8.44%

Dungeon Magic Find bonus

Rolling rarity inside a dungeon adds a flat DUNGEON_MAGIC_FIND_BONUS = 1.5 to your effective Magic Find for the rarity roll only:

effectiveMagicFind = playerMagicFind + (inDungeon ? 1.5 : 0)

So a player with 0% MF farming a dungeon rolls rarity at magicFactor = 2.5 (magicChance = rareChance = 0.625, uniqueChance = 0.125). Between the ×1.5 drop chance and the +150% rarity MF, dungeons are the premium farm — but the two bonuses are independent mechanics, not one number.

See also