Calculate Expected Hits per Round for Twilight Imperium 4th Edition
No Modifier (Default)
+1 to Combat Rolls
+2 to Combat Rolls
-1 to Combat Rolls
1 Die per unit
1 Die per unit
1 Die per unit
1 Die per unit
1 Die per unit
3 Dice per unit
2 Dice per unit (Avg)
Expected Hits This Round:
0.00
How the TI4 Combat Calculator Works
In Twilight Imperium 4th Edition (TI4), space combat is determined by rolling ten-sided dice (d10). Each unit has a specific Combat Value. To score a "hit," the result of the die roll must be equal to or greater than the unit's Combat Value.
This calculator uses Expected Value (EV) logic to determine how many hits your fleet will likely produce in a single round of combat. This is essential for strategic planning, determining if you should commit to a fight, or identifying when to retreat.
The Mathematical Formula
The probability of a single unit hitting is calculated as:
P(Hit) = (11 – (Combat Value – Modifiers)) / 10
The total expected hits for a fleet is the sum of (Number of Units × Number of Dice × P(Hit)) for every unit type present in the battle.
Example Calculation
Suppose you have 2 Dreadnoughts (Hit on 5) and 4 Fighters (Hit on 9):
Dreadnoughts: 2 units × 0.6 probability (11-5=6/10) = 1.20 Expected Hits.
Fighters: 4 units × 0.2 probability (11-9=2/10) = 0.80 Expected Hits.
Total: 2.00 Expected Hits per round.
Unit Reference Table
Unit Type
Combat Value
Dice
War Sun
3
3
Dreadnought
5
1
Cruiser
7
1
Destroyer / Carrier / Fighter
9
1
Strategic Considerations
While Expected Value tells you the "average" outcome, TI4 combat is swingy. A fleet with 2.0 expected hits might roll 0 hits or 4 hits. Always consider Sustain Damage. Dreadnoughts and War Suns can absorb a hit, which effectively increases your fleet's "health" without reducing your offensive output (until the second hit is taken).
Modifiers like Morale Boost (+1 to rolls) are extremely powerful for high-volume fleets (like Fighters and Destroyers) because it can double their hit probability (from 0.2 to 0.3).
function calculateTI4Combat() {
// Get Modifiers
var globalMod = parseInt(document.getElementById('globalMod').value) || 0;
// Unit Counts
var countFighter = parseInt(document.getElementById('unitFighter').value) || 0;
var countDestroyer = parseInt(document.getElementById('unitDestroyer').value) || 0;
var countCarrier = parseInt(document.getElementById('unitCarrier').value) || 0;
var countCruiser = parseInt(document.getElementById('unitCruiser').value) || 0;
var countDreadnought = parseInt(document.getElementById('unitDreadnought').value) || 0;
var countWarSun = parseInt(document.getElementById('unitWarSun').value) || 0;
var countFlagship = parseInt(document.getElementById('unitFlagship').value) || 0;
// Base Values
var units = [
{ count: countFighter, hitOn: 9, dice: 1 },
{ count: countDestroyer, hitOn: 9, dice: 1 },
{ count: countCarrier, hitOn: 9, dice: 1 },
{ count: countCruiser, hitOn: 7, dice: 1 },
{ count: countDreadnought, hitOn: 5, dice: 1 },
{ count: countWarSun, hitOn: 3, dice: 3 },
{ count: countFlagship, hitOn: 7, dice: 2 } // Average Flagship
];
var totalExpectedHits = 0;
for (var i = 0; i 0) {
// Adjust hit value based on global mod
// Lowering the 'hitOn' target makes it easier to hit
var adjustedHitOn = unit.hitOn – globalMod;
// Constraints: Can't hit on less than 1 (always hit) or more than 11 (impossible)
// In TI4, a natural 1 is usually a miss and 10 a hit, but EV handles the scale 1-10.
if (adjustedHitOn 10) adjustedHitOn = 11;
// Probability calculation
var probability = (11 – adjustedHitOn) / 10;
if (probability 1) probability = 1;
totalExpectedHits += (unit.count * unit.dice * probability);
}
}
// Display results
var resultDiv = document.getElementById('combatResult');
var hitsOutput = document.getElementById('hitsOutput');
var probSummary = document.getElementById('probSummary');
resultDiv.style.display = 'block';
hitsOutput.innerText = totalExpectedHits.toFixed(2);
var fleetSize = countFighter + countDestroyer + countCarrier + countCruiser + countDreadnought + countWarSun + countFlagship;
probSummary.innerText = "Based on a fleet of " + fleetSize + " units with a " + (globalMod >= 0 ? "+" : "") + globalMod + " modifier.";
// Scroll to result
resultDiv.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}