MediaWiki:SlayerPointsCalc.js
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
mw.hook('wikipage.content').add(function () {
// Only run on the correct page
if (mw.config.get('wgPageName') !== "Slayer_points_calculator") return;
var container = document.getElementById("slayerCalcContainer");
if (!container) return;
// Build UI
container.innerHTML =
'<div style="margin-bottom:10px;">' +
'Donator Boost: ' +
'<select id="donatorBoost">' +
'<option value="0">None</option>' +
'<option value="5">Donator (+5%)</option>' +
'<option value="10">Super Donator (+10%)</option>' +
'<option value="15">Extreme Donator (+15%)</option>' +
'<option value="25">Legendary Donator (+25%)</option>' +
'<option value="50">Royal Donator (+50%)</option>' +
'<option value="75">Divine Donator (+75%)</option>' +
'</select>' +
'</div>' +
'<div style="margin-bottom:10px;">' +
'<label><input type="checkbox" id="slayerGatherer"> Slayer Gatherer (+50% points per task)</label>' +
'</div>' +
'<div style="margin-bottom:10px;">' +
'Avg task duration: <input type="number" id="taskMinutes" value="5" min="1" style="width:60px;"> minutes' +
'</div>' +
'<table id="slayerTable" style="border-collapse:collapse; width:400px;">' +
'<thead>' +
'<tr style="background:#222e45;color:#fff;">' +
'<th style="padding:5px;text-align:left;">Task</th>' +
'<th style="padding:5px;text-align:center;">Points</th>' +
'</tr>' +
'</thead>' +
'<tbody></tbody>' +
'</table>' +
'<div id="pointsPerHour" style="margin-top:10px; font-weight:bold;"></div>' ;
var basePoints = 25;
// Milestones: higher ones override lower if task hits multiple
var milestones = [
{name:"Normal task", multiplier:1},
{name:"10th task", multiplier:5},
{name:"50th task", multiplier:15},
{name:"100th task", multiplier:25},
{name:"250th task", multiplier:35},
{name:"1,000th task", multiplier:50}
];
var tbody = document.querySelector("#slayerTable tbody");
milestones.forEach(function(milestone, index){
var row = tbody.insertRow();
row.style.background = index % 2 ? "#222e45" : "#313e59";
row.style.color = "#fff";
var cell1 = row.insertCell();
cell1.textContent = milestone.name;
cell1.style.padding = "5px";
var cell2 = row.insertCell();
cell2.id = "points_" + index;
cell2.style.textAlign = "center";
cell2.style.padding = "5px";
});
function calculateAveragePointsPerTask() {
// Count occurrences in 1,000 tasks using “higher overrides lower”
var totalTasks = 1000;
var taskCounts = {
"1000":1,
"250":3,
"100":8,
"50":8,
"10":80,
"normal": 1000 - (1+3+8+8+80) // =900
};
var sum = 0;
sum += taskCounts.normal * basePoints * 1;
sum += taskCounts["10"] * basePoints * 5;
sum += taskCounts["50"] * basePoints * 15;
sum += taskCounts["100"] * basePoints * 25;
sum += taskCounts["250"] * basePoints * 35;
sum += taskCounts["1000"] * basePoints * 50;
return sum / totalTasks; // average points per task without bonuses
}
function updatePoints() {
var boost = parseFloat(document.getElementById("donatorBoost").value) || 0;
var multiplierBoost = 1 + boost/100;
var gatherer = document.getElementById("slayerGatherer").checked ? 0.5 : 0;
var averagePoints = calculateAveragePointsPerTask() * multiplierBoost * (1 + gatherer);
// Update table points (simple display: just base points × multiplier × bonuses for each milestone)
milestones.forEach(function(milestone, index){
var points = basePoints * milestone.multiplier * multiplierBoost * (1 + gatherer);
document.getElementById("points_" + index).textContent = Math.floor(points);
});
// Update points per hour
var minutes = parseFloat(document.getElementById("taskMinutes").value) || 1;
var pph = averagePoints * (60 / minutes);
document.getElementById("pointsPerHour").textContent = "Average Points per Hour: " + Math.floor(pph);
}
document.getElementById("donatorBoost").addEventListener("change", updatePoints);
document.getElementById("slayerGatherer").addEventListener("change", updatePoints);
document.getElementById("taskMinutes").addEventListener("input", updatePoints);
updatePoints();
});