巫术放置(Idle Mancery)傻瓜式修改脚本

还不会用Override覆盖吗?不如试试傻瓜式修改脚本吧。

// ==UserScript==
// @name         巫术放置(Idle Mancery)傻瓜式修改脚本
// @version      1.0.1-Demo
// @description  还不会用Override覆盖吗?不如试试傻瓜式修改脚本吧。
// @author       DreamNya
// @match        https://gltyx.github.io/idle-mancery/
// @match        https://yx.g8hh.com/idle-mancery/
// @icon         data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEcklEQVRYhb1XTYwURRT++lX17MzSM729NS7LQVmC0YQEEgT1oAfdmGiIYSPrwcSj6M1oAiYGD3oCE36ixsQTR2/8RLkYg2gIngRN5IAShYgQQbq2t5uJuztd9crLbDL09LDD7uq71ffe+76vKz2v33gYMIIgaAohpnyiZyHEFji3QRAFAGCZW/C8q7D255z5W2vtF61WKx6E11uqIAzDrVLKdz1glyCSg5BaZuOAE8aYD9M0/WlZBqIoConokAe8JoiWNNrHiHPAUWbemyRJOrCBMAy3+lIeF0QbliNcYuRqbsx02W30GAjDcNKX8qQgaqyGeJeJLDfmpTRNz/Q1EIbhNl/KM6stXjAxmabphUWMusQjX8pj3eKW+ZJlPmGZs+WIdXovLWKCqOFLeSwMw6jHgC/lYUE00U3igP2x1tOx1mPz7fZuy3yrQ96yzl00xpw1xpy1zl20zK1O7tZ8u7071nos1nraAfu7OQXRhC/l4cWzBwCNRmN7bWjoh+JTzLfb29I0/XHxHEVRmOf5ulardRkAF8opCIJHfN//q/uND8PwsWqlcqFQi7mFhcezLDsvAaDi+/vKrtE5J7rPHeLSnxMAbrVavyzFsRgdzV0EYBzAzrIiKeWmPmIDxz04dgIYJ9VoTAmiHpeO+box5tRKDRhjThnmP4u4IBKq0Zgi+P5kWeOCMe9nWTazUgNZls0YYz4oTfr+JHnA5iJumS0RHV+p+GIQ0XHLbIu4B2wmABM9HZ53o9/sXk4kSZLC826UpCZIENV6YOfaqyXexZkXIUFUo7JaOLf2PzAwVgaTtfZOERRC1AGUNiwzxjqcd4W19g7BuStlHaOjoy+slnpfLueukCPqGZMAQM7tATDQBrREyA5Xrz7RBfLy/HRZUki5RSl1cKXqSqmDQsotZTkvz097AOpNpW4KouGyIst8LNb6TQA371N7XVOpTwTRy314/4m1HhcA2tVa7UFBtB0AcmsPGmvfg3MbiWg9ed6mWq32VjA8vLlWrY7ISoUWFhZuAXAFThnV60+uqVZfXBME+4aHhz8TRD1DrsvA0bm5uRMeAERR9JAg+lUQVS2zc8zv6CT5tKnUWUH0RKHxZKz1dIkBrxlFJ4WUU0tdjWWet8yPJklyjQAgSZJr7NwBABBEnpTyUL1e35ob80rxQ2KZj5SIA4Azzh1ZShwA2LkDSZJcA+7eCaVS6jtJ9FRH6OtY6+fDMBwBMC2EWGuMOZ9l2TcAeuY6AARB8MCaWu3ve4kb5u+11s8AMEUDADDeVOqcINoIALm1b8/MzHw8yFMBQBiGI9VKJemXt8y/x1o/ja4XumctHxkZWS+FOC2IHgYA69w5Z+2Xhvm2lHJca/0RgPn7NWCZfzPWPjc7O/tHN176x6TRaIz6vv+5JOqZYPPtdpSm6ez9GDDMX+V5/mrZflH6McqybEZrvcMa87plvl1WM0hY5tga84bWesdKlptARdEepdTlplIxgKF71A41lYqVUpdVFO0FECxX9H+LfwHGrBkj33hKQAAAAABJRU5ErkJggg==
// @grant        unsafeWindow
// @grant        GM_setValue
// @grant        GM_getValue
// @run-at       document-start
// @license      MIT
// @namespace https://greasyfork.org/users/809466
// ==/UserScript==
/* global $ */

