您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Automate rolling for specific modifiers in Corruption Mode (April Fools 2021 event)
- // ==UserScript==
- // @name Melvor Idle Corruption Helper
- // @namespace http://tampermonkey.net/
- // @version 1.0.2
- // @description Automate rolling for specific modifiers in Corruption Mode (April Fools 2021 event)
- // @author Cyrogem
- // @helpedby Erik Gillespie, Kad
- // @site https://www.cyrogemgames.com/
- // @match https://*.melvoridle.com/*
- // @exclude https://wiki.melvoridle.com/*
- // @grant none
- // ==/UserScript==
- const skillSpecificModifiers = [
- // inc skill hidden level
- 40,
- // dec skill interval
- 92,
- // dec skill interval %
- 93,
- // inc skill preserve chance
- 95,
- // inc mastery exp
- 103,
- // inc skill exp
- 104,
- // (old) probably inc skill interval
- 107,
- // (old) probably inc skill interval %
- 108,
- // inc chance to double in skill
- 132,
- ]
- let allTraitsWanted = {}
- let newDesireTrait = -1
- let newDesireValue = -1
- let newDesireSlot = -1
- let newDesireSkill = -1
- let iterations = 0
- let lostItems = 0
- let rolls = 0
- let activeModifiers = [];
- /**
- * Roll for corruption based on the previously input information
- */
- function CyrogemRollCorruption(){
- if (newDesireSlot < 0){
- window.alert('Please select a slot to roll for')
- return;
- }
- let equipmentSlot = newDesireSlot
- let cost = getRandomModifierCost(equipmentSlot);
- let keepTrying = true
- let mods = {}
- lostItems = 0
- rolls = 0
- // Test to make sure we have the things
- let atLeastOneKey = false
- for(var key in allTraitsWanted) {
- var value = allTraitsWanted[key];
- if (typeof value === 'object' && value !== null){
- atLeastOneKey = Object.keys(value).length > 0 || atLeastOneKey
- } else {
- atLeastOneKey = true
- }
- //console.log(key + ' ' + value)
- }
- if (!atLeastOneKey){
- window.alert('Please have at least one desire')
- return;
- }
- // Re-roll
- for(let i = 0; i < iterations && keepTrying; i++){
- rolls++
- //console.log(cost + ' ' + equippedItems[equipmentSlot])
- if (gp >= cost && equippedItems[equipmentSlot] > 0) {
- gp -= cost;
- updateGP();
- let tier = getRandomModifierTier(equipmentSlot);
- let chanceToDestroy = getRandomModifiersDestroyChance(tier);
- // Do we lose the item
- if (rollPercentage(chanceToDestroy)) {
- lostItems++
- let qty = getItemQtyRandomModifier(equippedItems[equipmentSlot]);
- if (qty[0] > 1) {
- if (equipmentSlot === CONSTANTS.equipmentSlot.Quiver && ammo > 1) {
- ammo--;
- equipmentSets[selectedEquipmentSet].ammo--;
- updateAmmo();
- } else
- updateItemInBank(qty[1], equippedItems[equipmentSlot], -1);
- } else {
- equippedItems[equipmentSlot] = 0;
- equipmentSets[selectedEquipmentSet].equipment[equipmentSlot] = 0;
- setEquipmentSet(selectedEquipmentSet);
- }
- } else {
- mods = rollRandomModifiers(tier, "equipment", equipmentSlot);
- keepTrying = !CyrogemCheckCorruption(mods)
- }
- } else {
- rolls--
- break;
- }
- }
- updateRandomModifierInfo(equipmentSlot);
- updateHTMLRandomMod(equipmentSlot, mods);
- window.alert('We ' + (keepTrying ? 'failed' : 'succeeded') + ' after ' + rolls + ' re-rolls and lost ' + lostItems + ' to the void')
- }
- /**
- * Are these mods what we desire
- * @param {*} mods The newly rolled mods
- * @returns True if a mod matches a desire
- */
- function CyrogemCheckCorruption(mods){
- let success = false
- for (let i = 0; i < mods.length && !success; i++) {
- let theMod = mods[i].modifier
- let theValue = mods[i].value
- //console.log(theMod)
- //console.log(theValue)
- // Is the value a list
- if (theValue.length) {
- // This is a niche event, is this something we are looking for
- // Get it out of it's inner shell
- theValue = theValue[0]
- let theSkillName = skillName[theValue[0]]
- //console.log('skill name = ' + theSkillName)
- // Check if we have this defined as a desire
- if (allTraitsWanted[theMod] !== undefined && allTraitsWanted[theMod][theSkillName] !== undefined){
- // We have it defined, is it high enough of a value
- if (allTraitsWanted[theMod][theSkillName] <= theValue[1]){
- success = true
- }
- }
- }
- else{
- if (allTraitsWanted[theMod] !== undefined && allTraitsWanted[theMod] <= theValue) {
- success = true
- }
- }
- }
- // If we have one of the ones we want, return true
- return success
- }
- /**
- * Remember current desire to check against when we roll
- *
- * Also creates button to remove desire
- */
- function CyrogemAddDesire(){
- if (newDesireValue === -1 || newDesireValue === '' || newDesireTrait === -1 || (skillSpecificModifiers.includes(newDesireTrait) && newDesireSkill === -1)){
- window.alert('Please Select a Slot, Desired Trait(s), Desired Value(s), and a Desired Skill if aplicable')
- return;
- }
- let newmod = activeModifiers[newDesireTrait]
- // Is this a special case where we need a skill specified
- if(skillSpecificModifiers.includes(newDesireTrait)){
- // Initial setup in case this is our first one
- if (allTraitsWanted[newmod] === undefined){
- allTraitsWanted[newmod] = {}
- }
- // Assign this with the skillName
- allTraitsWanted[newmod][skillName[newDesireSkill]] = newDesireValue
- } else {
- allTraitsWanted[newmod] = newDesireValue
- }
- // Erik Gillespie solved this issue
- const displayElement = document.getElementById('cyrogem-current-desires')
- const buttonTemplate = document.getElementById('cyrogem-button-template')
- const newButton = document.importNode(buttonTemplate.content.firstElementChild, true)
- // Is this a skill specific desire
- if(skillSpecificModifiers.includes(newDesireTrait)){
- let trait = activeModifiers[newDesireTrait]
- let skill = skillName[newDesireSkill]
- newButton.id = 'kill-desire-' + trait + '-' + skill
- newButton.innerHTML = printPlayerModifier(trait, [newDesireSkill, newDesireValue])[0]
- newButton.addEventListener('click', () => CyrogemRemoveDesire(trait, skill))
- } else {
- let trait = activeModifiers[newDesireTrait]
- newButton.id = 'kill-desire-' + trait
- newButton.innerHTML = printPlayerModifier(trait, newDesireValue)[0]
- newButton.addEventListener('click', () => CyrogemRemoveDesire(trait))
- }
- displayElement.appendChild(newButton)
- CyrogemUpdatePrediction()
- // Debugging
- /*
- for(var key in allTraitsWanted) {
- var value = allTraitsWanted[key];
- if(typeof value === 'object' && value !== null){
- for(var key2 in value){
- console.log(
- 'My path is: allTraitsWanted[' + key + '][' + key2 + ']' +
- '\nand I equal ' + allTraitsWanted[key][key2]
- )
- }
- } else {
- console.log(key + ' ' + value)
- }
- }
- */
- }
- /**
- * Remove a currently listed desire
- * @param {*} trait What desire are we removing
- * @param {*} skill What skill, if any, are we removing from this trait
- */
- function CyrogemRemoveDesire(trait, skill=null){
- // Easy one first
- //console.log(allTraitsWanted[trait] + ' before')
- if (skill === null){
- delete allTraitsWanted[trait];
- document.getElementById('kill-desire-' + trait).remove()
- } else {
- var value = allTraitsWanted[trait];
- if(typeof value === 'object' && value !== null){
- delete value[skill];
- document.getElementById('kill-desire-' + trait + '-' + skill).remove()
- }
- }
- //console.log(allTraitsWanted.trait + ' after')
- CyrogemUpdatePrediction()
- }
- // Erik Gillespie provided the solution to buttons losing eventHandlers
- // A lot of old code was removed thanks to him
- const ErikTactic = true
- /**
- * Update the display for the player showing the expected outcome
- */
- function CyrogemUpdatePrediction(){
- let predictionHTML = ''
- // Assemble info only needed here
- let costPerRoll = newDesireSlot >= 0 ? getRandomModifierCost(newDesireSlot) : 0
- let tierOfRoll = newDesireSlot >= 0 ? getRandomModifierTier(newDesireSlot) : 0
- let maxValue = getRandomModifierMaxValue(tierOfRoll) - 1
- let items = newDesireSlot >= 0 ? getItemQtyRandomModifier(equippedItems[newDesireSlot])[0] : 0
- let predictedNumberOfActualRolls = iterations
- let rollsUntilNoItems = tierOfRoll <= 0 ? 0 : Math.floor(items / (getRandomModifiersDestroyChance(tierOfRoll) / 100))
- // Find our limiting factor, either attempts, items, or gold
- if (rollsUntilNoItems < predictedNumberOfActualRolls){
- predictedNumberOfActualRolls = rollsUntilNoItems
- }
- if (gp / costPerRoll < predictedNumberOfActualRolls){
- predictedNumberOfActualRolls = Math.floor(gp / costPerRoll)
- }
- // Calculate odds
- let oddsOfGettingWhatYouWant = 0.0
- for(var trait in allTraitsWanted){
- let value = allTraitsWanted[trait]
- // It's not simple we need to take value into account
- if(typeof value === 'object' && value !== null){
- for(var skill in value){
- oddsOfGettingWhatYouWant += Math.max((((maxValue - allTraitsWanted[trait][skill]) / maxValue) / skillName.length) / activeModifiers.length, 0)
- }
- } else {
- oddsOfGettingWhatYouWant += Math.max(((maxValue - allTraitsWanted[trait]) / maxValue) / activeModifiers.length, 0)
- }
- }
- let oddsOfFailure = Math.pow((1.0 - oddsOfGettingWhatYouWant), tierOfRoll)
- let finalSuccessChance = 1 - Math.pow(oddsOfFailure, predictedNumberOfActualRolls)
- const headerOpen = '<h5 class="font-w400 font-size-sm text-center text-combat-smoke m-1 mb-2">'
- // Time to assemble the information to the user
- predictionHTML += '<h3 class="font-w600 font-size-sm text-center text-danger m-1 mb-2">Corruption Prediction</h3>' +
- headerOpen + 'Predicted rolls accounting for gold and item loss: <span class="font-w600 text-warning">' + predictedNumberOfActualRolls + '</span></h5>' +
- headerOpen + 'Chance of success in those rolls: ' + CyrogemRollChanceColor(finalSuccessChance) + '</h5>' +
- headerOpen + 'Predicted Max Cost: <img src="assets/media/main/coins.svg" class="skill-icon-xs mr-2">' + (costPerRoll * predictedNumberOfActualRolls) + '</h5>' +
- headerOpen + '50% success rate achieved at: <span class="font-w600 text-warning">' + CyrogemRollsForFiftyPercent(oddsOfFailure) + '</h5>'
- //document.getElementById('cyrogem-predictive-display').insertAdjacentHTML('beforeend', predictionHTML)
- document.getElementById('cyrogem-predictive-display').innerHTML = predictionHTML
- }
- /**
- * Calculates how many rolls are required to get a 50% chance or better of success
- * @param {*} failChancePerRoll Odds of not getting what you want every roll
- * @returns Roll count and closing span tag
- */
- function CyrogemRollsForFiftyPercent(failChancePerRoll){
- if(failChancePerRoll < 0.0 || failChancePerRoll >= 1.0){
- return 'Never</span>';
- } else {
- let loops = 1
- let failChance = failChancePerRoll
- while (loops < 10000 && failChance > 0.5){
- loops++
- failChance = failChance * failChancePerRoll
- }
- if (failChance > 0.5){
- return 'Too Many</span>';
- } else {
- let value = loops + ' rolls</span>'
- return value;
- }
- }
- }
- /**
- * Color and format the success chance for players
- * @param {*} successChance Odds of success for all rolls
- * @returns formatted HTML
- */
- function CyrogemRollChanceColor(successChance){
- let textMod = ''
- if(successChance <= 0.33){
- textMod = 'text-danger'
- } else if (successChance <= 0.66){
- textMod = 'text-warning'
- } else {
- textMod = 'text-success'
- }
- let output = '<span class="font-w600 ' + textMod + '">' + (Math.round(successChance * 10000) / 100) + '%</span>'
- return output;
- }
- /**
- * Set the desired Trait
- * @param {*} index index of the trait from activeModifiers
- */
- function CyrogemDesiredTrait(index){
- newDesireTrait = index
- document.getElementById('cyrogem-desire-display-span').textContent = activeModifiers[newDesireTrait]
- // Does this target specific skills
- //console.log(newDesireTrait)
- if (skillSpecificModifiers.includes(newDesireTrait)){
- console.log('more info needed')
- document.getElementById('cyrogem-desire-extra').className = ""
- } else {
- document.getElementById('cyrogem-desire-extra').className = "d-none"
- }
- }
- /**
- * Set the desired Skill
- * @param {*} index index of the skill from skillName
- */
- function CyrogemDesiredSkill(index){
- //console.log(index)
- newDesireSkill = index
- document.getElementById('cyrogem-desire-extra-span').textContent = skillName[newDesireSkill]
- }
- /**
- * Set the desired value to the input field value
- */
- function CyrogemDesiredValue(){
- const valueHTML = document.getElementById('cyrogem-desire-value')
- newDesireValue = valueHTML.value
- document.getElementById('cyrogem-desire-display-value').textContent = newDesireValue
- }
- /**
- * Set the desired tries to the input field value
- */
- function CyrogemDesiredTries(){
- const valueHTML = document.getElementById('cyrogem-iterations')
- iterations = valueHTML.value
- document.getElementById('cyrogem-iterations-display').textContent = iterations
- CyrogemUpdatePrediction()
- }
- /**
- * Choose an equipment slot to roll for
- * @param {*} slot index of slot
- */
- function CyrogemSelectSlot(slot){
- newDesireSlot = slot
- let slotName = 'Slot'
- switch(slot){
- case 0: slotName = 'Helmet'; break;
- case 1: slotName = 'Body'; break;
- case 2: slotName = 'Legs'; break;
- case 3: slotName = 'Boots'; break;
- case 4: slotName = 'Weapon'; break;
- case 5: slotName = 'Shield'; break;
- case 6: slotName = 'Amulet'; break;
- case 7: slotName = 'Ring'; break;
- case 8: slotName = 'Gloves'; break;
- case 9: slotName = 'Quiver'; break;
- case 10: slotName = 'Cape'; break;
- }
- document.getElementById('cyrogem-desire-slot-span').textContent = slotName
- CyrogemUpdatePrediction()
- }
- function CyrogemSkipModifierInDesireList(modifier) {
- if (modifier.includes('aprilFools')) {
- return true;
- }
- let decreaseGood = false;
- if (modifier.includes('PlayerAttackSpeed') || modifier.includes('MonsterRespawnTimer') || modifier.includes('SkillInterval')) {
- decreaseGood = true;
- };
- if (decreaseGood) {
- return modifier.includes('increase');
- } else {
- return modifier.includes('decrease');
- }
- }
- /**
- * Load the tool, setup references, inject HTML
- */
- function CyrogemLoadCorruptionHelper () {
- let bannedModifiers = ["golbinRaidWaveSkipCostReduction", "golbinRaidIncreasedMinimumFood", "golbinRaidIncreasedMaximumAmmo", "golbinRaidIncreasedMaximumRunes", "golbinRaidPrayerUnlocked", "golbinRaidIncreasedPrayerLevel", "golbinRaidIncreasedPrayerPointsStart", "golbinRaidIncreasedPrayerPointsWave", "golbinRaidPassiveSlotUnlocked", "golbinRaidIncreasedStartingRuneCount", "golbinRaidStartingWeapon", "freeBonfires", "autoSlayerUnlocked", "increasedEquipmentSets", "dungeonEquipmentSwapping", "increasedTreeCutLimit", "increasedAttackRolls", "decreasedAttackRolls", "increasedBankSpaceShop", "decreasedBankSpaceShop", "increasedGPFromSales", "decreasedGPFromSales", ];
- activeModifiers = [];
- for (let i = 0; i < Object.keys(playerModifiersTemplate).length; i++) {
- if (!bannedModifiers.includes(Object.keys(playerModifiersTemplate)[i]))
- activeModifiers.push(Object.keys(playerModifiersTemplate)[i]);
- }
- // Setup the entire block
- let playerDesiresHTML =
- '<div class="block block-rounded block-link-pop border-top border-info border-4x row no-gutters">'
- // First Column
- playerDesiresHTML +=
- '<div class="col-sm-6 col-lg-4"><div class=block-content>'
- // Setup Desire Dropdown
- playerDesiresHTML +=
- '<div class="dropdown"><button type="button" class="btn btn-secondary dropdown-toggle mt-2" id="cyrogem-desire-dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Desired Attribute</button>' +
- '<div class="dropdown-menu font-size-sm" aria-labelledby="cyrogem-desire-dropdown" style="max-height: 800px; overflow-y: scroll;">'
- for (let i = 0; i < activeModifiers.length; i++){
- if (CyrogemSkipModifierInDesireList(activeModifiers[i])) continue;
- playerDesiresHTML += '<a class="dropdown-item" id="cyrogemDesiredTrait' + i + '" style="text-transform: capitalize;">' + activeModifiers[i] + '</a>'
- }
- playerDesiresHTML += '</div></div>' +
- '<span class="font-w400 font-size-sm text-combat-smoke ml-2">Desire: <span id="cyrogem-desire-display-span" style="text-transform: capitalize;">Select One</span></span>'
- // Oh god we have to add another check for specific skill ones like "increasedSmithingMasteryXP"
- playerDesiresHTML +=
- '<div class="d-none" id="cyrogem-desire-extra">' +
- // We need a new dropdown for all the skills
- '<div class="dropdown"><button type="button" class="btn btn-secondary dropdown-toggle mt-2" id="cyrogem-desire-extra-dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Skill</button>' +
- '<div class="dropdown-menu font-size-sm" aria-labelledby="cyrogem-desire-extra-dropdown">'
- for (let i = 0; i < skillName.length; i++){
- playerDesiresHTML += '<a class="dropdown-item" id="cyrogemDesiredSkill' + i + '" style="text-transform: capitalize;">' + skillName[i] + '</a>'
- }
- playerDesiresHTML += '</div></div>' +
- '<span class="font-w400 font-size-sm text-combat-smoke ml-2">Target Skill: <span id="cyrogem-desire-extra-span" style="text-transform: capitalize;">Select One</span></span>' +
- '</div>'
- // What value do you want
- playerDesiresHTML += '<div class="col-12"><input type="number" class="form-control m-1" id="cyrogem-desire-value" placeholder="0"></div>' +
- '<span class="font-w400 font-size-sm text-combat-smoke ml-2">Minimum Level: <span id="cyrogem-desire-display-value">Enter above</span></span>'
- // What slot are we changing
- playerDesiresHTML +=
- '<div class="col-12"><button type="button" class="swal2-confirm swal2-styled" id="cyrogem-add-desire" aria-label="" style="display: inline-block; border-left-color: rgb(48, 133, 214); border-right-color: rgb(48, 133, 214);">Add Desire</button></div>'
- // Close the content block and column div
- playerDesiresHTML += '</div></div>'
- // Second column
- playerDesiresHTML += '<div class="col-sm-3"><div class=block-content>' +
- '<div class="col-12"><input type="number" class="form-control m-1" id="cyrogem-iterations" placeholder="0"></div>' +
- '<span class="font-w400 font-size-sm text-combat-smoke ml-2">Try how many times<br>(Assuming you can afford it): <span id="cyrogem-iterations-display">0</span></span>'
- playerDesiresHTML += '<div class="dropdown"><button type="button" class="btn btn-secondary dropdown-toggle mt-2" id="cyrogem-slot-dropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" onclick="">' +
- 'Slot to Roll For</button><div class="dropdown-menu font-size-sm" aria-labelledby="cyrogem-slot-dropdown">' +
- '<a class="dropdown-item" id="cyrogemSelectSlot0">Helmet</a>' +
- '<a class="dropdown-item" id="cyrogemSelectSlot1">Body</a>' +
- '<a class="dropdown-item" id="cyrogemSelectSlot2">Legs</a>' +
- '<a class="dropdown-item" id="cyrogemSelectSlot3">Boots</a>' +
- '<a class="dropdown-item" id="cyrogemSelectSlot4">Weapon</a>' +
- '<a class="dropdown-item" id="cyrogemSelectSlot5">Shield</a>' +
- '<a class="dropdown-item" id="cyrogemSelectSlot6">Amulet</a>' +
- '<a class="dropdown-item" id="cyrogemSelectSlot7">Ring</a>' +
- '<a class="dropdown-item" id="cyrogemSelectSlot8">Gloves</a>' +
- '<a class="dropdown-item" id="cyrogemSelectSlot9">Quiver</a>' +
- '<a class="dropdown-item" id="cyrogemSelectSlot10">Cape</a>' +
- '</div></div>'+
- '<span class="font-w400 font-size-sm text-combat-smoke ml-2">Slot: <span id="cyrogem-desire-slot-span">Select One</span></span>'
- // Close the block and column div
- playerDesiresHTML += '</div></div>'
- // Third column
- playerDesiresHTML += '<div class="col-md-5"><div class=block-content>'
- // Display current wishes
- playerDesiresHTML += '<h5 class="font-w700 font-size-sm text-center text-success m-1 mb-2">Desired Mods, Must have one, select any mod to remove it</h5>' +
- '<div class="text-center" id="cyrogem-current-desires"></div>'
- // Close the block and column div
- playerDesiresHTML += '</div></div>'
- // NEW ROW
- playerDesiresHTML += '<div class="col-12"><div class="block-content text-center">'
- // Display aggregate info
- playerDesiresHTML += '<div class="col-md-10" id="cyrogem-predictive-display"></div>' +
- '<div class="col-md-2">' + // Button to roll
- '<button type="button" class="swal2-confirm swal2-styled" id="cyrogem-roll-button" aria-label="" style="display: inline-block; border-left-color: rgb(48, 133, 214); border-right-color: rgb(48, 133, 214);">Roll For It</button></div>'
- // Close the column, row, and box div
- playerDesiresHTML += '</div></div></div>'
- //document.getElementById('aprilfools2021-container').insertAdjacentHTML('afterbegin', playerDesiresHTML)
- playerDesiresHTML += document.getElementById('aprilfools2021-container').innerHTML
- document.getElementById('aprilfools2021-container').innerHTML = playerDesiresHTML
- // Setup trait links
- for(let i = 0; i < activeModifiers.length; i++){
- //console.log(i)
- let option = document.getElementById('cyrogemDesiredTrait' + i)
- if(option !== null){
- option.addEventListener("click", () => CyrogemDesiredTrait(i))
- }
- }
- // Setup skill links
- for(let i = 0; i < skillName.length; i++){
- let option = document.getElementById('cyrogemDesiredSkill' + i)
- if(option !== null){
- option.addEventListener("click", () => CyrogemDesiredSkill(i))
- }
- }
- // Setup slot links
- for(let i = 0; i <= 10; i++){
- //console.log(i)
- document.getElementById('cyrogemSelectSlot' + i).addEventListener("click", () => CyrogemSelectSlot(i))
- }
- // Setup value link
- document.getElementById('cyrogem-desire-value').addEventListener("input", () => CyrogemDesiredValue())
- document.getElementById('cyrogem-desire-value').addEventListener("change", () => CyrogemDesiredValue())
- // Setup quantity link
- document.getElementById('cyrogem-iterations').addEventListener("input", () => CyrogemDesiredTries())
- // Setup roll button
- document.getElementById('cyrogem-roll-button').addEventListener("click", () => CyrogemRollCorruption())
- // Setup desire button
- document.getElementById('cyrogem-add-desire').addEventListener("click", () => CyrogemAddDesire())
- CyrogemUpdatePrediction()
- }
- /**
- * Inject after page loads
- */
- (function () {
- function loadScript() {
- //console.log(window.isLoaded + ' ' + !window.currentlyCatchingUp);// + ' ' + (typeof unsafeWindow !== 'undefined') ? ' ' + unsafeWindow.isLoaded + ' ' + !unsafeWindow.currentlyCatchingUp : '')
- if ((window.isLoaded && !window.currentlyCatchingUp)
- || (typeof unsafeWindow !== 'undefined' && unsafeWindow.isLoaded && !unsafeWindow.currentlyCatchingUp)) {
- // Only load script after game has opened
- clearInterval(scriptLoader);
- document.body.insertAdjacentHTML('beforeend', '<template id="cyrogem-button-template"><button class="btn btn-dark m-1" aria-label="">Button</button></template>')
- CyrogemLoadCorruptionHelper();
- }
- }
- const scriptLoader = setInterval(loadScript, 200);
- })();
- // Melvor backend code copied for quick reference
- /*
- function rollRandomModifiers(count=3, key, equipmentSlot=0) {
- if (key === "equipment") {
- if (randomModifiers.equipment[equipmentSlot] === undefined)
- randomModifiers.equipment[equipmentSlot] = {};
- deleteKeysFromObject(randomModifiers.equipment[equipmentSlot]);
- }
- let bannedModifiers = ["golbinRaidWaveSkipCostReduction", "golbinRaidIncreasedMinimumFood", "golbinRaidIncreasedMaximumAmmo", "golbinRaidIncreasedMaximumRunes", "golbinRaidPrayerUnlocked", "golbinRaidIncreasedPrayerLevel", "golbinRaidIncreasedPrayerPointsStart", "golbinRaidIncreasedPrayerPointsWave", "golbinRaidPassiveSlotUnlocked", "golbinRaidIncreasedStartingRuneCount", "golbinRaidStartingWeapon", "freeBonfires", "autoSlayerUnlocked", "increasedEquipmentSets", "dungeonEquipmentSwapping", "increasedTreeCutLimit", "increasedAttackRolls", "decreasedAttackRolls", "increasedBankSpaceShop", "decreasedBankSpaceShop", "increasedGPFromSales", "decreasedGPFromSales", ];
- let activeModifiers = [];
- for (let i = 0; i < Object.keys(playerModifiersTemplate).length; i++) {
- if (!bannedModifiers.includes(Object.keys(playerModifiersTemplate)[i]))
- activeModifiers.push(Object.keys(playerModifiersTemplate)[i]);
- }
- let rng = [];
- for (let i = 0; i < count; i++) {
- let rngMod = Math.floor(Math.random() * activeModifiers.length);
- let value;
- let maxValue = getRandomModifierMaxValue(count);
- if (playerModifiersTemplate[activeModifiers[rngMod]].length)
- // ------------ value is skill index 0, value index 1 ----------------------------------------------------------------------------------------------------------------------
- value = [[Math.floor(Math.random() * 21), Math.floor(Math.random() * maxValue)]];
- else
- value = Math.floor(Math.random() * maxValue);
- if ((activeModifiers[rngMod] === "increasedMaxHitFlat" || activeModifiers[rngMod] === "increasedMaxHitpoints") && value > 10)
- value = 10;
- if ((activeModifiers[rngMod] === "decreasedMaxHitFlat" || activeModifiers[rngMod] === "decreasedMaxHitpoints") && value > 10)
- value = 10;
- rng.push({
- modifier: activeModifiers[rngMod],
- value: value
- });
- if (key === "equipment")
- randomModifiers.equipment[equipmentSlot][activeModifiers[rngMod]] = value;
- }
- return rng;
- }
- function getEquipmentCorruption2(equipmentSlot) {
- let cost = getRandomModifierCost(equipmentSlot);
- if (gp >= cost && equippedItems[equipmentSlot] > 0) {
- gp -= cost;
- updateGP();
- let tier = getRandomModifierTier(equipmentSlot);
- let chanceToDestroy = getRandomModifiersDestroyChance(tier);
- if (rollPercentage(chanceToDestroy)) {
- let qty = getItemQtyRandomModifier(equippedItems[equipmentSlot]);
- if (qty[0] > 1) {
- if (equipmentSlot === CONSTANTS.equipmentSlot.Quiver && ammo > 1) {
- ammo--;
- equipmentSets[selectedEquipmentSet].ammo--;
- updateAmmo();
- } else
- updateItemInBank(qty[1], equippedItems[equipmentSlot], -1);
- } else {
- equippedItems[equipmentSlot] = 0;
- equipmentSets[selectedEquipmentSet].equipment[equipmentSlot] = 0;
- setEquipmentSet(selectedEquipmentSet);
- }
- updateRandomModifierInfo(equipmentSlot);
- notifyPlayer(CONSTANTS.skill.Attack, "Your item was destroyed :(", "danger");
- } else {
- let mods = rollRandomModifiers(tier, "equipment", equipmentSlot);
- updateHTMLRandomMod(equipmentSlot, mods);
- }
- }
- }
- function loadCorruption() {
- for (let i = 0; i < Object.keys(randomModifiers.equipment).length; i++) {
- let html = `<h5 class="font-w600 font-size-sm mb-2">Current Modifiers:</h5>`;
- for (let j = 0; j < Object.keys(randomModifiers.equipment[Object.keys(randomModifiers.equipment)[i]]).length; j++) {
- let modifier = printPlayerModifier(Object.keys(randomModifiers.equipment[Object.keys(randomModifiers.equipment)[i]])[j], randomModifiers.equipment[Object.keys(randomModifiers.equipment)[i]][Object.keys(randomModifiers.equipment[Object.keys(randomModifiers.equipment)[i]])[j]]);
- html += `<h5 class="font-w400 font-size-sm mb-1 ${modifier[1]}">${modifier[0]}</h5>`;
- }
- $("#corruption-equipment-slot-" + Object.keys(randomModifiers.equipment)[i]).html(html);
- }
- }
- function updateHTMLRandomMod(equipmentSlot, mods) {
- let html = `<h5 class="font-w600 font-size-sm mb-2">Current Modifiers:</h5>`;
- for (let i = 0; i < mods.length; i++) {
- if (mods[i].value.length)
- modifier = printPlayerModifier(mods[i].modifier, mods[i].value[0]);
- else
- modifier = printPlayerModifier(mods[i].modifier, mods[i].value);
- html += `<h5 class="font-w400 font-size-sm mb-1 ${modifier[1]}">${modifier[0]}</h5>`;
- }
- $("#corruption-equipment-slot-" + equipmentSlot).html(html);
- updatePlayerStats();
- }
- function getRandomModifiersDestroyChance(tier) {
- let chance = 0;
- if (tier >= 4)
- chance = 10;
- else if (tier >= 3)
- chance = 20;
- else if (tier >= 2)
- chance = 30;
- else if (tier >= 1)
- chance = 40;
- return chance;
- }
- function getRandomModifierMaxValue(tier) {
- let value = 0;
- if (tier >= 4)
- value = 100;
- else if (tier >= 3)
- value = 76;
- else if (tier >= 2)
- value = 51;
- else if (tier >= 1)
- value = 31;
- return value;
- }
- function getRandomModifierCost(equipmentSlot) {
- let cost = 0;
- if (equippedItems[equipmentSlot] <= 0)
- return cost;
- cost = items[equippedItems[equipmentSlot]].sellsFor;
- return cost;
- }
- function getRandomModifierTier(equipmentSlot) {
- let tier = 0;
- if (equippedItems[equipmentSlot] <= 0)
- return tier;
- if (items[equippedItems[equipmentSlot]].sellsFor >= 400000)
- tier = 4;
- else if (items[equippedItems[equipmentSlot]].sellsFor >= 10000)
- tier = 3;
- else if (items[equippedItems[equipmentSlot]].sellsFor >= 200)
- tier = 2;
- else
- tier = 1;
- return tier;
- }
- function updateRandomModifierInfo(equipmentSlot) {
- if (equippedItems[equipmentSlot] > 0) {
- let cost = getRandomModifierCost(equipmentSlot);
- let tier = getRandomModifierTier(equipmentSlot);
- let qty = getItemQtyRandomModifier(equippedItems[equipmentSlot]);
- $("#corruption-equipment-slot-" + equipmentSlot + "-img").attr("src", items[equippedItems[equipmentSlot]].media);
- $("#corruption-equipment-slot-" + equipmentSlot + "-info").html(`Qty: ${qty[0]} | Tier: ${tier}<br>Cost: <img src="assets/media/main/coins.svg" class="skill-icon-xs mr-2">${numberWithCommas(cost)}`);
- } else {
- $("#corruption-equipment-slot-" + equipmentSlot + "-img").attr("src", "assets/media/bank/" + emptyGear[equipmentSlot] + ".svg");
- $("#corruption-equipment-slot-" + equipmentSlot + "-info").html(`Equip an item pls`);
- }
- }
- function getItemQtyRandomModifier(itemID) {
- let qty = 1;
- let bankID = getBankId(itemID);
- if (bankID >= 0)
- qty += bank[bankID].qty;
- if (items[itemID].equipmentSlot === CONSTANTS.equipmentSlot.Quiver)
- qty += ammo - 1;
- return [qty, bankID];
- }
- function deleteKeysFromObject(object) {
- Object.keys(object).forEach((el)=>{
- delete object[el];
- }
- );
- }
- */
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址