DPS Simulator
experimental model ⓘ
Experimental Built for comparing builds — not for predicting your live damage. What’s modeled →

Character

Loading…

Buffs & modifiers

Active selections

Party buffs 0
from allies, applied to you at 100% uptime — cast your own buffs in the rotation
Self buffs 0
you cast these — pinning assumes 100% uptime; put the skill in the rotation for cast-accurate timing
Target debuffs 0
applied to every dummy
Starting summons 0
already active at fight start — pets and clones you walk into the fight with; counts are not mana-checked, so only enter what you can maintain

Fight single-target skills & autos hit the first dummy; AoE casts hit all

Each crit, hit, proc, status and Multistrike outcome is sampled.
Monster presets use the game’s stat formulas. Boss buffs can change live values; edit any field to match your target.
melee range (≤6m)
Model notes

This simulator is a best-effort deconstruction of the game engine: damage formulas, cooldowns, buffs, DoTs, autocasts and summons are transcribed from the game code, and what we model is checked against closed-form math and recorded fights. It is built for comparing builds, gear stages and rotations — not for predicting a live fight to the last point.

Known simplifications:

  • Expected mode probability-blends crits, hits, procs and statuses into one deterministic comparison number. Rolled fights samples those outcomes, physical damage variance and fractional multistrike independently with a reproducible seed, then reports the mean and P10–P90 across the selected fights. Its breakdown, timeline and log show fight 1, not the mean.
  • Auto counts are attack attempts, not animation loops. The in-game meter’s xN counts landed damage events, while the simulator counts server-side attack attempts; visible weapon animations are a third boundary. Dual-wield schedules two hit events per attempt. In Rolled mode the fight log shows those mainhand and offhand events separately with CRIT/HIT/MISS badges. Compare damage per attempt or total damage, not those raw counts as if they were the same unit.
  • Fights happen on stationary dummies: no movement, dodging, mechanics downtime, or deaths.
  • Skills have weapon requirements, and toggle stances keep checking them. A skill with a WeaponTypes list can only be cast while one of those weapons is in hand — rotation entries auto-pick the weapon loadout that satisfies it, and the optimizer will never choose a skill your weapons can't cast. Toggle stances go further: the engine re-checks the requirement every tick and strips the buff the instant you hold anything else, then re-applies it by itself when you swap back (no re-cast, so listing a toggle twice in a rotation only spends cast time). So Sniper's Nest (Bow/Rifle) is not applied to a Launcher cast — grenades never get its Ranged Damage, even though they are ranged damage. Same for Trigger Happy (Pistol), Fanaticism (Mace/Sword/Spear/Wand/Book) and High Guard (Shield). A stance whose status has another, unrestricted source (Shock Absorber also comes from Jump Shot) stays ungated. The swap back is not instant, though: Sniper's Nest — the one stance in 0.30.0 with a ToggleStillTime (1s) — must be armed standing still for that second again after every swap, so the sim withholds it for a second on each return to a Bow/Rifle set and charges its uptime row for the gap. Not modeled: the weapon swap itself is free (the engine exposes no swap lock).
  • A few niche stats and triggers aren’t modeled yet (on-block / on-dodge / on-kill riders, weapon-swap animation time).
  • Gear that grants a skill gives you that skill. An item carrying GrantSkill (Kraken Card → Blizzard, Razor’s Edge → Limit Break, Amber Loop → Heal, Jack-o’-lantern → Death Coil) now shows up in the add-a-skill list and can be picked by the optimizer, cast at the level the item grants — on top of feeding on-attack autocast procs for you and your summons. Weapon requirements still apply, exactly as they do to a skill you trained.
  • Some zones can only have one copy alive, so recasting cuts the old one short. A skill with a MaxInstances cap (Fire Pillar allows 1) despawns its oldest live zone when you exceed the cap, so a pillar recast every 3s only ticks for 3s — not its full 5s duration. The sim now uses the cadence your rotation actually casts at, so spamming a capped zone no longer credits time it never had.
  • Multi-projectile skills are an upper bound — every projectile is assumed to connect. Gear that adds spawns to a skill (Kraken Card turns Ice Shard into 3 shards, each a full-damage hit) fans them across a 60° arc around your aim rather than along it, so the outer shards only land point-blank or against something big enough to eat the whole spread — at range, against a small target, they sail past. The sim has no range, no aim line and no target hitbox, so it prices every spawn as landing: those skills read at their ceiling here, and a kiting build will do less in game. That is deliberate — overstating them by a known mechanism is more useful for comparing builds than correcting them with a made-up one.

Spot a number that disagrees with the game? Share your in-game parse or feedback in the SpiritValers thread on Discord — real parses are what calibrate the model.

Rotation

Result

expected DPS · experimental
total over fight
skill casts + Basic Attack meter events

Fight log

casts buffs autos autocasts dots