const realWorker = unsafeWindow.Worker;

let maxAutomations = GM_getValue("maxAutomations");
let currentAutomations = GM_getValue("currentAutomations");
let customSpeed = GM_getValue("customSpeed");
let blockConsole = GM_getValue("blockConsole");

//初始化设置
if (!(maxAutomations + currentAutomations + customSpeed + blockConsole > 0)) {
    customSetting(true)
}
//设置改变后劫持Worker
if (maxAutomations + currentAutomations + customSpeed + blockConsole != 1) {
    unsafeWindow.Worker = function (path) { //new async function(){} → Uncaught TypeError: (intermediate value) is not a constructor 叹气
        if (path == './worker.js') {
            let script = hookWorker()
            if (script) {
                path = URL.createObjectURL(new Blob([script])) //辣鸡油猴无法作用到Worker线程,只能利用Blob劫持整个Worker代码了
                unsafeWindow.Worker = realWorker
            }
        }
        return new realWorker(path)
    }
}

//利用ajax下载读取worker.js
function hookWorker() {
    let scriptVersion = document.lastModified //应该是静态的吧 靠lastModified减少GET次数
    if (scriptVersion != GM_getValue("scriptVersion") || !GM_getValue('workerScript')) {
        const response = $.ajax('worker.js', { async: false }) //废物GMxhr 多亏了ajax可以同步 你问我为什么不用xhr?不会
        console.log('ajax', response)
        if (response.status == 200) {
            GM_setValue("scriptVersion", scriptVersion)
            GM_setValue("workerScript", response.responseText)
            return hookScript(response.responseText)
        } else {
            alert('脚本ajax加载错误 status:' + response.status)
            return false
        }
    } else {
        return hookScript(GM_getValue('workerScript'))
    }
}

//劫持worker.js代码
function hookScript(text) {
    //replacement相关代码部分参考934074044群-Chrome直接修改网页js方法(以巫术放置为例).pdf
    const replacement = [
        [/BasicRun\.process\(0\.1\)/, `BasicRun.process(${0.1 * customSpeed})`],
        [/hasEnough\.totalPercentage >= dT/, `hasEnough.totalPercentage >= dT / ${customSpeed}`]
    ]
    maxAutomations && replacement.push(["const maxAutomations = 1", "const maxAutomations = 1000"])
    currentAutomations && replacement.push(["return currentAutomations < 3", "return currentAutomations < 1000"])
    blockConsole && replacement.push([/console\.log\('saving: '/, "//console.log('saving: '"])

    for (let r of replacement) {
        const matchResult = text.match(r[0])
        if (matchResult == null) {
            alert('脚本匹配错误 脚本可能需要更新 match:' + r[0])
            return false
        } else {
            text = text.replace(r[0], r[1])
        }
    }
    return text
}

//添加设置按钮 #摆烂 要什么MutationObserver
let timer = setInterval(() => {
    if ($('.menu').length == 2) {
        clearInterval(timer)
        $('<div style="line-height: 40px;">脚本设置</div>').prependTo($('.menu:first')).on('click', () => { customSetting() })
    }
}, 100)

//自定义设置 #摆烂 要什么UI
function customSetting(init) {
    maxAutomations = confirm('解除自动化插槽数量限制?')
    currentAutomations = confirm('解除自动化插槽效率衰减限制?')
    do {
        let input = prompt('自定义倍速(仅限正数)', (customSpeed || 1))
        if (isNaN(Number(input)) == false && Number(input) > 0) {
            customSpeed = input * 1
            break
        }
    } while (!customSpeed);
    blockConsole = confirm('屏蔽控制台存储变量?')

    GM_setValue("maxAutomations", maxAutomations)
    GM_setValue("currentAutomations", currentAutomations)
    GM_setValue("customSpeed", customSpeed)
    GM_setValue("blockConsole", blockConsole)
    !init && alert('刷新游戏后生效')
}