Skip to content

Reading the Output ​

calculateBuild() returns a CalculatedBuild object — the computed stats plus setToggles.

ts
const stats = calculateBuild({ character: { /* ... */ } });

Named stats ​

The most-used stats are typed properties:

PropertyDescription
Health / Magicka / StaminaMaximum resource pools
HealthRegen / MagickaRegen / StaminaRegenRegeneration
WeaponDamage / SpellDamageBase damage
WeaponCrit / SpellCritCritical chance
SpellCritDamage / WeaponCritDamageCritical damage bonus
PhysicalResist / SpellResist / CritResistResistances
PhysicalPenetration / SpellPenetrationArmor penetration
DefensePhysicalMitigation / DefenseSpellMitigationEffective mitigation vs. enemy attacks
EffectivePower / EffectiveSpellPower / EffectiveWeaponPowerEffective power
HealingDone / HealingTakenHealing modifiers
RunSpeed / SprintSpeedMovement speed

Percent-style stats come out in percent units as the engine displays them (e.g. 12.5 = 12.5%).

All 204 stats: stats.raw ​

raw is the complete g_EsoComputedStats record from the engine — every stat the UESP build editor shows, including the less common ones (BashDamage, GroupHealing, ...):

ts
for (const [statId, value] of Object.entries(stats.raw)) {
  console.log(statId, value);
}

TIP

Stat IDs are stable — they are the engine's own g_EsoComputedStats keys (UESP version 49+). If you need a stat not in the named list, access it via stats.raw.<StatId>.

Applicable set toggles: stats.setToggles ​

Some set bonuses are conditional in a way the engine cannot infer (e.g. "after interrupting an enemy", "out of combat"). The UESP Build Editor exposes them as manual checkboxes. calculateBuild() reports which of them apply to the current build:

ts
const { setToggles } = calculateBuild(input);

setToggles;
// [
//   { id: "Ansuul's Torment",                setId: "Ansuul's Torment", label: "Ansuul's Torment" },
//   { id: "Ansuul's Torment (Bonus Damage)", setId: "Ansuul's Torment", label: "Ansuul's Torment (Bonus Damage)" },
// ]

This is the list of applicable toggles (the set is equipped with enough pieces and any rule requirement is met) — not the enabled ones. To enable one, pass its id in BuildInput.toggledSetBonuses:

ts
calculateBuild({
  ...input,
  toggledSetBonuses: ["Ansuul's Torment"],
});

Empty when the build equips no set with a conditional toggle.

Stacking toggles (e.g. Sergeant's Mail) only contribute when a count is given via BuildInput.toggledSetBonusCounts; each SetToggle exposes minTimes/maxTimes/count. See Buffs & Toggle Skills.

Debugging a discrepancy ​

When a stat doesn't match what you expect, debugBuild() returns the full picture: every input value per category (item, set, buff, CP, mundus, food, skill) and which source contributed each value:

ts
import { debugBuild } from 'uesp-eso-build-wrapper';

const info = debugBuild(input);
console.log(info.inputValues.Set);     // what each set bonus contributed
console.log(info.statSources.SpellDamage); // who set SpellDamage, in order

It runs the same calculation — use it in tests or local debugging, not in production paths.

Elder Scrolls Online is a trademark of ZeniMax Media Inc. This project is not affiliated with or endorsed by ZeniMax Media Inc.