MediaWiki:Calculator.js/Mana Regeneration.js

Note: After saving, 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: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Clear the cache in Tools → Preferences
/**
 * Calculator that calculates your mana regenerated per second based on Meditation, Focus, Intelligence, and equipped MR.
 */
function ManaPerSecondCalculator() {
    var calculate = function(meditation, focus, int, mr, passive, active, nonMed) {
        var gmBonus = 1.0;
        if (!meditation.value || !isNumeric(meditation.value)) {
            meditation.value = '0.0';
        } else if (meditation.value >= 100) {
            gmBonus = 1.1;
            if (meditation.value > 120) {
                meditation.value = '120.0'
            }
        }
        if (!focus.value || !isNumeric(focus.value)) {
            focus.value = '0.0';
        } else if (focus.value > 120) {
            focus.value = '120.0';
        }
        if (!int.value || !isNumeric(int.value)) {
            int.value = '0';
        } else if (int.value > 168) {
            int.value = '168';
        }
        if (!mr.value || !isNumeric(mr.value)) {
            mr.value = '0';
        }

        var baseRate = 0.2;
        var focusBonus = parseFloat(focus.value) / 200;
        var medBonus = gmBonus * ((0.0075 * parseFloat(meditation.value)) + (0.0025 * parseFloat(int.value)));
        var finalItemBonus = 0;
        if (parseFloat(mr.value) > 0) {
            var baseItemBonus = ((((parseFloat(meditation.value) / 2) + (parseFloat(focus.value) / 4)) / 90) * 0.65) + 2.35;
            var intensityBonus = Math.min(Math.sqrt(parseFloat(mr.value)), 5.5);
            finalItemBonus = ((baseItemBonus * intensityBonus) - (baseItemBonus - 1)) / 10;
        }
        var manaPerSecond = baseRate + focusBonus + medBonus + finalItemBonus;
        manaPerSecond = manaPerSecond.toFixed(4);
        removeChildren(passive);
        passive.appendChild(document.createTextNode(manaPerSecond + ' MPS'));
        manaPerSecond = baseRate + focusBonus + (2 * medBonus) + finalItemBonus;
        manaPerSecond = manaPerSecond.toFixed(4);
        removeChildren(active);
        active.appendChild(document.createTextNode(manaPerSecond + ' MPS'));
        manaPerSecond = baseRate + focusBonus + finalItemBonus;
        manaPerSecond = manaPerSecond.toFixed(4);
        removeChildren(nonMed);
        nonMed.appendChild(document.createTextNode(manaPerSecond + ' MPS'));
    };

    var resetCalculator = function() {
        meditationInput.value = '';
        focusInput.value = '';
        intInput.value = '';
        mrInput.value = '';
        removeChildren(passivePerSecond);
        passivePerSecond.appendChild(document.createTextNode('0.0000 MPS'));
        removeChildren(activePerSecond);
        activePerSecond.appendChild(document.createTextNode('0.0000 MPS'));
        removeChildren(nonMedPerSecond);
        nonMedPerSecond.appendChild(document.createTextNode('0.0000 MPS'));
        meditationInput.focus();
    };

    var detectKey = function(keyEvent) {
        var keyID = window.event ? event.keyCode : keyEvent.keyCode;
        if (keyID == 13)
            calculate(meditationInput, focusInput, intInput, mrInput, passivePerSecond, activePerSecond, nonMedPerSecond);
        else if (keyID == 27)
            resetCalculator(meditationInput, focusInput, intInput, mrInput, passivePerSecond, activePerSecond, nonMedPerSecond);
    };

    var calcTableRow = document.createElement('tr');
    var calcTableCell = document.createElement('td');
    calcTableRow.appendChild(calcTableCell);

    var innerTable = document.createElement('table');
    innerTable.style.borderCollapse = 'collapse';
    calcTableCell.appendChild(innerTable);

    var innerBody = document.createElement('tbody');
    innerTable.appendChild(innerBody);

    var innerRow = document.createElement('tr');

    var innerCell = document.createElement('td');
    innerCell.style.textAlign = 'right';
    innerCell.appendChild(document.createTextNode('Meditation:'));
    innerRow.appendChild(innerCell);

    var meditationInput = document.createElement('input');
    meditationInput.maxLength = '5';
    meditationInput.type = 'text';
    meditationInput.style.width = '50px';
    meditationInput.onkeyup = function(keyEvent) {
        detectKey(keyEvent);
    };
    innerCell = document.createElement('td');
    innerCell.style.textAlign = 'left';
    innerCell.appendChild(meditationInput);
    innerRow.appendChild(innerCell);
    innerBody.appendChild(innerRow);

    innerCell = document.createElement('td');
    innerCell.style.textAlign = 'right';
    innerCell.appendChild(document.createTextNode('Focus:'));
    innerRow = document.createElement('tr');
    innerRow.appendChild(innerCell);

    var focusInput = document.createElement('input');
    focusInput.maxLength = '5';
    focusInput.type = 'text';
    focusInput.style.width = '50px';
    focusInput.onkeyup = function(keyEvent) {
        detectKey(keyEvent);
    };
    innerCell = document.createElement('td');
    innerCell.style.textAlign = 'left';
    innerCell.appendChild(focusInput);
    innerRow.appendChild(innerCell);
    innerBody.appendChild(innerRow);

    innerCell = document.createElement('td');
    innerCell.style.textAlign = 'right';
    innerCell.appendChild(document.createTextNode('Intelligence:'));
    innerRow = document.createElement('tr');
    innerRow.appendChild(innerCell);

    var intInput = document.createElement('input');
    intInput.maxLength = '3';
    intInput.type = 'text';
    intInput.style.width = '50px';
    intInput.onkeyup = function(keyEvent) {
        detectKey(keyEvent);
    };
    innerCell = document.createElement('td');
    innerCell.style.textAlign = 'left';
    innerCell.appendChild(intInput);
    innerRow.appendChild(innerCell);
    innerBody.appendChild(innerRow);

    innerCell = document.createElement('td');
    innerCell.style.textAlign = 'right';
    innerCell.appendChild(document.createTextNode('Equipped MR:'));
    innerRow = document.createElement('tr');
    innerRow.appendChild(innerCell);

    var mrInput = document.createElement('input');
    mrInput.maxLength = '2';
    mrInput.type = 'text';
    mrInput.style.width = '50px';
    mrInput.onkeyup = function(keyEvent) {
        detectKey(keyEvent);
    };
    innerCell = document.createElement('td');
    innerCell.style.textAlign = 'left';
    innerCell.appendChild(mrInput);
    innerRow.appendChild(innerCell);
    innerBody.appendChild(innerRow);

    var calculateButton = document.createElement('input');
    calculateButton.type = 'button';
    calculateButton.value = 'Calculate';
    calculateButton.style.width = '75px';
    calculateButton.onclick = function() {
        calculate(meditationInput, focusInput, intInput, mrInput, passivePerSecond, activePerSecond, nonMedPerSecond);
    };
    innerCell = document.createElement('td');
    innerCell.appendChild(calculateButton);
    innerRow = document.createElement('tr');
    innerRow.appendChild(innerCell);

    var resetButton = document.createElement('input');
    resetButton.type = 'button';
    resetButton.value = 'Reset';
    resetButton.style.width = '75px';
    resetButton.onclick = function() {
        resetCalculator(meditationInput, focusInput, intInput, mrInput, passivePerSecond, activePerSecond, nonMedPerSecond);
    };
    innerCell = document.createElement('td');
    innerCell.appendChild(resetButton);
    innerRow.appendChild(innerCell);
    innerBody.appendChild(innerRow);

    innerCell = document.createElement('td');
    innerCell.style.textAlign = 'right';
    innerCell.appendChild(document.createTextNode('Passive:'));
    innerRow = document.createElement('tr');
    innerRow.appendChild(innerCell);

    var passivePerSecond = document.createElement('div');
    passivePerSecond.appendChild(document.createTextNode('0.0000 MPS'));
    passivePerSecond.style.textAlign = 'right';
    passivePerSecond.style.width = '75px';
    innerCell = document.createElement('td');
    innerCell.appendChild(passivePerSecond);
    innerRow.appendChild(innerCell);
    innerBody.appendChild(innerRow);

    innerCell = document.createElement('td');
    innerCell.style.textAlign = 'right';
    innerCell.appendChild(document.createTextNode('Active:'));
    innerRow = document.createElement('tr');
    innerRow.appendChild(innerCell);

    var activePerSecond = document.createElement('div');
    activePerSecond.appendChild(document.createTextNode('0.0000 MPS'));
    activePerSecond.style.textAlign = 'right';
    activePerSecond.style.width = '75px';
    innerCell = document.createElement('td');
    innerCell.appendChild(activePerSecond);
    innerRow.appendChild(innerCell);
    innerBody.appendChild(innerRow);

    innerCell = document.createElement('td');
    innerCell.style.textAlign = 'right';
    innerCell.appendChild(document.createTextNode('Non-Meddable:'));
    innerRow = document.createElement('tr');
    innerRow.appendChild(innerCell);

    var nonMedPerSecond = document.createElement('div');
    nonMedPerSecond.appendChild(document.createTextNode('0.0000 MPS'));
    nonMedPerSecond.style.textAlign = 'right';
    nonMedPerSecond.style.width = '75px';
    innerCell = document.createElement('td');
    innerCell.appendChild(nonMedPerSecond);
    innerRow.appendChild(innerCell);
    innerBody.appendChild(innerRow);

    return calcTableRow;
}

function searchForCalculators() {
    var calculators = document.getElementsByTagName('div');

    for (var i in calculators) {
         if (calculators[i].id == 'ManaPerSecond') {
             Calculator(ManaPerSecondCalculator(), 'ManaPerSecond', 'Mana Per Second', 1);
         }
    }
}
addOnloadHook(searchForCalculators);