Diceplots → Games → Diablo 4

Diablo 4 damage math — crit chance + Critical Strike Damage as exact rationals

D4 has no to-hit roll — every attack lands. The variance comes from the crit chance / Critical Strike Damage interaction, plus a stack of multiplicative damage buckets. The engine models the crit-vs-CSD path exactly; multi-bucket damage stacking and Lucky Hit / armor / EHP are tracked as upcoming work.

The damage formula

Patch 1.2.0 changed the bucket layout: as of Season 2 onwards, Critical Strike Damage, Vulnerable Damage, and Overpower Damage are all in the additive bucket, not separate multiplicative buckets like the original launch model. Multiplicative buckets are now reserved for sources tagged as x-prefixed in tooltips (e.g., x[15-20]% Damage with Two-Handed Weapons) — typically class-passive multipliers, key passives, and a small set of legendary aspects.

So the modern D4 per-attack damage formula:

damage = base × (1 + Σ additive_buckets — including +CSD%, +Vulnerable%, +Overpower%, +Damage to X) × (1 + crit_chance × (1 + csd_total)) (the conditional crit multiplier on top of the additive layer) × Π (1 + xMultiplicative_i)

The big practical correction vs the launch-era pillar text: stacking +50% CSD and +50% Vulnerable doesn't give you ×1.5 × 1.5 = ×2.25 anymore. It gives you a single +100% additive bucket = ×2 added to the rest of your additive layer. Players coming from the launch metas need to recalibrate their bucket math.

Engine grammar (modern D4, post-Patch 1.2.0):

<base> @ hit 100 crit <N>% cdr <M>% [vuln | vdr <V>%] inc <X>% inc <Y>% boost <Z>% …

  • cdr M% = +M% Crit Damage gear stat. Adds to the additive bucket only on the crit branch; the engine also applies an implicit ×1.50 baseline crit multiplier when cdr is set. So cdr 100 models "+100% Crit Damage from gear," and crit damage = base × 1.50 × (1 + sum_of_active_additives + 1.0) × multiplicative buckets.
  • vuln (no-arg flag) = target is vulnerable; applies the always-on ×1.20 baseline vuln multiplier on both branches.
  • vdr V% = +V% Vulnerable Damage gear stat. Adds to the additive bucket only when the target is vulnerable; implies vuln if not already set.
  • inc X% = unconditional additive bucket (+Damage to Close, +Damage While Berserk, etc.). Multiple inc postfixes SUM into one bucket.
  • boost Z% = multiplicative bucket — D4's x-prefixed legendary aspects, key passives, weapon-class multipliers. Each boost compounds separately.

Worked example with Vulnerable, +Crit Damage gear, and an x-aspect — endgame profile against a vulnerable target: 100 @ hit 100% crit 30% cdr 100% vdr 50% inc 150% boost 25% models a 30% crit, +100% Crit Damage gear, +50% Vulnerable Damage gear, +150% additive (from +Damage to Close, +While Berserk, etc.), and a 25% multiplicative aspect.

Legacy csd N% grammar still supported for non-D4 ARPGs and pre-1.2.0 D4 builds — it models "crit deals N% of base" as a single multiplicative on the crit branch (no baseline 1.5, no additive-bucket interaction with inc). It's NOT a faithful modern-D4 model: with stacked inc, csd over-counts vs the additive-conditional reality. Side-by-side at 30% crit with +200% inc: csd 250 inc 200 → mean 435 (engine cross-term); cdr 100 inc 200 → mean 390 (correct modern D4). Use cdr for D4 post-Patch 1.2.0; csd for "crit deals N% of base, no additive bucket" simpler models.

Worked examples

Build context Expression Strike URL
Baseline (no CSD stat) 100 @ hit 100 crit 30 csd 150 /strike/100~hit100crit30csd150
+100% CSD endgame 100 @ hit 100 crit 30 csd 250 /strike/100~hit100crit30csd250
+200% CSD high-end 100 @ hit 100 crit 30 csd 350 /strike/100~hit100crit30csd350
+400% CSD mythic-uniques 100 @ hit 100 crit 50 csd 550 /strike/100~hit100crit50csd550

