*Calculation uses the ideal mid-point percentage for the safest results in your vessel or crucible.
Understanding TerraFirmaCraft Metallurgy
In TerraFirmaCraft (TFC), creating alloys is more complex than standard Minecraft crafting. To create an alloy, you must place specific ratios of different metals into a ceramic vessel or a crucible. Each metal has a specific unit value: small ores yield 10 units, while standard ores yield 25. A single ingot is equal to 100 units.
Alloy Recipes and Ranges
Alloys in TFC aren't fixed at one percentage; they exist within a specific range. If your mixture falls outside this range, you will simply end up with an "Unknown Metal" or a "shaking" vessel that won't pour. This calculator uses the median percentage to ensure your mix stays well within the safety margins.
Alloy
Required Components
Percentage Range
Bronze
Copper & Tin
88-92% Cu / 8-12% Sn
Bismuth Bronze
Copper, Zinc, Bismuth
50-65% Cu / 20-30% Zn / 10-20% Bi
Black Bronze
Copper, Silver, Gold
50-70% Cu / 10-25% Ag / 10-25% Au
Rose Gold
Copper & Gold
15-30% Cu / 70-85% Au
Tips for Smelting
Unit Conversion: Remember that 100 units = 1 Ingot. 10 units = 1 Small Ore.
The Vessel Limit: A ceramic vessel can hold up to 3000 units (30 ingots). Ensure your target amount doesn't exceed this.
Crucible Temperature: Ensure your forge is hot enough for the highest melting point metal in the alloy (usually Copper or Steel).
Precision: It is always better to aim for the middle of the percentage range to account for minor rounding issues in TFC's internal math.
function calculateTFCAlloy() {
var alloy = document.getElementById("alloySelect").value;
var target = parseFloat(document.getElementById("targetUnits").value);
var errorDiv = document.getElementById("error-msg");
var resultDiv = document.getElementById("results");
var output = document.getElementById("resultOutput");
var title = document.getElementById("resultTitle");
errorDiv.style.display = "none";
if (isNaN(target) || target <= 0) {
errorDiv.innerText = "Please enter a valid amount of units.";
errorDiv.style.display = "block";
resultDiv.style.display = "none";
return;
}
var ingredients = [];
var alloyName = "";
// Data structure: [Name, Midpoint Percentage]
if (alloy === "bronze") {
alloyName = "Bronze";
ingredients.push({name: "Copper", pct: 0.90});
ingredients.push({name: "Tin", pct: 0.10});
} else if (alloy === "bismuth_bronze") {
alloyName = "Bismuth Bronze";
ingredients.push({name: "Copper", pct: 0.55});
ingredients.push({name: "Zinc", pct: 0.25});
ingredients.push({name: "Bismuth", pct: 0.20});
} else if (alloy === "black_bronze") {
alloyName = "Black Bronze";
ingredients.push({name: "Copper", pct: 0.60});
ingredients.push({name: "Silver", pct: 0.20});
ingredients.push({name: "Gold", pct: 0.20});
} else if (alloy === "brass") {
alloyName = "Brass";
ingredients.push({name: "Copper", pct: 0.90});
ingredients.push({name: "Zinc", pct: 0.10});
} else if (alloy === "rose_gold") {
alloyName = "Rose Gold";
ingredients.push({name: "Gold", pct: 0.75});
ingredients.push({name: "Copper", pct: 0.25});
} else if (alloy === "sterling_silver") {
alloyName = "Sterling Silver";
ingredients.push({name: "Silver", pct: 0.70});
ingredients.push({name: "Copper", pct: 0.30});
} else if (alloy === "weak_steel") {
alloyName = "Weak Steel";
ingredients.push({name: "Steel", pct: 0.60});
ingredients.push({name: "Nickel", pct: 0.20});
ingredients.push({name: "Black Steel", pct: 0.20});
}
title.innerText = "Required for " + target + " Units of " + alloyName;
output.innerHTML = "";
for (var i = 0; i < ingredients.length; i++) {
var unitsRequired = (target * ingredients[i].pct).toFixed(1);
var ingotsRequired = (unitsRequired / 100).toFixed(2);
var box = document.createElement("div");
box.className = "tfc-recipe-box";
box.innerHTML = "" + ingredients[i].name + "" +
unitsRequired + " Units" +
"(" + ingotsRequired + " Ingots)";
output.appendChild(box);
}
resultDiv.style.display = "block";
}
function updateAlloyInfo() {
// Hidden results when changing alloy to ensure fresh calculation
document.getElementById("results").style.display = "none";
}