In the world of Tibia, skill progression is non-linear. Each subsequent level requires approximately 10% more effort than the previous one. This calculator uses the standard community formulas to estimate the total "points" (hits or mana) needed to reach your goal.
Skill Formulas and Constants
Different skills and vocations have specific multipliers. For example, Melee skills for Knights scale with a base factor of 50, while Distance for Paladins starts at a base of 30. Magic level is significantly more taxing, using a base of 1600 mana per level with varying multipliers based on your vocation:
Mages (Druid/Sorcerer): Multiplier of 1.1
Paladins: Multiplier of 1.4
Knights: Multiplier of 3.0
Understanding Loyalty Bonus
The Loyalty system rewards long-term players by providing a percentage bonus to their skill points. This bonus doesn't directly increase your skill level in the database, but it calculates your "Effective Skill" as if you had earned more points. If you have a 50% Loyalty bonus, you reach skill milestones 50% faster than a player with 0% loyalty.
Example: Melee Training (Knight)
To go from Skill 10 to Skill 80 in Axe, Sword, or Club, a Knight requires approximately 517,738 successful hits. If you are training with a "Slime" or a "Mad Sheep" using a knife or crowbar, you would need to calculate how many hours that represents based on your hit rate (usually 1 hit every 2 seconds in standard training).
Training Weapons and Mana
If you are calculating Magic Level, the result shows the total Mana needed. For example, a Master Sorcerer going from ML 10 to 100 needs billions of mana. You can translate this into "Exercise Wands" by dividing the total mana by the mana provided by a single charge (usually 500 mana per charge for Exercise weapons).
function calculateTibiaSkill() {
var type = document.getElementById("tibiaSkillType").value;
var current = parseInt(document.getElementById("tibiaCurrentSkill").value);
var target = parseInt(document.getElementById("tibiaTargetSkill").value);
var percentRemaining = parseFloat(document.getElementById("tibiaPercent").value);
var loyalty = parseFloat(document.getElementById("tibiaLoyalty").value);
if (target <= current) {
alert("Target skill must be higher than current skill.");
return;
}
var base = 50;
var mult = 1.1;
var unit = "Hits";
// Adjust constants based on selection
if (type === "melee_knight") {
base = 50;
mult = 1.1;
unit = "Hits";
} else if (type === "dist_paly") {
base = 30;
mult = 1.1;
unit = "Hits";
} else if (type === "shielding") {
base = 100;
mult = 1.1;
unit = "Hits";
} else if (type === "mag_mage") {
base = 1600;
mult = 1.1;
unit = "Mana";
} else if (type === "mag_paly") {
base = 1600;
mult = 1.4;
unit = "Mana";
} else if (type === "mag_knight") {
base = 1600;
mult = 3.0;
unit = "Mana";
}
var totalPointsRequired = 0;
// Sum points for each level gap
for (var i = current; i < target; i++) {
var pointsForThisLevel;
if (unit === "Mana") {
// Magic level formula: Base * (Mult ^ Level)
pointsForThisLevel = base * Math.pow(mult, i);
} else {
// Melee/Dist formula: Base * (Mult ^ (Level – 10))
pointsForThisLevel = base * Math.pow(mult, i – 10);
}
// Apply current progress (percentage remaining)
if (i === current) {
totalPointsRequired += pointsForThisLevel * (percentRemaining / 100);
} else {
totalPointsRequired += pointsForThisLevel;
}
}
// Apply Loyalty adjustment
// Loyalty adds a bonus to your points, meaning you need fewer raw points to reach the level
var actualEffortNeeded = totalPointsRequired / (1 + (loyalty / 100));
// Calculate Exercise Weapon Estimates
var resultHTML = "";
resultHTML += "Total " + unit + " Required: " + Math.round(actualEffortNeeded).toLocaleString() + "";
if (unit === "Mana") {
var wands = Math.ceil(actualEffortNeeded / 300000); // Standard Exercise Wand = 300,000 mana
resultHTML += "Exercise Wands (500 charges): ~" + Math.ceil(actualEffortNeeded / 250000).toLocaleString() + " units";
resultHTML += "Approximate Time: " + (actualEffortNeeded / 1000 / 60).toFixed(2) + " hours of constant spell casting (at 1000 mana/min).";
} else {
var hours = (actualEffortNeeded * 2) / 3600; // Assuming 1 hit every 2 seconds (30 hits per minute)
resultHTML += "Training Time (Offline): " + (hours * 2).toFixed(1) + " hours";
resultHTML += "Training Time (Online/Target): " + hours.toFixed(1) + " hours";
}
var resultArea = document.getElementById("tibiaResultArea");
var resultContent = document.getElementById("tibiaResultContent");
resultContent.innerHTML = resultHTML;
resultArea.style.display = "block";
}