Whether you are leading a Space Marine Intercessor squad or a horde of Chaos Daemons, understanding the statistical likelihood of your attacks is the difference between a tactical masterclass and a crushing defeat. This Warhammer Dice Calculator is designed to help players determine the mathematical average (the "expected value") of their offensive maneuvers.
How the Math Works
In Warhammer, combat follows a sequential probability chain. To find the final damage, we multiply the probability of success at each stage:
The Hit Roll: Determined by Weapon Skill (WS) or Ballistic Skill (BS). For a 3+ roll, the probability is 4/6 (or 66.6%).
The Wound Roll: Compares Strength (S) vs Toughness (T). A 4+ roll represents a 3/6 (50%) chance.
The Save Roll: The target attempts to block damage. Armor Penetration (AP) reduces the target's Save characteristic. If a target has a 3+ save and you have -2 AP, they now need a 5+ to survive.
Example Calculation
Imagine a unit firing 20 shots, hitting on 4+, wounding on 3+, against a target with a 4+ save and no AP, with 1 damage per shot:
Hits: 20 attacks * (3/6) = 10 hits.
Wounds: 10 hits * (4/6) = 6.67 wounds.
Saves: The target saves 3/6 (50%), meaning they fail 50% of the time.
Final Damage: 6.67 wounds * 0.5 failure rate = 3.33 total damage.
Using the Results for Strategy
While "dice luck" is part of the game, planning your charges and shooting phases based on averages allows you to prioritize targets effectively. If a target has 5 wounds remaining and your calculation shows an expected damage of 3.2, you know you need to commit more resources to that unit to ensure it is destroyed this turn.
function calculateWarhammerStats() {
var attacks = parseFloat(document.getElementById('numAttacks').value);
var hitTarget = parseFloat(document.getElementById('toHit').value);
var woundTarget = parseFloat(document.getElementById('toWound').value);
var ap = parseFloat(document.getElementById('apValue').value);
var save = parseFloat(document.getElementById('targetSave').value);
var damage = parseFloat(document.getElementById('damagePer').value);
if (isNaN(attacks) || attacks = 7) {
// No save possible
pSaveFail = 1;
} else {
if (modifiedSave > 6) {
pSaveFail = 1; // Save reduced to nothing
} else {
// Chance to fail = (Modified Save – 1) / 6
// Example: 5+ save fails on 1, 2, 3, 4 (4/6)
pSaveFail = (modifiedSave – 1) / 6;
}
}
var expectedFailedSaves = expectedWounds * pSaveFail;
var totalExpDamage = expectedFailedSaves * damage;
// Display Results
document.getElementById('expHits').innerText = expectedHits.toFixed(2);
document.getElementById('expWounds').innerText = expectedWounds.toFixed(2);
document.getElementById('failedSaves').innerText = expectedFailedSaves.toFixed(2);
document.getElementById('totalDamage').innerText = totalExpDamage.toFixed(2);
document.getElementById('diceResult').style.display = 'block';
}