Chance of receiving at least one purple in your name:
Expected number of purples:
Item Name
Per Raid Chance
Chance in Raids
Understanding the Theatre of Blood Drop Mechanics
The Theatre of Blood (ToB) utilizes a unique contribution-based loot system. Unlike the Chambers of Xeric, where individual points are strictly tracked, ToB uses a system where deaths significantly penalize your chance of obtaining a unique item (purple). The calculator above assumes a deathless raid, as this is the standard for efficient farming.
How Drop Rates are Calculated
In a standard deathless raid, the chance for the team to see a purple chest is approximately 11% (1/9.1) for Normal Mode and slightly higher for Hard Mode. This team chance is then distributed among players based on their performance participation points.
Note on MVP: The MVP of the raid generally receives a larger share of the points, resulting in a slightly higher personal chance to receive the unique drop if one rolls.
The Unique Table Weightings
When a unique item is rolled, the game decides which item it is based on a specific weighting system out of 19 total "points" (for Normal Mode):
Avernic Defender Hilt: 7/19 (Most Common)
Justiciar Armor Pieces: 2/19 each (6/19 total for the set)
Ghrazi Rapier: 2/19
Sanguinesti Staff: 2/19
Scythe of Vitur: 1/19 (Rarest)
Hard Mode (HMT) Differences
Hard Mode Theatre of Blood introduces the Holy Ornament Kit, Sanguine Ornament Kit, and the Sanguine Dust. The base chance for standard uniques is slightly improved, and the weighting for the Scythe of Vitur is slightly more favorable compared to other items in the table.
Mathematical Formula Used
This calculator uses the Binomial Probability formula to determine your odds over multiple raids:
P(Drop) = 1 – (1 – DropRate) ^ NumberOfRaids
Where DropRate is your personal chance per raid based on team size and contribution.
Efficiency Tips
To maximize your drop rates, focus on:
Zero Deaths: A single death removes a massive chunk of your personal points.
Damage Output: Higher damage translates to MVP points, increasing your personal slice of the loot pie.
Team Size: Trios (3-man) offer the highest personal chance per raid compared to 4-man or 5-man teams, although they take slightly longer to complete.
function calculateTobDrops() {
// 1. Get Inputs
var mode = document.getElementById('raidMode').value;
var teamSize = parseInt(document.getElementById('teamSize').value);
var mvpStatus = document.getElementById('mvpStatus').value;
var raids = parseInt(document.getElementById('raidCount').value);
// Validation
if (isNaN(raids) || raids 1) personalChance = 1;
// 4. Item Weightings (Total 19 for Normal, HMT is similar for standard table but calculating standard loot here)
// Format: Name, Weight (out of 19)
var items = [
{ name: "Avernic Defender Hilt", weight: 7, class: "item-rare" },
{ name: "Ghrazi Rapier", weight: 2, class: "item-rare" },
{ name: "Sanguinesti Staff", weight: 2, class: "item-rare" },
{ name: "Justiciar Faceguard", weight: 2, class: "item-rare" },
{ name: "Justiciar Chestguard", weight: 2, class: "item-rare" },
{ name: "Justiciar Legguards", weight: 2, class: "item-rare" },
{ name: "Scythe of Vitur", weight: 1, class: "item-mega" }
];
var totalWeight = 19;
// 5. Generate Output
var tbody = document.getElementById('lootTableBody');
tbody.innerHTML = "; // Clear previous results
// Overall probability of ANY purple
var chanceAny = 1 – Math.pow((1 – personalChance), raids);
var expectedPurples = personalChance * raids;
document.getElementById('anyPurpleChance').innerHTML = (chanceAny * 100).toFixed(2) + "%";
document.getElementById('expectedPurples').innerHTML = expectedPurples.toFixed(2);
document.getElementById('tableRaidCount').innerHTML = raids;
// Loop through specific items
for (var i = 0; i < items.length; i++) {
var item = items[i];
// Chance of this specific item PER PURPLE
var specificWeightChance = item.weight / totalWeight;
// Chance of this specific item PER RAID (Personal)
var perRaidChance = personalChance * specificWeightChance;
// Cumulative chance over N raids
var cumulativeChance = 1 – Math.pow((1 – perRaidChance), raids);
// Display formatting
var perRaidText = "1/" + Math.round(1 / perRaidChance);
var cumulativeText = (cumulativeChance * 100).toFixed(2) + "%";
var row = "