In Maplestory, Starforce Enhancement is the primary method of upgrading equipment to gain significant stat boosts. By spending Mesos, players can attempt to increase the Star Level of an item. As the level increases, the cost rises, the success rate decreases, and the risk of failure (dropping stars or destroying the item) increases.
How Starforce Costs are Calculated
The Meso cost for a Starforce attempt is determined by a formula based on the item's level and its current star count. The formula changes depending on the star tier:
Below 10 Stars: Lower scaling factor.
10 to 14 Stars: Uses a divisor of 400.
15 to 25 Stars: Uses a divisor of 200, making these upgrades significantly more expensive.
This calculator estimates the average Mesos required to reach a specific target star by simulating the process thousands of times, accounting for pass, fail, drop, and boom rates.
Safeguarding and Events
Strategic enhancing is key to saving Mesos:
Safeguard: Available between 12 and 16 stars. It doubles the Meso cost of the attempt but prevents the item from being destroyed (boomed) if the upgrade fails.
Star Catching: A mini-game that, if done correctly, increases the success rate by approximately 4-5% (multiplicative).
5/10/15 Events: Grants 100% success rate at 5, 10, and 15 stars, effectively acting as a checkpoint and saving vast amounts of currency.
30% Off Events: Simply reduces the base Meso cost per attempt by 30%.
Understanding the Risks
The "Boom" chance usually starts at 12 stars. While the percentage seems low (e.g., 0.6% to 7%), the cumulative probability of destroying an item increases significantly over many attempts. Always have backup items or sufficient Mesos to replace destroyed gear before attempting high-level enhancements.
function calculateStarforce() {
var itemLevel = parseInt(document.getElementById('itemLevel').value);
var startStar = parseInt(document.getElementById('currentStar').value);
var targetStar = parseInt(document.getElementById('targetStar').value);
var starCatch = document.getElementById('starCatch').checked;
var safeGuard = document.getElementById('safeGuard').checked;
var mvpDiscount = parseFloat(document.getElementById('mvpDiscount').value);
var eventType = document.getElementById('eventSelect').value;
// Validation
if (isNaN(itemLevel) || isNaN(startStar) || isNaN(targetStar)) {
alert("Please enter valid numbers for Level and Stars.");
return;
}
if (startStar 25) {
alert("Stars must be between 0 and 25.");
return;
}
if (startStar >= targetStar) {
alert("Target Star must be higher than Current Star.");
return;
}
// Configuration Constants
var SIMULATIONS = 2000;
var totalCostAccumulator = 0;
var costsArray = [];
var totalBooms = 0;
// Simulation Loop
for (var i = 0; i < SIMULATIONS; i++) {
var currentCost = 0;
var currentSimStar = startStar;
var isBoomed = false;
// Prevent infinite loops in edge cases by hard cap
var attempts = 0;
while (currentSimStar < targetStar && attempts = 12 && currentSimStar <= 16);
if (useSafeguard) {
baseCost = baseCost * 2;
}
// Apply MVP Discount
baseCost = baseCost * (1 – mvpDiscount);
currentCost += Math.floor(baseCost);
// 2. Determine Probabilities
var successRate = getSuccessRate(currentSimStar);
// Apply 5/10/15 Event
if (eventType === 'fiveTenFifteen') {
if (currentSimStar === 5 || currentSimStar === 10 || currentSimStar === 15) {
successRate = 1.0;
}
}
// Apply Star Catching (Multiplicative approx 1.05)
// Note: If 100%, star catch doesn't add.
if (starCatch && successRate 1.0) successRate = 1.0;
}
// Determine outcome
var roll = Math.random();
if (roll successRate, we check if it falls in boom range
if (roll 10.
// Actually drops happen on fail if not boom.
// Determine drop eligibility
var canDrop = false;
if (currentSimStar > 10 && currentSimStar % 5 !== 0 && currentSimStar !== 20) {
canDrop = true;
}
// There is "Keep" chance for low levels, but high levels usually Drop on fail.
// Masteria/GMS logic:
// < 10: Fail = Keep.
// 10-15: Fail = Drop (unless checkpoint).
// 15+: Fail = Drop (unless checkpoint).
if (canDrop) {
currentSimStar–;
}
// Else keep (at checkpoint or 100% if multiple booms.
// Actually user wants "Chance to boom at least once".
// Let's count runs with at least one boom.
// We need to refactor boom counting slightly for "Probability".
// Current logic counts total booms. Let's stick to "Average Booms" or just hide it if confusing.
// Better: Probability of booming at least once in the journey.
// Sorting for Median
costsArray.sort(function(a, b){return a – b});
var medianCost = costsArray[Math.floor(costsArray.length / 2)];
// Calculate Next Click Cost for display
var nextCost = getMesoCost(itemLevel, startStar);
if (eventType === 'thirty') nextCost *= 0.7;
var safeNext = safeGuard && (startStar >= 12 && startStar <= 16);
if (safeNext) nextCost *= 2;
nextCost *= (1 – mvpDiscount);
// Formatting
document.getElementById('avgCost').innerHTML = formatNumber(avgCost) + " Mesos";
document.getElementById('medianCost').innerHTML = formatNumber(medianCost) + " Mesos";
document.getElementById('nextClickCost').innerHTML = formatNumber(nextCost) + " Mesos";
// Boom prob (simulated average booms per success)
var avgBooms = totalBooms / SIMULATIONS;
document.getElementById('boomProb').innerHTML = avgBooms.toFixed(2) + " Booms (Avg)";
document.getElementById('resultArea').style.display = 'block';
}
function getMesoCost(level, star) {
// GMS Formulas
var cost = 0;
if (star < 10) {
cost = 1000 + (Math.pow(level, 3) * (star + 1) / 25);
} else if (star = 15 && star < 22) return 0.30; // 15-21 is 30%
if (star === 22) return 0.03;
if (star === 23) return 0.02;
if (star === 24) return 0.01;
return 0;
}
function getBoomRate(star) {
if (star = 15 && star = 20 && star < 22) return 0.07; // 20, 21
if (star === 22) return 0.194;
if (star === 23) return 0.294;
if (star === 24) return 0.396;
return 0;
}
function formatNumber(num) {
return Math.floor(num).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}