Calculate the average expected damage for your unit's attacks
2+
3+
4+
5+
6+
2+
3+
4+
5+
6+
None
None
2++
3++
4++
5++
6++
Average Hits:0
Average Wounds:0
Unsaved Wounds:0
Total Expected Damage:0
Mastering the Math: The Warhammer Damage Calculator Guide
In the grim darkness of the far future, there is only war—and a whole lot of statistics. Known by players as "Math-hammer," calculating the statistical probability of your attacks is crucial for competitive play. This Warhammer Damage Calculator helps you determine the "Expected Value" (EV) of an attack sequence, allowing you to choose the right targets for your units.
How the Calculation Works
The damage process in tabletop wargaming follows a specific sequence of independent events. Our calculator uses the standard probability chain used in games like Warhammer 40k and Age of Sigmar:
The Hit Roll: Calculated as (7 - Skill) / 6. A 3+ skill means a 4/6 (66.6%) chance to hit.
The Wound Roll: Based on the Strength (S) vs. Toughness (T) mechanic:
S is double or more T: 2+ (5/6)
S is greater than T: 3+ (4/6)
S is equal to T: 4+ (3/6)
S is less than T: 5+ (2/6)
S is half or less than T: 6+ (1/6)
The Saving Throw: The calculator accounts for Armor Penetration (AP). The final save is the better of the modified Armor Save or the Invulnerable Save.
Realistic Example: Intercessors vs. Orks
Imagine 10 Space Marine Intercessors firing Bolt Rifles at a squad of Orks:
Attacks: 20 (Rapid Fire range)
Skill: 3+ (Ballistic Skill)
Strength: 4 vs Toughness: 5 (Wounding on 5+)
AP: -1 vs Save: 5+ (Resulting in a 6+ save)
Damage: 1
Using the calculator, you'll see that while you fire 20 shots, the high toughness of the Orks means you only expect to deal approximately 3.7 total damage.
Why Use a Warhammer Calculator?
The dice are fickle, but averages provide a baseline for strategy. By using this tool, you can determine if a unit is capable of destroying a specific target in a single turn. This informs whether you should commit more resources or "split-fire" to optimize your efficiency. It also helps in list building—comparing whether a high-volume low-strength weapon is better than a low-volume high-strength weapon against specific meta threats.
Advanced Tips
Remember that this calculator provides the mean average. In a real game, variance (or "swing") occurs. Always have a backup plan if your expected 6 damage turns into 2. Also, consider "re-rolls" (like re-rolling hits of 1); while not included in this basic calculator, they typically increase hit probability by about 11-16%.
function calculateWH() {
var attacks = parseFloat(document.getElementById('attacks').value);
var skill = parseInt(document.getElementById('skill').value);
var strength = parseInt(document.getElementById('strength').value);
var toughness = parseInt(document.getElementById('toughness').value);
var ap = parseInt(document.getElementById('ap').value);
var save = parseInt(document.getElementById('save').value);
var invuln = parseInt(document.getElementById('invuln').value);
var damageVal = parseFloat(document.getElementById('damageVal').value);
if (isNaN(attacks) || attacks = toughness * 2) {
woundReq = 2;
} else if (strength > toughness) {
woundReq = 3;
} else if (strength <= toughness / 2) {
woundReq = 6;
} else if (strength < toughness) {
woundReq = 5;
}
var woundProb = (7 – woundReq) / 6;
var avgWounds = avgHits * woundProb;
// 3. Save Logic
// AP is usually negative in 40k (e.g., -2), but some users might enter 2.
// We treat it as an addition to the save roll required.
var modifiedSave = save + Math.abs(ap);
// Check against invuln
var finalSaveReq = modifiedSave;
if (invuln < finalSaveReq) {
finalSaveReq = invuln;
}
// If final save is 7 or more, no save is possible
var saveProb = 0;
if (finalSaveReq <= 6) {
saveProb = (7 – finalSaveReq) / 6;
}
var failSaveProb = 1 – saveProb;
var unsavedWounds = avgWounds * failSaveProb;
// 4. Final Damage
var totalDamage = unsavedWounds * damageVal;
// Display Results
document.getElementById('results').style.display = 'block';
document.getElementById('res-hits').innerText = avgHits.toFixed(2);
document.getElementById('res-wounds').innerText = avgWounds.toFixed(2);
document.getElementById('res-unsaved').innerText = unsavedWounds.toFixed(2);
document.getElementById('res-total').innerText = totalDamage.toFixed(2);
}