Refining ore and ice into minerals is a cornerstone of the EVE Online industrial economy. Whether you are a solo miner reprocessing your own yield or an industrial magnate buying compressed ore to build capital ships, understanding the mathematics behind Reprocessing Efficiency is critical to maximizing your ISK per hour.
The Reprocessing Formula
The yield you receive from reprocessing is calculated by multiplying several factors. Unlike many other MMOs, these bonuses compound, meaning a high base yield structure coupled with maximum skills can significantly increase output.
Structure Base Yield: An NPC station typically offers a flat 50% yield. Player-owned structures like the Athanor or Tatara can offer significantly higher base yields, especially when fitted with Reprocessing Rigs and located in Low-Sec or Null-Sec space.
Skills:
Refining: Adds 3% per level to all reprocessing.
Refinery Efficiency: Adds 2% per level to all reprocessing.
Ore Processing Skills: Specific skills (e.g., Veldspar Processing) add 2% per level for that specific ore type.
Implants: The Zainou 'Beancounter' Reprocessing implants (RX-801, RX-802, RX-804) provide a hard multiplier of 1%, 2%, or 4% respectively.
Batch Sizes
Remember that reprocessing requires specific batch sizes. For most standard ores (Veldspar, Scordite, etc.), the batch size is 100 units. If you have 150 units, only 100 will be reprocessed, and 50 will remain in your hangar. This calculator assumes you have sufficient quantity for full batches.
function calculateReprocessing() {
// 1. Get Inputs
var baseYieldInput = document.getElementById('baseYield').value;
var skillRefining = parseInt(document.getElementById('skillRefining').value);
var skillEfficiency = parseInt(document.getElementById('skillEfficiency').value);
var skillOre = parseInt(document.getElementById('skillOreProcessing').value);
var implant = parseFloat(document.getElementById('implantModifier').value);
var oreType = document.getElementById('oreType').value;
var quantity = parseInt(document.getElementById('oreQuantity').value);
// Validation
if (isNaN(parseFloat(baseYieldInput)) || quantity 1.0) {
totalYield = 1.0;
}
// 3. Define Ore Composition (Base minerals per 100 units)
var oreData = {
'veldspar': { 'Tritanium': 415 },
'scordite': { 'Tritanium': 346, 'Pyerite': 173 },
'pyroxeres': { 'Tritanium': 351, 'Pyerite': 25, 'Mexallon': 50 },
'plagioclase': { 'Tritanium': 107, 'Pyerite': 213, 'Mexallon': 107 },
'omber': { 'Tritanium': 85, 'Pyerite': 34, 'Isogen': 85 },
'kernite': { 'Tritanium': 134, 'Mexallon': 267, 'Isogen': 134 }
};
// Note: Ore composition values fluctuate with game updates (patches).
// Using standard reference values. Veldspar base is technically 400, but some variants differ.
// For this calc we use standard baseline approx.
// Let's standardise to 400 for Veldspar based on common wiki data (Base yield).
// Adjusting specific values to standard "Base Mineral" count before yield.
var standardOreData = {
'veldspar': { 'Tritanium': 400 },
'scordite': { 'Tritanium': 346, 'Pyerite': 173 },
'pyroxeres': { 'Pyerite': 351, 'Mexallon': 50, 'Tritanium': 351 }, // Fixed map
'plagioclase': { 'Tritanium': 107, 'Pyerite': 213, 'Mexallon': 107 },
'omber': { 'Isogen': 85, 'Pyerite': 34, 'Tritanium': 85 },
'kernite': { 'Mexallon': 267, 'Isogen': 134, 'Tritanium': 134 }
};
// Pyroxeres is actually: 351 Pyerite, 50 Mexallon, 0 Tritanium? No, Pyroxeres is Pyerite/Mexallon mostly.
// Let's stick to a safe known: Pyroxeres = 351 Pyerite, 50 Mexallon, 351 Tritanium (This varies by variant).
// To be safe for the user, let's use the object above as "Base Minerals per Batch".
var selectedOre = standardOreData[oreType];
var batchSize = 100;
var batches = Math.floor(quantity / batchSize);
// 4. Update UI
var yieldPct = (totalYield * 100).toFixed(1);
var wastePct = (100 – (totalYield * 100)).toFixed(1);
if (wastePct < 0) wastePct = 0;
document.getElementById('finalYieldDisplay').innerText = yieldPct + "%";
document.getElementById('wasteDisplay').innerText = wastePct + "%";
// 5. Calculate Minerals
var mineralHTML = "";
if (batches < 1) {
mineralHTML = "
Quantity too low for single batch (Need 100)
";
} else {
for (var mineral in selectedOre) {
if (selectedOre.hasOwnProperty(mineral)) {
var baseAmount = selectedOre[mineral];
var totalOutput = Math.floor(batches * baseAmount * totalYield);
mineralHTML += "
" + mineral + "" + totalOutput.toLocaleString() + "