gSim for Project Quarm Everquest DPS Simulator · v1.51
Era
Total DPS —
TOTAL TPS —
Easy Advanced

CHARACTER & FIGHT

41%

WEAPONS

Main Hand
Main hand: Unequipped
DMG: - | Delay: - | Proc: -
Main hand weapon icon
Offhand
Offhand: Unequipped
DMG: - | Delay: - | Proc: -
Offhand weapon icon
Resulting Output
—

Session History

Simulation Assumptions


            
Equipped Items
Alternate Advancement

Character

Class and level auto-fill skills and weapon caps. Edit below to override.

StatBase+PtsGearFinalBuffed
Points remaining: 25
Net haste: Worn 0% + V1 0% = 0% → 0% Spell ATK +0
Skills & options
Defensive skills

Flying Kick / Backstab / Kick / Bash/Slam fire on cooldown. Haste reduces reuse.

Buffs
Haste
Offensive
Defensive
Bard Instrument Mods

Weapon 1 (Main Hand)

Delay in tenths of a second (40 = 4.0s, 25 = 2.5s).

Proc, elemental & bane

Weapon 2 (Offhand, optional)

Delay in tenths of a second (40 = 4.0s, 25 = 2.5s)

Proc, elemental & bane

Target & Fight

If no specific target is selected from search, a generic target is used based on character level (target level = character level; AC scales linearly from 5 at level 1 to 200 at level 60).

Behind: misses still occur from to-hit vs avoidance; only block/parry/dodge/riposte are skipped.

Resistances & bane options

Magic, Fire, Cold, Poison, Disease. Used when weapons have elemental damage.

When checked, each weapon's bane damage is added to its base damage.

When checked, the sim treats the target as undead (body type Undead). Enables undead-only procs and Paladin Slay Undead AA.

Report

