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)
| Enemy | Overworld | In a dungeon |
|---|---|---|
| Common | 0.04 | 0.06 |
| Rare | 0.08 + 0.04 | 0.12 + 0.06 |
| Special | 0.16 + 0.08 | 0.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 level | Tier cap |
|---|---|
| 1–20 | 1 |
| 21–40 | 2 |
| 41–60 | 3 |
| 61–80 | 4 |
| 81–99 | 5 |
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():
- If the roll fails
magicChance→ Normal (stop). - Else if it fails
rareChance→ Magic (stop). - Else if it passes
uniqueChance→ Unique, 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.0 → magicFactor = 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
| Rarity | MF 0 | MF +50% | MF +100% | MF +200% |
|---|---|---|---|---|
| Normal | 75% | 62.5% | 50% | 25% |
| Magic | 18.75% | 23.44% | 25% | 18.75% |
| Rare | 5.94% | 13.01% | 22.5% | 47.81% |
| Unique | 0.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
- Item Bases — the base pool per tier
- Affixes — how rolled affix values scale with item level
- Uniques — the authored Unique items
- Inventory & Equipment
- Region Resonance — the Magic Find and material-drop bonuses from raising a region’s difficulty