Each strike URL renders the full distribution and the expected per-attack damage. Drag the HP slider to compare against monster HP totals (illustrative example: NM Dungeon trash ~1k HP, Torment IV elites ~50k+ — these are patch-dependent and drift each season; use your current season's actual HP values).

The crit-vs-additive breakeven

The most-asked D4 build question: should I stack +1% crit chance or +1% additive damage on this affix slot? The answer depends on your current CSD. Closed-form derivation and breakeven table:

Crit chance breakeven pillar

What damage profile clears each Torment Tier?

Strike-threshold framework for "you need X damage for T4" build-guide claims. Closed form for low-variance builds plus the variance correction for crit-heavy profiles:

Expected damage by Torment Tier

Lucky Hit — the hidden second roll

Every D4 attack rolls TWO independent things: damage (with the crit / CSD / multiplier pipeline above) AND a Lucky Hit check that gates secondary effects — chill, freeze, poison, bleed, Aspect-based proc damage, paragon node procs. The Lucky Hit chance is its own stat, separate from crit chance, and the proc itself usually has its own conditional probability on top.

Engine grammar:

<attack> lh P% then <expr>

Reads as "on a hit (or crit), an additional roll succeeds with probability P%; on success, <expr> is rolled and added to the attack's damage." Use it to model Aspect-based flat damage, on-proc cold/poison damage from skills, or anything where "X% Lucky Hit chance to deal Y damage" is the natural build description. The proc damage is FLAT — not scaled by crit doubling, csd, or boost multipliers. Skill-modifier procs that DO scale should be expressed as additional damage terms inside the main attack instead.

How to compute P: the Lucky Hit Chance shown on a tooltip is NOT the same as the engine's lh P% argument. Per the Maxroll Lucky Hit Mechanics guide, the actual proc rate is:
P = min(1, skill_LHC × (1 + LH_chance_gear%)) × effect_chance
Where skill_LHC is the per-skill Lucky Hit Chance shown in the advanced tooltip (e.g., Whirlwind 25%, Ball Lightning 25%, Death Trap 40%), LH_chance_gear% is your additive total of "+X% Lucky Hit Chance" from gear and paragon, and effect_chance is the chance listed on the LH-trigger effect itself (e.g., "33% Lucky Hit Chance to slow"). Maxroll's worked example: a 40% LHC skill, +5% gear, 30% effect chance gives P = 0.4 × 1.05 × 0.3 = 12.6%, NOT 30%. Plug the final P into lh P%; entering the effect-chance alone overestimates proc rate by 3–5×.

Internal cooldown caveat: some Lucky Hit effects are gated by an in-game cooldown (Maxroll documents ~0.7s for Victimize, similar for some other Aspects). The engine treats every attack as eligible to proc — at high attack speeds (5+ APS), the engine over-counts vs reality for cooldown-gated effects. To compensate, cap the lh P% argument at the cooldown-implied maximum: P_effective = min(P, 1 / (cooldown_s × attacks_per_s)). Effects without a documented cooldown (most non-Aspect Lucky Hit triggers) are unaffected. The cooldown set varies by season, so check the Maxroll Lucky Hit page for current gates if you're authoring a high-APS build.

Worked example — 100 @ hit 100 crit 30 csd 350 lh 25% then 2d6 models a baseline 100-damage hit with 30% crit / 350% CSD AND a 25% Lucky Hit chance to deal 2d6 cold proc damage. Mean per attack is the standard 175 baseline plus 0.25 × 7 = 1.75 from the LH contribution = 176.75.

The Lucky Hit primitive composes with everything in the existing attack pipeline (csd, boost, crit chance) and answers the recurring r/Diablo4 question: "is Aspect of X actually worth a slot at my LH chance?" The answer is the per-proc expected damage compared against an alternate slot's contribution, both computed as exact rationals.

Armor — post-build damage reduction

D4's armor stat reduces incoming damage by a percentage that scales against a level-dependent constant. Per the community-documented formula (Maxroll D4 defenses guide):

DR = armor / (armor × 10/9 + C)

where C is level-dependent (C ≈ 5000 at level 60, smaller at lower levels). The 10/9 denominator factor is what caps DR near 90% asymptotically — no amount of armor reaches full damage immunity.

That percentage applies AFTER your build's damage math — base × crit × csd × boost × lh — so it covers every damage contribution including Lucky Hit procs. The engine consumes the post-curve percentage directly via the adr P% postfix; the caller (build planner, MCP tool, comparison page) computes the curve once and feeds the result in.

Engine grammar:

<attack> adr P%

Reads as "after build-side damage, subtract P% of the result." Final damage is floor(computed × (1 - P/100)) per outcome. Distinct from dr<n>, which subtracts a flat amount BEFORE the multiplier pipeline (use dr for monster physical-DR-style flat reduction; use adr for percentage armor mitigation).

Worked example — 100 @ hit 100 crit 30 csd 350 lh 25% then 2d4 adr 25% models the full D4 build pipeline from Lucky Hit above with a 25% armor reduction (the post-curve percentage for, e.g., a well-armored target at level 100). Mean drops from 176.25 pre-armor to 132.1875 post-armor — exactly 75% of the build's paper damage.

Pairs with the Lucky Hit and crit-vs-additive pillars to answer the recurring r/Diablo4 build-planning question: "given my armor stack and the level of content I'm pushing, how much damage am I actually doing?"

What this page covers

Per-hit damage math: the crit / csd / boost / lh / adr additive-vs-multiplicative path, applied to D4's affix stacks. Three adjacent questions compose with this answer rather than replace it:

  • Effective HP (EHP) — the defensive pipeline (resistance × armor × block × dodge) answers "can the build survive". Compose with the per-hit threshold for the clear × survive product.
  • Damage Over Time (bleed / poison / burn) — separate damage stack with its own tick rate (D4 ticks every 0.5s, 2 ticks/sec). Per Maxroll's DoT mechanics guide, the per-tick maximum is tickMax = (dotAtk × attacks_per_sec) / 2; DoTs cannot crit or overpower; and Bleed / Poison snapshot your damage buffs at application time (the buff persists for the DoT's duration even if it wears off the player). The engine's generic DoT scheduler in arpg.rs consumes a per-tick damage value; compute it via the formula above and feed in. Layer on top of the per-hit baseline this page computes.
  • Tooltip DPS vs effective DPS — tooltip shows per-hit damage; multiply by attack speed × uptime for sustained DPS. The per-hit answer is the building block.

The D4 attack model shares its outcome-decomposition machinery with the XCOM 2 game page (XCOM uses the same percentage-attack pipeline with hit/crit/graze/miss; D4 is the always-hit / crit / CSD subset). Both games surface what tooltip averages hide: the distribution shape, not just the mean.