Run a simulation to see the report.
Item search debug
Select an item from search to see API itemType and mapped type.
Version log
  • 1.94 — Monk Technique of Master Wu: the damage-per-swing histogram and pie chart used to treat the base Flying Kick and its bonus Wu strikes as separate individual hits, which understated how much damage a single Flying Kick attempt could really produce once Wu's extra strikes are counted. When Master Wu is active, the histogram now shows "Special Abilities — damage per round" — one bar per Flying Kick round, combining the base kick with any bonus strikes that fired in that same round (a round where everything misses shows as 0). The pie chart's special-attack slice is now labeled "Special Abilities" instead of just "Flying Kick," and hovering over it (or its legend entry) shows a breakdown of damage by Flying Kick / Eagle Strike / Tiger Claw / Round Kick. Separately, the Melee report's Hit Damage Statistics section now distinguishes absolute max/min hit (the single highest/lowest hit seen across every run) from average max/min hit (the mean of each run's own max/min) — previously only the absolute values were shown under a single "Max hit"/"Min hit" line. Mechanics guide updated.
  • 1.93 — Gear Advisor rework: the BIS Set optimizer used to fill each slot's best item once, in a fixed order, and never reconsider earlier picks — so the recommended helm (for example) was always whatever looked best before any other slot was chosen, even when a different helm would have combined better with the rest of the set. It now runs several full passes that fill slots in different orders, then repeatedly revisits every slot trying each of its next-best candidates (not just its single top pick) and keeps whichever swap raises the whole set's total value, before keeping the best-scoring complete set across all passes. Also fixed a scoring bug where, during this refinement, a currently-equipped weapon's own damage/delay ratio wasn't counted when deciding whether to replace it (candidates were, since they went through separate scoring paths) — this affected both the BIS Set and Upgrade Advisor tabs for Primary/Secondary weapon slots. Mechanics guide updated.
  • 1.92 — Gear Advisor fix: when Haste% was priority #1 (the default for the Melee DPS/Ranged presets), the optimizer kept chasing it for every slot's candidates even after another slot already supplied a strong haste item — since only the single highest worn-haste item in a build ever applies in EQ, a second or third "also has haste" item never provided any real benefit, but the priority-tier scoring didn't know that and could still let a marginal leftover sliver of haste room outweigh a much bigger gain in a lower-priority stat, crowding out otherwise-better itemization. Haste now counts as satisfied for scoring purposes the moment any other slot supplies it at all (unlike every other stat, which stays additive toward its target), so once one slot secures haste, the rest of the build weights purely toward the remaining stat priorities.
  • 1.91 — Gear Advisor fix: PoP-tier worn-haste items were losing scoring ties to older, lower-haste gear because the optimizer's haste target was still the pre-PoP 41% cap — once a slot hit 41% haste, a genuine 44–46%-haste PoP item scored no marginal benefit over it (both clamp to the same target), so PoP haste gear could silently fail to surface as the BIS or top-upgrade pick even when it was the better item. The Gear Advisor's haste target/cap now raises to 46% (the highest worn-haste item available in the era, used here as a hard target rather than a server-enforced cap) whenever Planes of Power is the selected era, matching the same 305 stat-cap treatment added in 1.90. Mechanics guide updated.
  • 1.90 — Fix: Planes of Power's automatic level 61–65 stat cap increase (+5 per level above 60, per Client::GetMaxStat) was not modeled — the sim only raised the STR/DEX/AGI/STA/INT/WIS cap via Planar Power AA ranks, leaving it flat at 255 for a level 65 character with no AA invested instead of 280. The cap now scales with level automatically (260 at 61 up to 280 at 65) with Planar Power still adding its own +5/rank on top, for a max of 305 at level 65 + rank 5 — applied everywhere a stat cap is enforced (Character card's stat table/MAX buttons, Melee, Ranged, Tanking, and the Rotation tab's caster INT/WIS/DEX). Also fixed a latent bug in the Ranged tab's engine where an explicitly-passed higher DEX cap was silently re-clamped back down to 255 internally. Separately fixed the Character card's stat cap not refreshing live when clicking a Planar Power rank button (only updated on other stat-table interactions). Gear Advisor: fixed it silently ignoring Planar Power entirely (a stale CSS selector meant it always read rank 0), and — since BIS gear takes a while to farm, by which point Planar Power rank 5 is a safe assumption — it now targets the full 305 cap outright whenever Planes of Power is the selected era, regardless of the Planar Power rank actually entered. Also fixed the Era selector being visibly shorter/misaligned against the Preset buttons in the Gear Advisor's control row. Mechanics guide updated.
  • 1.89 — New What's New popup: returning visitors who last used an older gSim version now see a small dialog on page load summarizing everything that changed since their last visit, pulled directly from this Version log (no separate list to maintain). It only appears once per release you haven't seen yet — first-ever visitors and anyone already on the latest version won't see it. Dismiss with the "Got it" button.
  • 1.88 — Removed the Monk Non-Epic FW checkbox — non-epic fistweaving (bare fists, 27-decisecond swing, 14 base damage) is now the sim's only fistweave mode, applied automatically whenever Force Fistweaving is checked for a monk, since it's the general case (the Epic 1.0 fist weapon's faster/lighter numbers were a rarely-used alternate the checkbox exposed). No output change for anyone who already had it checked. Mechanics guide updated.
  • 1.87 — Melee tab's Special attack dropdown gains Dragon Punch, Eagle Strike, Tiger Claw, and Round Kick for Monks (previously only Flying Kick was selectable; the other three only appeared as Technique of Master Wu's random extra strikes). All non-Backstab specials — Kick, Bash, Flying Kick, and the four new Monk skills — are now genuinely skill-driven: base damage, offense rating, and to-hit are computed from that special's own actual skill value (a new "<Special> skill" field, default 252) via the server's real GetSkillBaseDamage/GetOffense/GetToHit formulas, instead of Kick and Bash's previous fixed damage constants (which didn't match the server formula at any skill level) or Flying Kick's assumed-max-skill constant. Worn +skill% gear mods for all seven apply automatically (same non-stacking rule as other worn skill mods). Bash also gains its real shield-AC bonus (a new "Shield AC" field appears when Bash is selected) — the dominant source of real Bash damage, previously unmodeled. Mechanics guide updated (new section 7.5.1).
  • 1.86 — Extended worn skill-mod support (added in 1.85 for Archery) to the rest of the skills the sim models: Offense, Double Attack, and Dual Wield on the Melee tab, and Defense, Dodge, Parry, Riposte, and Block on the Tanking tab. Import Inventory now scans every equipped item for these skillmodtype/skillmodvalue bonuses too, keeping only the highest per skill (server bonuses.cpp rule — same non-stacking behavior as the existing weapon/Backstab/Archery mods), and applies it on top of whatever base skill value is entered. The Equipped Items summary lists each one found under a "Worn +<Skill> %" line with a non-stacking note when multiple items carry the same mod. Mechanics guide updated.
  • 1.85 — Fix: worn +Archery % item modifiers (e.g. Eye of the Frenzied Owlbear, or a bow like Bow of Flames) were being summed across every equipped item that carries one instead of only the highest applying — per server bonuses.cpp, skill mods of the same type don't stack, matching how melee weapon-skill mods (Shadowed Torment, etc.) already worked. Import Inventory's gear scan, the Rank Weapons tool, and the ranged-weapon item-search swap/clear logic all now take the max instead of adding, and the Equipped Items summary's "Worn +Archery %" line notes when multiple items carry the mod that only the highest applies (same wording as the existing Worn Haste note). Archery skill in the report is now only ever boosted by one worn mod at a time.
  • 1.84 — Rotation tab TPS fix: per-cast threat was being computed as the actual damage dealt (post-resist, post-crit), so a full resist wrongly zeroed out that cast's threat and a crit wrongly inflated it. Per EQMacEmu (Mob::CheckAggroAmount / Mob::ResistSpell), a detrimental cast's hate comes from the spell's plain listed/base damage regardless of resist or crit outcome — resists and crits only change the damage dealt, never the threat generated. Threat is now computed from that base value; DPS is unaffected. Also fixed the DPS-over-time chart's TPS line, which was deriving per-wave threat from actual (not base) damage for rains/DoTs. Separately fixed the Target Mob fields (level, MR/FR/CR/PR/DR) drifting out of sync between tabs — e.g. Easy Mode's "raid target" preset bumped Melee's resists to 75 but left the Rotation tab's copy at its old value, so the Rotation sim silently kept using stale (often lower) resists. Every place that sets the target mob now routes through one shared function that updates the Melee, Ranged, and Rotation copies together, and clearing the target (or having none selected) resets all three to the same generic level-matched defaults (MR/FR/CR/PR/DR 35, matching Melee's own default) instead of just Melee's. Also fixed inventory import (Import Inventory / Quarmy files): AA ranks from the file were silently failing to apply to the Alternate Advancement panel — a ReferenceError partway through processing the imported AAs (a leftover scoping bug — the import code lived in a different script closure than the AA Configurator's underlying data) aborted before the panel could be refreshed, even though the imported AAs still listed correctly under "AAs imported" on the Equipped Items card. AAs imported from a file now check off correctly. Also fixed Spell Casting Subtlety being modeled as a 1-rank on/off AA in the Configurator when it's actually a 3-rank AA — real exports were importing rank 3 into it, which couldn't match any of the old 0/1 buttons and showed as unchecked. Mechanics guide updated.
  • 1.83 — AA Configurator fix: Quick Damage and Spell Casting Fury Mastery were incorrectly offered to every caster/hybrid class (same list as their prereq, Spell Casting Fury) — per this server's AA table, these two follow-up AAs are restricted much more narrowly (Quick Damage: Druid/Wizard/Magician; Spell Casting Fury Mastery: Wizard only), so e.g. Bard was wrongly showing both. Class lists corrected; both AAs also zero out for the excluded classes in computed sim output, not just the configurator UI. Mechanics guide updated.
  • 1.82 — Buff Panel: fixed Dance of the Blade — its third effect was mislabeled as +30 AC, it's actually +30 STR. Also fixed it being incorrectly suppressed (via SAI stacking group) when Ancient: Feral Avatar, Avatar, or Ferine Avatar was also up — real EQ stacking compares each spell's effects slot-by-slot, and Dance of the Blade's ATK/STR sit in effect slots that don't collide with those spells', so they stack in-game and now stack in the sim too.
  • 1.81 — New landing splash on first visit (or after a new release): a mode-picker image lets you choose Easy or Advanced mode by clicking either half. Your choice is remembered in the browser so you won't be asked again until gSim updates or you visit from a new device/browser.
  • 1.80 — Buff Panel: added Dance of the Blade, the proc buff from the bard epic 1.0 weapon (Singing Short Sword) — +55% haste, +30 ATK, +30 AC for 3 minutes (spell 1937, Luclin-era).
  • 1.79 — Rotation tab's AA & Gear card: the Wizard innate crit line now shows the formula (((INT + DEX) / 2 + 32) / 10000) instead of a computed percentage — it previously calculated using whatever INT/DEX happened to be in the Character card at that moment (often an unset 75/255 default), which read as the actual crit chance but usually wasn't. The real calculated chance, using the run's final INT/DEX (base + gear + buffs), still appears in the Rotation Report after simulating, unchanged. Also fixes the caster INT/DEX/WIS the sim itself uses (Wizard innate crit calc, spec skill) to include active buff bonuses on top of the Character card's base+gear stat, not just gear (e.g. Koadic's Endless Intellect's +25 INT now counts).
  • 1.78 — Rotation tab's AA & Gear card: new Add focus effect manually picker lists every focus effect found on any item in the database (135 distinct effects) so you can test its impact without owning or equipping the item — resolved and applied through the same itemFocus.js logic as an equipped focus (same resist/spell-type/level/cast-time restrictions), and deduped against equipped items so the same focus spell never double-counts. New ItemFocus.getAllKnownFocusEffects() helper (dedupes items.json's focuseffect field by spell id, cached). Mechanics guide updated.
  • 1.77 — Fix: flat SE-92 proc hate (e.g. Enraging Blow's +700) was being folded into the same 400-capped non-damage hate bucket as detrimental no-damage procs, so it was silently clamped to 400 instead of applying its full value — a regression from the 1.47 threat-cap refactor that contradicted the sim's own documented intent (flat SE-92 hate is meant to be uncapped, same as direct-damage proc hate). Now added after the cap is applied, so Enraging Blow and similar spells correctly generate their full flat hate per successful proc. Affects both the melee/main proc path and ranged (bow) procs. Mechanics guide updated (section 2.2).
  • 1.76 — Fix: Easy Mode's Ambidexterity AA (and Combat Fury/Spell Casting Fury/Slay Undead defaults, plus max-stat defaults) only auto-applied at exactly level 60, and Easy Mode itself hard-capped level at 60 with no way to represent PoP's level 65 — so switching from a pre-PoP era to PoP (which auto-bumps character level to 65) silently dropped Ambidexterity's +32 effective dual-wield skill, measurably lowering the real chance of getting an offhand swing at all and cutting offhand proc rate well below what DEX/gear alone would predict. Easy Mode now unlocks levels 61-65 when PoP era is selected, and all of these level-gated defaults check level >= 60 instead of === 60, matching Advanced mode's (already-correct) logic. Also fixes any PoP-only weapon proc with a 61-65 proc-level requirement being incorrectly gated off even while playing in PoP era, since the real level was previously getting clamped down before that check ran.
  • 1.75 — Fix: the Equipped Items summary (stat pills, item list, gear totals) silently failed to render whenever any equipped item — including via Edit Inventory from a blank slate, not just file import — got as far as being scanned for a melee weapon-skill mod. A ReferenceError: SKILL_ID_TO_MELEE_KEY is not defined (a leftover from the 1.74 gear-scan feature referencing a variable that only existed in a different script closure) aborted the whole inventory-apply function partway through, before the summary code ran, with nothing visible in the UI to indicate a crash had happened. Verified fixed by adding an item via Edit Inventory starting from a fully blank inventory — the summary panel and weapon fields now populate correctly with no console errors.
  • 1.74 — Rank Weapons tool: melee weapon-skill mods were already applied per-weapon (each candidate's own skillmodtype/skillmodvalue), but ignored gear-wide mods picked up from Import Inventory (rings/armor). All 9 spots that compute a candidate weapon's effective skill now take the max of the weapon's own mod and the gear-wide mod, same as the main Melee tab sim, so ranking results reflect your actually-equipped gear.
  • 1.73 — Fix: melee weapon-skill mods (Shadowed Torment, etc.) still didn't apply for anyone who'd previously selected that weapon from item search before the 1.70 fix — the "Recent" weapons list caches the full normalized weapon object in localStorage indefinitely (survives hard refreshes), so a weapon picked from Recent replayed the old cached object with no skillmodtype/skillmodvalue at all, the same failure mode the Backstab mod already had a fallback for. Now falls back to re-deriving the mod from the underlying local item data via the cached object's itemId, same pattern Backstab and worn-ATK already use. Also reverted the "Offense rating > From skill" line's parenthetical back to the generic "(weapon type skill)" label (previous change named the specific skill there, which read as confusingly duplicating the separate "Offense skill" line above it since the two often show the same number by coincidence).
  • 1.72 — Weapon 1/Weapon 2 cards now show a melee weapon-skill mod (e.g. Shadowed Torment's 2H Slashing bonus) the same way Backstab and Archery mods already appear — the small skill line under the weapon name adds "2HS +3% (225→231)" (percent plus the resulting base→post-modifier skill) whenever the equipped weapon or gear carries one. Previously only the modifier percentage showed, with no visible post-modifier skill number. The badge doesn't overwrite the shared base-skill input (unlike Backstab's dedicated field) to avoid double-applying the modifier on the next simulation run. Mechanics guide updated.
  • 1.71 — Fix: the 1.70 weapon-skill report fields (named skill, base/mod/post-mod, MH/OH breakdown) never actually showed up because the default 20-run averaged simulation built its combined report object field-by-field and simply omitted them — always falling back to the generic "weapon type skill" label regardless of what weapon or mod was equipped. Single-run (Runs=1) simulations were unaffected. These fields are deterministic per simulation (not RNG-dependent), so they're now copied straight from the first run's report, same as offense skill/rating already were.
  • 1.70 — Offense & To-Hit Model report: "From skill" lines now name the actual skill (e.g. "225 (2H Slashing)") instead of a generic "(weapon type skill)" label. Fixed a bug where melee weapon-skill mods (e.g. Shadowed Torment's 2H Slashing bonus) silently failed to apply when the weapon was picked via item search — itemSearch.js only ever passed skillmodtype/skillmodvalue through for archery and backstab mods, dropping melee mods before they reached the weapon-apply code. On Import Inventory, weapon-skill mods are now also picked up from any equipped item, not just the weapon — the sim keeps the single highest value seen per skill type across all gear and combines it with the weapon's own mod using max (not sum), matching the server's non-stacking item-bonus logic, then applies the existing 252-skill hard cap. Mechanics guide updated.
  • 1.69 — Melee weapon skill mods (e.g. Shadowed Torment): fixed the 2H Slashing mod to apply as a percentage (server: skill × (100+mod)/100, capped at 252) instead of a flat +N capped at 255, and generalized it from 2HS-only to all melee weapon skills (1H Blunt, 1H Slashing, 2H Blunt, 2H Slashing, Piercing). Dual wielding now uses each hand's own weapon skill for to-hit and offense rating (matching Mob::GetToHit(skillinuse) server behavior) instead of applying the mainhand's skill to both hands — the Offense & To-Hit Model report breaks this out into MH/OH lines whenever they differ, showing base skill, % modifier, and post-mod effective skill per hand. Removed the redundant "Weapon skill cap (2hs): 225 (Quarm/TAKP)" line previously prepended above the report. Mechanics guide updated.
  • 1.68 — Rotation Planner DPS-over-time chart: added a Mana remaining line on its own secondary (right-hand) axis, and clicking any legend entry now shows/hides that series. Fixed the chart's Y-axis scaling — the trailing 30s-average line was reading as a huge, meaningless rate during its first ~30s (no full window of data yet to average over), which blew out the axis and flattened the rest of the fight; it's now only plotted (and only sets the axis scale) once a full window has elapsed. The "Mana low" marker now shows the time it happened. Sit for Med Ticks now defaults on, with Max tick wait defaulting to 2.25s (was 6.00s). New: Max mana auto-calculates from class, final INT/WIS (race + creation points + gear + buffs), and flat mana bonuses (gear "Mana" stat + buff mana pool, e.g. Koadic's Endless Intellect) whenever gear is imported — Client::CalcBaseMana/CalcMaxMana — while staying a normal editable field the rest of the time. Buffs now also track INT/WIS and mana-pool bonuses (previously only DPS-relevant stats were tracked), fixing the Buffed stat column for Koadic's/Voice of Quellious as a side effect. Mechanics guide updated.
  • 1.67 — Rotation tab mana regen: Mental Clarity AA (+1 regen/tick per rank, up to +3 — previously listed as "increases max mana pool," which was wrong; it's regen, per eqstr_en.txt) and equipped item Mana Regen (worn-effect spells like Flowing Thought I-X — e.g. Circlet/Robe/Cape of Flowing Thought — detected via each item's worneffect field, summed and capped at 15 total) are now auto-detected from the shared AA Configurator and Import Inventory and added on every tick automatically, same as Spell Casting Fury and item focus effects already are — no more typing them into the Mana regen/tick field by hand. New ItemFocus.getEquippedManaRegen helper. Mechanics guide updated.
  • 1.66 — Cast Order timeline now explains itself when Sit for Med Ticks is checked but has no visible effect: with Max mana left at 0 (unlimited), the option is a no-op (nothing to conserve), so no tick markers were showing with no explanation — the chart caption now says so directly instead of silently showing nothing.
  • 1.65 — Rotation Planner: when Sit for Med Ticks is on, the Cast Order timeline now marks every 6s med tick with a small triangle/dashed line — green if you sat for it, amber if a cast ran through it and only got the standing rate — with a legend counting each below the chart. The report adds a matching Med ticks (sat for / cast through) line. Mechanics guide updated.
  • 1.64 — Fix: Simulate Rotation (and Ranged tab spell casting) never passed a seed to the RNG, so crit rolls always fell back to the same fixed default seed and every run with identical inputs produced byte-identical DPS/crit counts — no run-to-run variance like Melee/Tanking already have. Both now generate a fresh random seed per click, matching the rest of the sim. Mechanics guide corrected (previously described the old fixed-seed behavior as intentional).
  • 1.63 — Rotation tab: new Max tick wait slider (0-6s, next to Sit for Med Ticks) caps how long the sim is willing to sit idle for an imminent tick before giving up and casting through it at the standing rate instead. Previously the checkbox always waited however long it took; now it only waits when the gap is within the slider's threshold, matching a real player's tolerance for delaying a cast to catch a tick. At 6s it behaves as before (always wait); at 0s it's identical to unchecked. Mechanics guide updated.
  • 1.62 — Correction to Sit for Med Ticks (added in 1.61): you cannot cast while sitting, so catching the higher sitting/meditate regen tick actually requires holding off casting when a tick is imminent, not just sitting for free while continuing to cast. The sim now tracks the exact 6-second tick schedule and, when checked, delays any cast that would still be running when the next tick lands (sits idle until it passes, banks the full amount, then casts) — a real DPS-for-sustain trade rather than a free bonus. Mechanics guide updated.
  • 1.61 — Rotation tab: new Sit for Med Ticks checkbox (Simulation card) models the classic mana-regen tick — a server tick lands every 6 seconds and grants 1 mana/tick standing, 2 sitting, or up to ~17 sitting with maxed Meditate skill (Client::CalcManaRegen). The checkbox picks which base rate applies, computed automatically from level/Meditate skill and added on top of the Mana regen/tick field, which now represents only gear/AA/spell regen (previously that field had to include base regen manually). Mechanics guide updated.
  • 1.60 — AA Configurator corrections: Spell Casting Fury Mastery and Quick Damage moved from the Luclin Archetype section to Luclin Class (they're class-tier AAs, not archetype); Spell Casting Expertise, Spell Casting Deftness, and Spell Casting Subtlety moved from Luclin Class to Luclin Archetype; Wizard no longer offered Spell Casting Reinforcement (not on that class's AA line). Mechanics guide updated.
  • 1.59 — Rotation Planner report: since the sim only replays a single seeded run (unlike Melee/Tanking's multi-trial average), the existing Crits landed line was just that one run's actual roll outcome. Added a new Avg crits per run line showing the analytic expected crit count (each cast's real crit probability — Spell Casting Fury's chance, plus the wizard innate chance on casts SCF didn't already crit — summed across every cast), so the long-run average is visible alongside the single realized roll. Mechanics guide updated.
  • 1.58 — Wizard's default checked rotation spells changed to a fixed 8-spell set (Garrison's Superior Sundering, Elnerick's Electrical Rending, Ice Spear of Solist, Ancient: Destruction of Ice, Draught of Ice, Tears of Prexus, Tears of Solusek, Tears of Druzzil) instead of the generic top-8-by-damage pick; every other class is unaffected. New Spell Specialization control on the Rotation tab's AA & Gear card discounts mana cost for spells in the chosen school (Abjuration/Alteration/Conjuration/Divination/Evocation), matching Client::GetActSpellCost's 1 + skill/20 formula plus the Spell Casting Mastery AA's 2.5/5/10% bonus — the skill is assumed trained to the class/level cap (5×level+5, capped at 200), matching this server's one-specialization-past-50 rule, and the dropdown auto-picks whichever school the checked pool leans on most. Mechanics guide updated.
  • 1.57 — Ranged tab: removed Drones of Doom from the Spell Casting (between shots) options — no Ranger is likely to actually weave a DoT into a quiver rotation in practice. Down to three spells: Calefaction, Call of Flame, Firestrike (new default priority order). Mechanics guide updated (section 23).
  • 1.56 — Ranged tab: Spell Casting (between shots) card moved above Target & Fight (now its own full-width section between the weapon/arrow cards and Target & Fight, rather than a 2-column grid item after it). It now auto-refreshes spell availability/damage whenever class or level changes in the Character module, same as the Rotation tab's spell pool — no more forgetting to click Refresh after leveling up. Default cast-priority order changed to Drones of Doom, Calefaction, Call of Flame, Firestrike (DoT first). Mechanics guide updated (section 23).
  • 1.55 — Ranged tab report: the Spell Casting (between shots) section now appears just above Final Totals instead of after it, and Final Totals itself now folds the spellcasting timeline's results in — Ranged (physical) damage/TPS and Spell damage/TPS are shown as their own clearly-labeled lines immediately followed by Combined total damage/DPS/TPS, rather than the two totals sitting in separate, disconnected places in the report. Executive Summary and every section above Final Totals are untouched — the physical archery-only contribution stays isolated and visible there regardless of whether spell casting is enabled. EQCombat.formatRangedReport (combat.js) now takes optional spellCastResult/spellCastText params to build this; behavior is unchanged when they're omitted (e.g. no other tab is affected).
  • 1.54 — Rotation Planner / Ranged spell casting: item focus effects that extend a DoT's duration ("Extended Affliction"-type foci — Timeburn, Chronoburn, Chrononostrum, and similar PoP-era items) are now implemented. Previously itemFocus.js only recognized SE_ImprovedDamage, SE_ReduceManaCost, and SE_IncreaseSpellHaste — SE_IncreaseSpellDuration (SPA 128) was parsed nowhere, so an equipped duration-extending item silently did nothing. It now floors ticks × (100 + focusPct) ÷ 100 onto a DoT's tick count, matching Client::ApplyDurationFocus exactly, correctly scales that DoT's total damage and recast-availability gate (a longer DoT is correctly worth recasting less often) to match, and only ever applies to DoTs (never instant nukes/rains, matching the server's buff-only restriction). Same-category "extra damage from focus" report line now also captures the isolated contribution of a duration extension, not just a damage-% focus. Mechanics guide updated (section 19).
  • 1.53 — Fix rotationEngine.js Custom order mode (used by both the Rotation Planner's Custom order and the new Ranged tab spell casting): a bare var best; inside the sim's decision loop is hoisted once for the whole run, so re-declaring it every iteration was a no-op rather than a reset — if the manual priority list's top spell was temporarily uncastable (e.g. a DoT still ticking, a nuke still on its own recast) while a lower-priority spell in the pool was legitimately ready, the loop's "no match found" fallback never ran and the sim silently kept re-"casting" whatever it had cast last, even after that spell's own recast/DoT-duration gate said it wasn't actually available yet. In practice this made a checked DoT (e.g. Drones of Doom) look like it was recast every ~6s instead of only after its full 60s duration, and starved every other checked spell of casts entirely. Fixed by explicitly resetting to var best = null; each decision point. Confirmed fixed: DoTs now only recast once expired, and nukes correctly fill the gaps based on their own cooldowns.
  • 1.52 — Ranged tab: new Spell Casting (between shots) card lets a Ranger weave Calefaction, Drones of Doom (DoT), Call of Flame, and Firestrike in between arrows, each individually checkable on/off with ↑/↓ arrows to set their cast-priority order (same idea as the Rotation tab's Custom order list). Runs through the exact same RotationEngine/RotationSpells casting engine as the Spells (Rotation) tab (GCD, recast timers, mana pool/regen, resist checks, Spell Casting Fury, item focus) as an independent parallel timeline alongside the archery sim, with results summed into a new Spell Casting report section and a Combined DPS line. Mechanics guide updated (new section 23).
  • 1.51 — Tanking sim fix: a dual-wielding mob's off-hand round was firing on every off-hand timer tick instead of rolling Mob::CheckDualWield ((skill + level) / 375, same shape as the double-attack roll but a smaller divisor) — roughly 100% instead of the correct ~84% for a capped high-level mob. Off-hand's own double-attack chance is now also broken out into a separate "Off-hand double attack" report line instead of being folded into the base "Off hand" bucket, matching how main hand's double/triple are already split — together these two fixes were making a dual-wielding mob's off hand look like it hit far harder than the main hand (e.g. Rumblecrush showing 49% off hand vs 27.5% main hand) when the two hands' real output is comparable. Mob card now shows the actual per-tick dual-wield chance. Mechanics guide updated.
  • 1.50 — Tanking sim: mob spell-casting AI now matches mob_ai.cpp AICastSpell instead of a single flat detrimental-chance roll — each ready spell also rolls its own per-type success chance (40% nuke/DoT/root, 50% lifetap/debuff, 70% slow on melee targets only, lower for mez/charm/snare/dispel), shifted by how many spells the mob knows. Fixed a selection bug where the "top priority" spell tier was whatever happened to be first in DB order rather than the actual highest-priority ready spell. Priority-0 ("raid boss") spells now skip both rolls entirely and cast the instant they're off cooldown, matching hasZeroPrioritySpells — previously these were incorrectly throttled by the same gate as ordinary spells, drastically under-casting mobs like Lord Nagafen and Lady Vox that rely on always-cast breath/roar abilities. Fear-only casts (e.g. Dragon Roar) are now recognized and tracked (new "Times feared" stat) instead of being silently dropped for having no damage/DoT/stun component. New Disable dual wield checkbox to override an NPC's DualWield ability off for testing. Weapon procs are now labeled with their actual spell name (e.g. "Weapon procs (Stun Breath)"), and cumulative stun time applied is shown alongside the stun count so a heavy single-proc stunlock (e.g. Zlandicar) reads clearly. Mechanics guide updated.
  • 1.49 — Import Inventory tooltip wording update.
  • 1.48 — Dropped the "(Beta)" qualifier from the Total TPS header label — TPS modeling has been accurate enough for a while now.
  • 1.47 — Fix: the proc/spell threat cap (CanClassCastSpell, mob.h) only clamps non-damage hate on procs/clicks — direct-damage hate was wrongly capped at 400 in the melee/ranged proc path and, worse, in the Rotation Sim where every spell is the caster's own class spell (the cap should never apply there). Also fixes ranged proc threat not capping its CC-addition bucket, and self-rune hate defaulting to uncapped instead of the intended 400. New mobile breakpoint so the header, mode tab bar, and Character/Buffs pair stack/wrap instead of overflowing horizontally on phone widths, in both Easy and Advanced mode.
  • 1.46 — Pet Damage report now includes Pet TPS: pet damage generates hate entirely on the pet's own hate-list entry (NPC::Attack, floor(baseDamage / 2) per swing attempt) — the owner is credited zero hate from it, confirmed against EQMacEmu source. Mechanics guide updated to document the split.
  • 1.45 — Weapon labels (Melee tab report's "Weapon 1: ... (14d / 19 delay)" line, and the Easy mode weapon card detail line) now show a [scaled for RecLevel N: raw dmg M] note whenever a weapon's damage is currently reduced by the recommended-level mechanic, so it's clear at a glance that the number shown isn't the item's full listed damage. The note is tied to the exact item/level combo from search and clears automatically if you raise the level to/above the RecLevel, pick a different weapon, or manually type over the damage field.
  • 1.44 — Fixed a bug where switching class would leave the Pet panel's old selection active: because the panel preserves its checkbox/select state across re-renders (so switching tabs doesn't wipe your settings), swapping from a pet class to a non-pet class kept "Simulate pet DPS" checked and still folded in the old class's pet damage, and swapping between two pet classes (e.g. Magician → Necromancer) could carry over stale settings before the pool refreshed. The panel now detects an actual class change and force-resets all its controls (enable checkbox, spell/proc selections, dual wield, haste, target AC) instead of preserving them, so a pet never survives a class swap.
  • 1.43 — Rotation Planner (Spells tab) runs now log into the shared Session History table alongside Melee/Ranged runs, showing the spell pool, off-global spell, level, target, DPS, era and UI mode for each run. Added support for recommended-level items — items with a RecLevel below the current character level can now be equipped early with all stats (AC/HP/Mana/attributes/resists) and, for weapons, damage/elemental/bane damage scaled down using the server's exact Client::CalcRecommendedLevelBonus integer-math formula; gear stats re-scale live if you change the level field afterward. Mechanics guide updated (sections 21-22).
  • 1.42 — More pet sim follow-ups: the Pet Damage report section now sits between Procs & Specials and Final Totals (was appended after Final Totals). Session History rows where Include pet DPS in Total DPS was checked now show a small 🐾 next to the DPS value, in both the Advanced-mode Session History table and the Easy-mode history table, so pet-inflated runs are visually distinct from player-only ones. Added Wizard (Flaming Sword of Xuzl) and Cleric (Unswerving Hammer of Faith) to the Pet panel's supported classes — each gets one situational combat-pet spell rather than a full-time companion; the sim assumes it's cast at the very start of the fight and stays up the whole duration, same as every other pet, since no in-game expiration is exposed in the spell data to model otherwise. Both resolve through the exact same js/modules/petSpells.js pipeline with no special-casing needed. Mechanics guide updated (section 20).
  • 1.41 — Pet sim follow-ups: the report now has a full Pet Damage section (same === Section === padded-column layout as Weapon Overview/Procs & Specials — main hand and off hand swings/hits/accuracy/damage/DPS, proc buff contribution, totals) instead of a two-line footnote. New Include pet DPS in Total DPS checkbox in the Pet panel: off by default, so the Melee tab's header ticker and Session History (the numbers used to compare weapons against each other) stay player-only and aren't uniformly inflated by the pet's flat baseline; check it to fold the pet into both for the group's real combined output. The report's Pet Damage section always states which mode was active. js/modules/petCombat.js's simulatePetFight now also tracks per-hand damage totals and max hit to support the detailed section. Mechanics guide updated (section 20).
  • 1.40 — Added a Pet DPS simulation for Magician, Necromancer, Shaman, Shadowknight, and Beastlord: a shared Pet panel (positioned below the weapon cards on the Melee tab, at the top of the Spells tab) lets you pick a pet-summon spell from a dropdown — resolved to the pet's real combat stats by joining the spell's teleport_zone field against the NPC database, the same one Target NPC search uses, not an estimate. Simulates the pet's melee output against the same target using the same NPC-style attack engine the Tanking sim uses for the mob's side of a fight (pet as attacker, target mob as defender), and appends Pet DPS / Combined DPS (Player + Pet) to whichever tab's report was just run. New Always Dual Wield toggle models handing the pet a second weapon (real pets are excluded from the native dual-wield ability path server-side and need an actual offhand weapon item) by unlocking a second attack round using the pet's own innate damage. Shadowknight needed no special-casing — SK shares the same skeleton-pet spell line as Necromancer, just unlocked much later, so it resolves through the same class/level pool logic as the other classes. Beastlord adds a Pet proc buff (optional) dropdown for the "Spirit of X" line (Lightning/Blizzard/Inferno/...), which grants the pet a chance to proc elemental damage on its own swings — modeled with the same per-swing proc-chance formula already used for player weapon procs, scaled by the 375%-of-baseline rate EQMacEmu hardcodes for exactly those ten spells (Pet::LoadPetPets) rather than each spell's own unused/misleading data field. The single shared Pet panel node is relocated between two anchor points on tab switch so its state persists no matter which tab it's displayed under. New files js/modules/petSpells.js (data pipeline) and js/modules/petCombat.js (combat engine); one-line fix in npcCombat.js so pets correctly skip the 46-50 offense plateau real NPCs get. Out of scope for now: other pet AAs, pet incoming damage/death, and pet flurry/rampage/class-attacks (real pets have no attack AI script). Mechanics guide updated (new section 20).
  • 1.39 — Tanking tab: added a DTPS Over Time line chart above the report, showing damage-taken-per-second across one representative simulated run (bucketed instantaneous line plus a trailing 15s average, with a dashed reference line for the averaged DTPS across all runs and a marker on the single largest hit) so burst/spike shape is visible instead of hidden inside the averaged headline DTPS figure. runTankingAnalysis now keeps the first run's full damage timeline (sampleTimeline) for this purpose since averaging across runs discards it. Mechanics guide updated (section 16).
  • 1.38 — Spells (rotation) tab: added Spell Casting Fury Mastery and Quick Damage AAs (both require Spell Casting Fury rank 3). Mastery adds another 2/4/7% spell crit chance per rank, stacking additively with Spell Casting Fury's own chance (no extra damage bonus — that's fixed by Spell Casting Fury's rank alone, per Client::GetActSpellDamage). Quick Damage cuts cast time 2/5/10% per rank on direct-damage nukes/rains over 4s (DoTs unaffected), matching Client::GetActSpellCastingTime's gate in effects.cpp. Both wired into the AA Configurator, inventory-import AA mapping (eqmacid 114 and 44), and the rotation report/gear-summary cards. Version log is now a collapsible section. Report bug/feature form now opens a pre-filled GitHub "new issue" page directly instead of depending on a serverless proxy, and has a Discord/in-game character name field instead of email.
  • 1.37 — Tanking mode overhauled. The mob's attack sequence previously ran on a single fixed cadence; it now runs the independent timers the server uses (mob_ai.cpp AI_Process), so everything on the other timers finally contributes. New mob mechanics: special_abilities is parsed (emu_constants.h SpecialAbility) giving dual wield (a separate off-hand round with its own double attack), flurry (a full extra round plus a doubled class attack), rampage/area rampage, and enrage (no ripostes below 10% mob HP, modelled only when a Group DPS figure is supplied); NPC class attacks (kick/bash/backstab/monk specials) on their own haste-scaled 8s timer, running the full hit/avoidance/damage chain and rolling a 2-second stun during which the player avoids nothing; NPC spell casting via AI_EngagedCastCheck with nukes, DoTs and stuns resolved against player resists, plus NPC weapon procs. Double attack fix: was gated by a hardcoded 6-class table leaving most mobs at 0% — the server gives it to every NPC above level 7 at (skill + level) / 500, so a level 60 mob double attacks ~62% of the time. Mob slow/haste is now modelled, honouring the mob's slow_mitigation. AC and avoidance corrections (Client::GetMitigation, Client::GetAvoidance): Combat Stability raises the AC softcap rather than multiplying final mitigation, so it correctly does nothing below the cap; Combat Agility multiplies avoidance instead of subtracting from hit chance; shield AC is a new bucket added uncapped to the softcap from Luclin on; buff AC was being fed into the worn-AC bucket (×4/3) instead of the spell-AC bucket (÷4), overstating it roughly fivefold; added the Iksar racial bonus, the monk carried-weight curve, the Kunark warrior 405 cap, and the %-bonus step that applies before each avoidance divisor. Riposte counter-attacks now go through the mob's own block/parry/riposte/dodge and hit roll (DoRiposte calls a full Attack), so they can be avoided. New effects: Warrior Defensive (−50% melee mitigation) and Evasive (+50% avoidance) disciplines on their real 180s/900s timers, rune absorb pools, and player damage shields. Complete Heal chain rewritten: the old HP ÷ DTPS × 1.5 guess is replaced by replaying each run's recorded damage timeline against candidate heal intervals and measuring actual death rate — reporting max safe interval at <1% risk, a death-risk curve, burst percentiles within one cast, clerics needed, and a call threshold sized from 99th-percentile burst. Fix (affects the melee tab too): the inventory AA import mapped ranks to the wrong AAs entirely — AAIndex numbers are the client's eqmacid, so 13/17/97/120/211 are Innate Run Speed, First Aid, Critical Mend, Physical Enhancement and Fleet of Foot, not Combat Fury/Combat Stability/Return Kick/Double Riposte/Master Wu. Map corrected and extended to Innate Defense, Lightning Reflexes, Planar Durability and Flash of Steel, which previously could not be imported. Import now also fills shield AC, resists, carried weight, and defensive skills defaulted to class/level caps. Target picker: NPC rows that share a name and are identical in every simulated stat are collapsed to one entry (18,127 → 16,803), keeping the lowest id; mobs that genuinely differ still list separately. New data file resources/npc_spells.json (915 lists) built by tools/extract-npc-spells.js from the Quarm DB dump. Engine split into npcCombat.js, playerDefense.js, npcSpells.js and healChain.js; combat.js is unchanged. Mechanics guide sections 12.5–16 rewritten, including a correction: the avoidance skill checks resolve before the hit roll, not after.
  • 1.36.8 — Self-rune weapon procs (EQEmu SE 55 in effect slot 0, e.g. Rune III, Steelskin, Silver Skin) now generate hate instead of being silently skipped. Hate = runeValue × 2, modified by worn/spell/AA hate mod percent (no UI field yet; defaults to 0), capped at 400 if the player's class cannot natively cast the proc spell. Subject to a witness check: 50% chance per NPC that hate does NOT register (one roll per proc fire against the single sim target). Mezzed/stunned targets would receive ¼ hate; the sim assumes the target is never mezzed. Fix: procSpellIsSelfRune, procSpellRuneValue, and procThreatCap were being set on the weapon object after getWeapon() but were never included in the explicit property copy used to build options.weapon1 / options.weapon2 passed into runFight — rune hate was silently zero. Fixed by adding all three to w1ProcResist / w2ProcResist. Also propagated through the DB-load inline block (normalizeRawItemFromList) and normalizedToWeapon1 for the rank weapons path. Mechanics guide updated (section 2.2).
  • 1.36.7 — Fix: offhand proc threat missing from rank weapons TPS in the top-40 averaging phase. Both the offhand-only path and the combinations+secondary path were building the weapon2 object inline, omitting procSpellBonusHate, procSpellNonDamagingDetrimental, and procSpellCcAddsMobHpThreat. Weapons with flat-hate procs (e.g. Blade of Carnage / Enraging Blow) or CC/stun procs showed only swing threat for the offhand TPS column in averaged results. Fixed by switching both paths to normalizedToWeapon1(p2, false), matching every other rank phase.
  • 1.36.6 — Fix: proc hate from non-damaging detrimental spells (e.g. stun-only procs) and the extra mob-HP hate slice from DD+stun procs were not capped at 400. Both now apply the same 400-per-event cap as direct-damage procs. Flat SE-92 hate values (procSpellBonusHate, e.g. Enraging Blow) are excluded from this cap and continue to apply without limit. Updated mechanics guide section 2.2 to document the cap on both affected paths.
  • 1.36.5 — Fix: removed "Grats Bloodfrenzy" (item 2661, GM weapon) from the weapon database. Docs: clarified in mechanics guide sections 5 and 7 that damageBonus applies to mainhand swings only — offhand swings always use damageBonus = 0. The sim code was already correct; this is a documentation clarification.
  • 1.36.4 — Fix: rank weapons TPS was incorrect for the offhand weapon slot (melee) and all bows (ranged). Three locations in the melee rank loop built the offhand weapon object inline and omitted procSpellBonusHate, procSpellNonDamagingDetrimental, and procSpellCcAddsMobHpThreat — so any offhand weapon with a CC/stun proc or SE-92 flat hate would produce zero contribution to those threat paths. Fixed by using normalizedToWeapon1(p2, false) (the same helper used for the mainhand) in all three locations: the offhand-only phase, the offhand-only combinations path, and the primary+secondary combinations path. For ranged rank, the bow intermediate object was also missing those same three fields plus archeryModPercent — they were set on norm by normalizeBowFromList but never copied into the bows.push() object, so the code that tried to forward them into rangedWeapon always read undefined. Fixed by copying all four fields when present.
  • 1.36.3 — Docs: corrected Section 4 of the mechanics guide — offense rating for damage uses the weapon type skill (e.g. 1H Slash, 2H Slash), not the offense skill. The offense skill only contributes to to-hit. Added note explaining that warrior 1H caps at 200 vs 252 for most other classes. Updated Section 5 to remove incorrect toHit cap of 550 (the server has no cap — Eagle Eye and high skill can exceed 550 freely). Clarified in report output that swing threat is based on weapon base damage (not rolled damage) and is unaffected by target AC. Updated JSDoc and report skill label in combat.js to match.
  • 1.36.2 — Fix: worn +archery% accumulating across repeated bow selections. When a user manually edited a ranged weapon field (damage, delay, etc.), the bow's archery mod was cleared from the hidden ranged-archery-mod tracking field but was not subtracted from the visible ranged-worn-archery-mod total. Re-selecting a bow from item search then added the full mod on top of the stale total, stacking it indefinitely (e.g. +31% bow mod loaded 8 times → +248% shown). Fixed by mirroring the existing clear-weapon logic: the old bow mod is now subtracted from the worn total before the tracking field is zeroed.
  • 1.36.1 — Fix: bane body type matching now requires baneDamageBody > 0 before comparing against a target's body type. Previously, weapons with no body bane (banedmgbody = 0) were incorrectly matching against mobs whose body type is also 0 (e.g. blobs, oozes, slimes), causing spurious bane damage to be applied. Affected single sim and both passes of the ranged rank weapons loop.
  • 1.36 — Ranged bane overhaul: bane body and bane race fields are now visible on the ranged tab (replacing hidden inputs), with inline labels showing the resolved name (e.g. "14 (Greater Akheva)") identical to the melee tab. The "Apply Bane Damage" checkbox has been removed — bane is now applied automatically based on the selected target's race and body type, matching the melee tab's behavior: bane-only NPCs (Emperor Ssraeshza, Lord Inquisitor Seru) are immune without a matching bane weapon; normal targets receive bane damage when their race or body type matches the weapon's bane fields. Rank Weapons (ranged): baneDamageRace and baneDamageBody were missing from bow objects in the ranking loop, so race/body auto-matching never fired — fixed. Rank Weapons (ranged): the 0.5 dmg/delay ratio pre-filter now correctly bypasses bows whose bane matches the selected target's race or body type (e.g. Great Bow of Slaughter — 1 base / 40 bane / body 14 — is now included and ranked when targeting a Greater Akheva mob such as Aten Ha Ra). Target race and body type are now resolved before the bow-building loop so the bane bypass has access to them.
  • 1.35.3 — Fix: Quarm inventory imports now always show the full gear stat summary (AC, STR, STA, DEX, AGI, WIS, INT, CHA, HP, Mana, ATK, haste breakdown). Previously the stat pills could be silently skipped if the class-change event handler threw during the explicit class auto-set that Quarm imports trigger. Stat rendering is now ordered before class/level/AA DOM updates.
  • 1.35 — Inventory import now supports the full Quarm character export format (the tab-separated file produced by /outputfile inventory with a Character header row). The Character row is parsed to extract the character's name, level, and class — class is set directly from the explicit class ID rather than inferred from item restrictions. The AA section at the bottom of the file is parsed and mapped to the sim's AA configurator: Combat Fury, Combat Stability, Combat Agility, Natural Durability, Spell Casting Fury, Ambidexterity, Return Kick, Double Riposte, and Technique of Master Wu are all auto-imported at the correct rank. Level is auto-filled into both the advanced and easy-mode level fields. The inventory summary now shows the character's name, level, explicit class, and a list of imported AAs with their ranks. The old format (slot/name/id only, no Character header) continues to work unchanged.
  • 1.34 — Fix: backstab and special-attack rolls (hit, damage, crit, double-backstab DA check, Master Wu trigger/skill-select) now use a dedicated RNG stream (specialRng) isolated from mainhand swing rolls. Previously all shared the same stream, causing weapon delay differences between mainhand and offhand to systematically shift the RNG state at each backstab event — producing a spurious ~2% backstab accuracy gap between otherwise equivalent MH/OH slot assignments. Verified eliminated: 500-seed × 6000s test now shows 0.000% BS accuracy difference between configs. Excluded Malevolence and Long Sword of the Defender (GM/artifact weapons) from Rank Weapons lists.
  • 1.33 — Weave RNG isolation: fistweave/2H-weave dual-wield checks now use a dedicated weaveRng stream. Proc-before-swing ordering: proc trigger fires before the hit roll on each round (matching server behavior). Fistweave offhand procs now fire correctly when non-epic fistweave or 2H weave uses an equipped offhand with a proc.
  • 1.32 — NPC front avoidance now uses class-based defense skills (block/parry/riposte/dodge) instead of a flat 8% constant. Each skill is derived from min(level × 5, class_cap) and converted to a chance via EQMacEmu's divisor formula; checks are sequential. Warrior-type mobs (~28% front avoid at level 60) are meaningfully harder to hit from the front than casters (~7%). Inventory Manager: added Save .txt button to export the current inventory in the same tab-separated format as EQ's /outputfile inventory command, so it can be re-imported later. Buff panel: hovering a buff now shows a tooltip with the buff name and all its effects (haste %, ATK, stats, AC, HP). Added Captain Nalot's Quickening (spell 1925, 20% V1 haste, click) to the haste buff list; haste buffs are now ordered ascending by haste %.
  • 1.31 — 2H Weave / fistweave overhaul: weave attempts now fire inline on every mainhand round rather than as a deferred timer event. The offhand cooldown timer is checked at weave time (mainhand swing time + reaction delay); if the offhand is ready, a dual wield check is made — every DW roll counts as one "weave attempt". Only DW successes execute and count as "Rounds (DW check passed)". Offhand cooldown now correctly uses the equipped weapon's delay instead of the hardcoded fist delay (27/16 decisec) for non-epic fistweave and 2H weave. The report now shows: Weave attempts, Blocked by dual wield check, and Rounds (DW check passed). Fixed: Ambidexterity AA now auto-defaults to On for level 65 characters (was checking level === 60, missing PoP-era default level). Fixed: PoP era selection now defaults character level to 65; switching away from PoP resets to 60 if level was exactly 65.
  • 1.30 — Fix backstab to-hit using raw weapon skill instead of the weapon-mod-adjusted value: backstabToHit = 7 + OffenseSkill + min(252, floor(baseSkill × (100 + mod%) / 100)) — weapons with a backstab % modifier (e.g. Bloodbath +12%, Khalshazar +15%) now correctly cap at 252, equalising their to-hit contribution. Advanced mode custom weapons now show a weapon-type selector (1HB / 1HS / 1HP / 2HB / 2HS / 2HP / H2H) next to the damage/delay fields; hidden when a weapon is loaded from item search. Rank Weapons bane fix: low-base-damage bane weapons (e.g. Trident of Slaughter: 1 base + 16 bane) were silently dropped by the damage/delay ratio filter before bane was ever evaluated — they now bypass that filter when their bane race or body type matches the selected target, and bane damage is correctly added during simulation. Additionally fixed a false-positive bane match where weapons with baneDamageBody = 0 (no body bane) were incorrectly treated as having a body bane. Worn ATK cap: combined gear + weapon worn attack bonus is now capped at 250 in both the regular sim and the Rank Weapons engine.
  • 1.29 — BIS Advisor preset tooltip bubbles now appear below the button instead of above, so they are not clipped by the modal header.
  • 1.28 — BIS Advisor: added Custom Weights mode — click the new "Custom" button to replace the priority-order list with a direct numeric weight input per stat (e.g. ATK=10, STR=5). Custom weights use proportional scoring instead of the tier-based priority system. Mode and weights persist to localStorage. Added hover tooltip bubbles on all preset buttons (Melee DPS, Tank, Caster, Ranged) showing the stat priority order and which stats are on/off for that preset.
  • 1.27 — Fix Punishing Blade, Speed of the Knight, Raging Flurry, Knight's Advantage, Tactical Mastery, Soul Abrasion, and Two-Hand Bash AAs: these PoP abilities were built by the AA option builder but never forwarded into the sim options, so they had no effect. All seven are now correctly passed to the sim. Fix attack distribution report: Flurry, Raging Flurry, Punishing Blade, and Speed of the Knight proc counts were missing from the multi-run averaged report object, so those lines never appeared. Flurry and Raging Flurry now appear as sub-lines under Triple attacks; Punishing Blade and Speed of the Knight appear as top-level lines. Mechanics guide: added Punishing Blade AA description (War/Rng/Monk, PoP; 2%/4%/8% chance after double attack, 2H required); corrected Flurry description (fires after triple attack succeeds, not independently).
  • 1.26 — Fix elemental damage RNG contamination: elemental resist rolls now use a dedicated elemRng stream instead of the shared combat RNG. Previously, weapons with elemental damage (e.g. Great Mace of Slaughter's +1 magic) consumed an extra RNG call on each hit, shifting the RNG stream and causing systematic suppression of mainhand mean hit and crit frequency when such weapons were in the offhand slot. Item debug panel now correctly shows bane amount/body/race for newly loaded items (was showing stale form values). Equipped Items stat pills now appear on a dedicated row below the header line.
  • 1.25 — BIS Advisor: new Best-in-Slot recommendation tool — scores all wearable items for your selected era, class, and role (melee DPS, ranged, tank, healer); configurable stat weights via custom role; shows full BIS set and per-slot upgrade list vs. your currently equipped gear; lore item deduplication. Inventory Manager: new modal to browse and manage all equipped slots — search items per slot, preview stats, and apply directly to the sim. eraConfig: added item-ID-range helpers for era fallback filtering when min_expansion is absent. Fix 2H Weave: equipping a 2H primary via item search or preset no longer clears the offhand slot when 2H Weave (or monk non-epic fistweave) is enabled. Mechanics guide: new section 7.10 documenting the 2H Weave mechanic. items-data.js expanded with races, resists, proc fields, lore, min_expansion, and minstatus; 29 Luclin and 6 PoP items had incorrect min_expansion corrected; Bladesouls Spiritual Armguards excluded as a GM event item.
  • 1.24 — Fix isWarriorClass to include monk, rogue, and beastlord (matches EQMacEmu IsWarriorClass); fix getDamageBonusClient to apply only to warrior-class characters. Weapon Overview now shows theoretical max hit lines (standard, crit, disc, disc+crit) for each weapon, placed just below Weapon DPS. New offensive buffs: Strength of Tunare (PoP), Spiritual Strength, Grim Aura. McVaxius' Rousing Rondo: corrected ATK base 2→11, SAI now stacks correctly with Celestial Tranquility.
  • 1.23 — Apply Bane Damage checkbox now forces bane onto base damage regardless of target type, allowing direct comparison of bane vs non-bane DPS. Auto-detection still applies when checkbox is unchecked (bane added when target race/body matches; bane-only targets remain immune without matching bane). Rank/comparison sim gains the same checkbox override with target-aware auto-detection.
  • 1.22 — Ranged sim: archery skill 0 no longer treated as "use default" (falsy-zero fix); worn +archery% mod auto-populates from inventory import (supports manual override); gear summary shows archery mod items by name; Eye of the Frenzied Owlbear and other skillmod items now detected (items-data.js now includes skillmodtype/skillmodvalue). Bow of Flames proc resist type correctly applied in async spell-fetch path. Ranged archery options inputs aligned on one row. Trueshot now always engages at the start of each sim run (was previously random within the fight window). Ranged report now shows crit percentage and crit count per run.
  • 1.21 — Fix Warsong of Zek spell ATK value: was incorrectly computing ~489 ATK due to formula=109 being misinterpreted as a level-scaling multiplier; correct values are 18 base / 46 with epic + Instrument Mastery. Per-slot instrument modifier support added to bard effect builder.
  • 1.20 — AA configurator layout overhauled: rows now snap into a 3-column grid so labels and rank boxes align cleanly. Each AA has an inline i info icon (sourced from TAKP wiki) that shows a tooltip with the ability description on hover. Fixed multi-run sim crash when Technique of Master Wu was active — the averaged report object was missing mainRolls, triggered, extraAttempts, fkHits, fkDamage, and bySkill, causing formatReport to throw and produce no output. Technique of Master Wu logic corrected to match EQMacEmu special_attacks.cpp: two independent rolls (rank×10% main, rank×2.5% secondary) each selecting randomly from Flying Kick, Eagle Strike, Tiger Claw, or Round Kick — not a sequential chain of FK-only strikes. Wu report now shows per-skill breakdown and average Wu damage vs average base FK hit. Mechanics guide updated: corrected Master Wu section, new sections for Two Hand Bash, Soul Abrasion, Knight's Advantage, Speed of the Knight, Raging Flurry, Tactical Mastery, Flash of Steel, Planar Durability; Planar Power stat cap note added to offense section; AA era table updated with all v1.19/v1.20 additions.
  • 1.19 — PoP-era buff options: Haste (Rizlona's Call of Flame, Warsong of Zek, Speed of Vallon), Offensive (Spirit of the Predator, Protection of the Wild, Ferine Avatar), Defensive (Hand of Virtue, Symbol of Kazad, Brell's Stalwart Shield, Protection of the Nine, Focus of the Seventh, Voice of Quellious) — all gated behind PoP era selection. Eight new AAs: Two Hand Bash (PAL/SHD Luclin — enables bash with 2H), Soul Abrasion (SHD Luclin — +10/20/30% proc damage), Planar Durability (WAR/PAL/SHD PoP — +1.5/3/4.5% max HP in tanking sim), Flash of Steel (multi-class PoP — +10/20/30% double riposte), Knight's Advantage (PAL/SHD PoP — +2/4/6% DA), Speed of the Knight (PAL/SHD PoP — 2/4/8% extra 2H attack after double), Raging Flurry (WAR PoP — 10/20/30% extra flurry on triple attack), Tactical Mastery (WAR PoP — -10/20/30 NPC avoidance). Planar Power stat cap now correctly applied at simulation time (was computed but not enforced).
  • 1.18 — Ranged simulation engine corrections: archery mastery applies as a percent modifier before server halving (matching EQMacEmu DoArcheryAttackDmg); Trueshot applies +105% to the pre-halved base; Ranger 51+ stationary double-damage implemented from beacon.cpp (doubles post-D20 result before crit). Ranged report now shows base damage breakdown (bow, arrow, mastery, effective shot base). Inventory import now auto-fills bow (Range slot) and arrow (Ammo slot) in the ranged tab. NPC attack mechanics added to tanking sim: double attack using EQMacEmu formula (skill + level) / 500, triple attack for Warrior/Monk level 60+ at 13.5%; auto-filled from NPC search. Tanking report shows full player AC breakdown (worn, defense skill, spell/buff AC, AGI bonus, softcap). Buff HP (+HP from Aegolism, etc.) now included in tank HP. Warder's Protection and Nature's Precision now stack correctly. Buff summary panel overlap fixed. Archery Options card spacing, haste summary single-line layout. Mechanics guide: corrected archery pipeline, avoidance formula, new NPC attack and AC breakdown sections.
  • 1.17 — Mobile NPC search uses full npc_types database. Ranged tab improvements, new Ranger buff options (Warder's Protection, Nature's Precision, Strength of Nature, Force of Nature), layout polish.
  • 1.16 — Advanced mode: simulation history, charts, and damage breakdown cards now extend vertically without internal scrolling — full-page scroll provides visibility. Easy mode: simulation assumptions box auto-sizes to content (no scroll window); Calculate DPS button, result output, and damage breakdown are centered under the Character & Fight and Weapons cards; session history columns reordered with improved spacing, centered numeric values, and a DPS group visual indicator (gold bracket + tint) over MH / OH / Proc / Total columns; Era and Mode columns removed, Worn H% removed, Eff H% renamed to Haste %; Session History and Simulation Assumptions cards match in width. Mobile layout moved from automatic redirect to a link at the bottom of Easy mode. Mobile weapon search fixed: raw weapon data uses Name (capital N) but search was checking name — all results were silently dropped. Mobile weapon icons now load from icons/{id}.gif in both the search list and the equipped weapons card, with a fallback glyph on missing icon.
  • 1.15 — Fix inventory import not loading proc data: lookupItem now merges weapon-specific fields (proceffect, banedmgamt, elemdmgtype, skillmodtype, etc.) from weapons-data.js when items-data.js lacks them — proc spells were silently missing after inventory import. After import, weapons are now fully re-applied through the same code path as manual weapon search, populating all proc fields correctly. Fix crash (ReferenceError: Cannot access 'classId' before initialization) when simulating weapons with beneficial proc spells (Rune III, Major Shielding, etc.) — temporal dead zone violation in proc threat-cap block. Beneficial non-damaging procs (buffs, runes, shielding) are now correctly skipped during simulation. Spell ATK field is zeroed when buffs are first activated; any manually entered value after that point is treated as additional bonus ATK on top of buff contributions.
  • 1.14 — Session history cleaned up: era/mode columns removed; easy mode history uses Zodiak font. Easy mode layout: Calculate DPS button and results centred under the Character and Weapons cards (col-span-2 row inside the 2-col grid); Session History and Simulation Assumptions are now separate full-width blocks. Inventory import: sim history now shows the imported weapon name instead of raw damage/delay. Fix buff checkboxes missing on web server (buffs.js was untracked). Haste inputs (Worn, V1 Spell, V3 Bard) moved to their own row; Worn ATK and Spell ATK on a separate row below.
  • 1.13 — Fix proc spells not loading on inventory import: weapon proc fields (spell name, damage, resist type, proc rate, proc level) are now populated from local spell data when an inventory is imported. Fix proc spells not firing when a weapon is selected via item search but spell data hadn't resolved yet: getWeapon() now falls back to local spell data if the proc name field is empty but a spell ID is set. normalizeItemForWeapon now extracts proclevel so the level gate is consistent between the item-search and preset weapon paths.
  • 1.12 — Damage breakdown pie chart added to Easy mode (side-by-side with DPS result). Fistweaving now shows a (FW) tag next to Weapon 2 in simulation history. Default final stats when no inventory is loaded: level 60 → 255 STR/AGI/DEX/STA, all other levels → 150/100/100/100. Tanking tab marked as Work in Progress. Inventory import now applies gear stat bonuses to the stat distributor Gear column and computes Finals from race base + allocated pts + gear. Equipment summary shows stat pills (AC, STR, STA, DEX, AGI, WIS, INT, CHA, HP, Mana, ATK, Regen, FT) and itemised worn ATK breakdown. Fix: inventory summary was silently aborting due to a ReferenceError in updateTankHP ($ not in scope outside the main IIFE). Equipped items and AA configurator cards now match page content width.
  • 1.11 — Tank HP auto-calculation from class, level, STA, and worn HP (EQEmu bracket formula). Fix Blasphemous Blade threat classification.
  • 1.10 — Tanking weapon card. Proc threat capped per EQMacEmu rules. Return Kick formula corrected. Guide fixes.
  • 1.09 — Fix inventory import stats on Vercel (items-data.js now committed to git). Gear column in stat distributor is now an editable number input — manually type worn stat bonuses or override values after inventory import. Fix tanking sim button (buildAASimOptions exposed to window scope).
  • 1.08 — Full AA system with era-gated configurator (Luclin/PoP sections show/hide correctly on era change). New AAs: Double Riposte (War/Pal/Rng/SK/Monk/Rog/Bst), Return Kick (Monk), Ferocity (War/Rng/Monk/Rog), Bestial Frenzy (Beastlord), Harmonious Attack (Bard), Natural Durability, Innate Defense, Lightning Reflexes. Technique of Master Wu dedicated report section. Tanking sim tracks Double Riposte extra hits and Return Kick hits. Default era changed to Luclin. Import Inventory button renamed.
  • 1.07 — UI overhauled (Easy and Advanced: layout, theming, alignment, and controls). Weapon search system cleaned up and refined (merged offline data, filters, rank/search behavior, and related UX). Added initial threat per second calculations. Enabled PoP weapons in weaponrank via toggle. Rank by TPS enabled in weaponrank via toggle.
  • 1.06 — Item search is fully offline using merged resources/weapons.json (no remote ItemSearch API). Weapon data is merged from weaponlist/luclin/pop with per-item expansion and resources/weapon_exclusions.json for rank/search filters. Reports show approximate TPS (threat per second) from swing hate + capped proc hate (threat.js / EQMacEmu-style). Run node scripts/merge-weapons.mjs after editing source JSON. Fixed JSON syntax in popweapons.json (missing comma).
  • 1.05 — Improved BS mod application and worn ATK behavior in the `rankWeapons` function. Bane damage now auto-applies; Seru and Emp can only be hurt by bane weapons. Weapon rank now outputs phase-by-phase results. Added a synthetic combat-log mode (1 run supported only) and `.txt` export compatible with normal fight-log parsers. Improved some Monk fistweaving logic.
  • 1.04 — Updated a lot of the ranged damage simulation in advanced mode. Weapon search is improved and filters are better, quiver WR calculations are in. Ranger atk rating bonus is in. Elemental damage from bows and arrows now works. Archery skill modifiers are now in. Updated backstab damage model to address a fencepost issue.
  • 1.03 — Added some previously unsearchable or missing weapons (including monk Velious fists). Removed use of the external ItemSearch API in favor of the integrated item lists only. Implemented quick weapon swap on the Easy mode UI. Updated backstab reporting data. Simulations can now be run with only one weapon equipped. Ranged damage simulation now searches correctly. Trueshot can be toggled on the ranged simulator.
  • 1.02 — Easy mode has group content/raid content toggle. Fixed some worn attack values on weapons from being ignored (such as from Ragebringer or Bloodbath). Adjusted Slay Undead chances to be 2.25%/2.35%/2.4% per level and 15×/16×/17× damage multipliers. Added weapon swap button to easy mode UI.
  • 1.01 — Race-specific procs (e.g. undead, summoned) now only land on matching target body types. Bane damage auto-applies by target type (race/body); no bane on generic target. Only classes with the double attack skill can double attack.
  • 1.0 — Easy Mode UI introduced for a simplified default experience, with Advanced Mode retained for full controls.
  • 0.11 — Implemented haste caps. Split worn and spell haste out into individual components. Improved damage calculation and backstab should be much more accurate. Items with required levels are filtered out from weapon list if your character level is too low. Automatically scale generic target info based on character level. Removed some PoP items from the luclin weapons list.
  • 0.10 — Added spell proc resist chances. Added weapon ranking function.
  • 0.9 — Item and NPC search added to simulation. Improved some backstab performance. Added Inner Flame and Duelist discipline simulations. Proc damage now derived from spell data (spells_en) using EQEmu rules (SE_CurrentHP, max/limit). Target NPC search (npc_types): pick a mob to fill AC, level, and resistances; selected target name appears in the report and sim history.
  • 0.8 — Added UI improvements, added elemental and bane damage.
  • 0.7 — Added Ranged Combat simulations.
  • 0.6 — Multi-run report: all values (including crit hits and crit damage gain) are averages per run, not cumulative. Clear distinction between offense skill (0–255, to-hit only) and offense rating (skill + STR + worn + spell, used for damage): UI labels, report lines, and hint; report shows Offense skill, Offense rating (for damage), and Offense rating from stats (STR).
  • 0.5 — Added logging to simulation operations.
  • 0.4 — Fistweaving (Monk + 2H): optional offhand 9-dmg rounds, can double attack, no proc; DPS in report. Proc rate: PPM-based formula (~2 PPM at 255 DEX), uses effective delay. Rogue backstab: Backstab skill field (default 225, cap 255), client formula (skill×0.02+2)×weapon damage, level-based minHit; Backstab mod %; effective backstab skill in report when mod used. Removed classes: Necromancer, Enchanter, Shaman, Druid, Cleric, Magician, Wizard.
  • 0.3 — Unequipped quick select; Behind default; duration 6000s, runs 20; Ambidexterity AA checkbox; main weapon default Unequipped.
  • 0.2 — Worn/spell attack inputs; toHit excludes worn/spell; offense skill 252 for toHit; removed Offense override; default duration 2400s; histogram always shown; displayed attack & stat contribution in report.
  • 0.1 — Initial release. Melee combat sim with DA/DW, damage bonus, crits, procs, histogram.