wsmud_mo_simple

基于 wsmud_funny_mobile 修改

当前为 2020-04-20 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        wsmud_mo_simple
// @namespace   mos
// @version     0.1.1.6
// @author      sq, 白三三
// @match       http://*.wsmud.com/*
// @homepage    https://greasyfork.org/zh-CN/scripts/394530-wsmud-mo-simple
// @description 基于 wsmud_funny_mobile 修改
// @run-at      document-start
// @require     https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js
// @grant       unsafeWindow
// @grant       GM_addStyle
// @grant       GM_setValue
// @grant       GM_deleteValue
// @grant       GM_getValue
// @grant       GM_setClipboard
// ==/UserScript==

(function() {
    'use strict';
    let funny = {
        version: GM_info.script.version,
        data: {},
        role: {},
        data_skill_limit: 0,
        data_login: 0,
        data_id: "12345678910",
        state: "data.state",
        data_autokill_xy: true,
        layout_left: true,
    };
    unsafeWindow.funny = funny;
    let fn = {
        send: function(message) {
            if (typeof message === "string") {
                sendmessage(message);
            } else if (message instanceof Array) {
                action(message);
                async function action(message) {
                    for (const m of message) (typeof m === "number") ? (await fn.sleep(m)) : sendmessage(m);
                }
            }
            function sendmessage(message) {
                $("#sendmessage").attr("cmd") ? $("#sendmessage").attr("cmd", message) : $(".container").append($(`<span id="sendmessage" cmd="${message}"><span>`));
                $("#sendmessage").click();
            }
        },
        sleep: function(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        },
        scroll: function(name) {
            if (name === undefined) return;
            let a = $(name)[0].scrollTop,
                b = $(name)[0].scrollHeight,
                h = Math.ceil($(name).height()); // 向上取整
                // console.log(`fn.scroll => a=${a} b=${b} h=${h}`);
            if (a < b - h) {
                let add = (b - h < 120) ? 1 : Math.ceil((b - h) / 120);
                $(name)[0].scrollTop = a + add;
                setTimeout(`fn.scroll("${name}")`, 1000/120);
            }
        },
        deepCopy: function (object) {
            let result = {};
            for (const key in object) {
                result[key] = typeof object[key] === "object" ? fn.deepCopy(object[key]) : object[key];
            }
            return result;
        },
        getTime: function() {
            let date = new Date();
            let h = parseInt(date.getHours());
            let m = parseInt(date.getMinutes());
            h = h < 10 ? `0${h}` : `${h}`;
            m = m < 10 ? `0${m}` : `${m}`;
            return `${h}:${m}`;
        },
    };
    unsafeWindow.fn = fn;
    let listener = {
        onmessage: function(message) {
            let data = message.data;
            if (/{(.*)}/.test(data)) data = (new Function(`return ${data};`))();
            if (typeof data === "string") {
                listener.extends.text.forEach(fn => fn(message));
                return;
            } else if (typeof data === "object") {
                switch (data.type) {
                    case "roles":
                        funny.data.roles = data;
                        break;
                    case "login":
                        funny.data.id = data.id;
                        break;
                    case "dialog":
                        listener.extends.dialog.forEach(fn => fn(data));
                        break;
                    case "msg":
                        funny.onmessage_fn.apply(this, arguments);
                        return;
                    case "room":
                        listener.extends.room.forEach(fn => fn(message, data));
                        return;
                    case "exits":
                        break;
                    case "item":
                        break;
                    case "items":
                        break;
                    case "itemadd":
                        listener.extends.itemadd.forEach(fn => fn(data));
                        break;
                    case "itemremove":
                        break;
                    case "actions":
                        break;
                    case "addAction":
                        break;
                    case "state":
                        funny.state = data.state;
                        listener.extends.state.forEach(fn => fn(message, data));
                        return;
                    case "perform":
                        break;
                    case "status":
                        break;
                    case "combat":
                        break;
                    case "dispfm":
                        break;
                    case "sc":
                        break;
                    case "time":
                        break;
                    case "disobj":
                        break;
                    default:
                        console.log(data);
                        break;
                }
            }
            funny.onmessage_fn.apply(this, arguments);
        },
        sendmessage: function(message) {
            funny.webSocket.send(message);
        },
        extends: {
            text: [],
            dialog: [],
            msg: [],
            room: [],
            state: [],
            itemadd: [],
        },
        addListener: function(type, fn) {
            listener.extends[type].push(fn);
        },
    };
    unsafeWindow.listener = listener;
    listener.addListener("text", function(message) {
        let data = message.data;
        if (/重新连线|欢迎登陆/.test(data)) {
            funny.data_login += 1;
            $(".content-message pre").append(`${data}\n`);
            if (funny.data_login === 1) {
                $(".content-message pre").append(`wsmud_mo_simple ${funny.version} 祝您挖矿愉快!\n`);
                getScore();
            }
            async function getScore() {
                $("[command=score]").click();
                await fn.sleep(100);
                $("[for=1]").click();
                await fn.sleep(100);
                $("[for=0]").click();
                await fn.sleep(100);
                $("[command=skills]").click();
                await fn.sleep(100);
                $("[command=pack]").click();
                await fn.sleep(100);
                $("[command=tasks]").click();
                await fn.sleep(100);
                $("[command=showcombat]").click(); // 点击动作
                await fn.sleep(100);
                $("[command=showtool]").click();   // 点击菜单
                await fn.sleep(1000);
                $(".dialog-close").click();
            };
        } else if (/你轻声吟道/.test(data)) {
        } else if (/盘膝坐下,开始治疗伤势/.test(data)) {
        } else if (/停止疗伤站了起来/.test(data)) {
        } else if (/疗伤完毕,脸色看起来好了很多/.test(data)) {
        } else if (/盘膝坐下,开始修炼内力/.test(data)) {
        } else if (/运功完毕,站了起来/.test(data)) {
        } else if (/你的最大内力增加了/.test(data)) {
            funny.onmessage_fn.apply(this, arguments);
            let a = data.match(/你的最大内力增加了(.*)点。/);
            let n = parseInt(a[1]),
              max = parseInt(funny.role.max_mp),
            limit = parseInt(funny.role.limit_mp);
            let time = (limit - max) / (n * 6); // X分钟 => X小时X分钟
            let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
            $(".remove_dzsj").remove();
            $(".content-message pre").append(`<span class="remove_dzsj">当前内力: ${max}\n上限内力: ${limit}\n需要时间: ${timeString}\n</span>`);
        } else {
            funny.onmessage_fn.apply(this, arguments);
        }
        fn.scroll(".content-message");
    });

    // tasks
    listener.addListener("dialog", function(data) {
        if (data.dialog === "tasks" && data.items) {
            let fb, qa, wd, wd1, wd2, wd3, sm1, sm2, ym1, ym2, yb1, yb2;
            data.items.forEach(item => {
                if (item.state === 2) fn.send(`taskover ${item.id}`); // 自动完成
                if (item.id === "signin") {
                    let a = item.desc.match(/师门任务:(.*),副本:<(.*)>(.*)\/20<(.*)>/);
                    let b = item.desc.match(/(.*)武道塔(.*),进度(\d+)\/(\d+)<(.*)/);
                    let c = item.desc.match(/<.+?>(.+)首席请安<.+?>/);
                    (parseInt(a[3]) < 20) ? fb = `<hig>${a[3]}</hig>` : fb = a[3];
                    if (b) {
                        (parseInt(b[3]) < parseInt(b[4])) ? wd1 = `<hig>${b[3]}</hig>` : wd1 = b[3];
                        wd2 = b[4];
                        /可以重置/.test(b[2]) ? wd3 = "<hig>可以重置</hig>" : wd3 = "已经重置";
                        wd = wd1+"/"+wd2+" "+wd3
                    }else {wd = "已设置只打塔主"}
                    if (c) {
                        /已经/.test(c[1]) ? qa = "已经请安" : qa = "<hig>尚未请安</hig>";
                    }else {qa = "武神无需请安"}
                } else if (item.id === "sm") {
                    let a = item.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? sm1 = `<hig>${a[1]}</hig>` : sm1 = a[1];
                    sm2 = a[2];
                } else if (item.id === "yamen") {
                    let a = item.desc.match(/目前完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? ym1 = `<hig>${a[1]}</hig>` : ym1 = a[1];
                    ym2 = a[2];
                } else if (item.id === "yunbiao") {
                    let a = item.desc.match(/本周完成(.*)\/20个,共连续完成(.*)个。/);
                    (parseInt(a[1]) < 20) ? yb1 = `<hig>${a[1]}</hig>` : yb1 = a[1];
                    yb2 = a[2];
                }
            });
            let html = `门派请安 => ${qa}\n武道之塔 => ${wd}\n`;
            html += `日常副本 => ${fb}/20\n师门任务 => ${sm1}/20 ${sm2}连\n`;
            html += `衙门追捕 => ${ym1}/20 ${ym2}连\n每周运镖 => ${yb1}/20 ${yb2}连\n`;
            $(".remove_tasks").remove();
            $(".content-message pre").append($(`<span class="remove_tasks"><span>`).html(html));
            fn.scroll(".content-message");
        }
    });

    // score
    listener.addListener("dialog", function(data) {
        if (data.dialog === "score") {
            for (const key in data) funny.role[key] = data[key];
        }
    });

    // skills
    listener.addListener("dialog", function(data) {
        if (data.dialog === "skills") {
            funny.skills = data.items || funny.skills || [];
            if (data.items) {
                funny.data_skill_limit = parseInt(data.limit);
            } else if (data.id && data.exp) {
                if (data.level) {
                    for (const skill of funny.skills) {
                        if (skill.id === data.id) {
                            skill.level = data.level;
                            break;
                        }
                    }
                }
                let name = "", k = 0, level = 0;
                let djsx = funny.data_skill_limit; // 上限
                let xxxl = parseInt(funny.role.study_per);   // 学习效率
                let lxxl = parseInt(funny.role.lianxi_per);  // 练习效率
                let xtwx = parseInt(funny.role.int);         // 先天悟性
                let htwx = parseInt(funny.role.int_add);     // 后天悟性
                if (funny.skills) {
                    for (const skill of funny.skills) {
                        if (skill.id === data.id) {
                            name = skill.name;
                            level = parseInt(skill.level);
                            if (/<wht>.*/.test(name)) k = 1; // 白
                            if (/<hig>.*/.test(name)) k = 2;
                            if (/<hic>.*/.test(name)) k = 3;
                            if (/<hiy>.*/.test(name)) k = 4;
                            if (/<hiz>.*/.test(name)) k = 5;
                            if (/<hio>.*/.test(name)) k = 6; // 橙
                            if (/<ord>.*/.test(name)) k = 7; // 红
                            break;
                        }
                    }
                }
                let qianneng = (djsx * djsx - level * level) * 2.5 * k;
                if (funny.state === "你正在练习技能") {
                    let time = qianneng / (xtwx + htwx) / (1 + lxxl / 100 - xtwx / 100) / 12;
                    let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
                    $(".remove_lx").remove();
                    // 练习每一跳的消耗公式=(先天悟性+后天悟性)×(1+练习效率%-先天悟性%)
                    $(".content-message pre").append(`练习${name}消耗了${parseInt(qianneng / time / 12)}点潜能。\n`);
                    $(".content-message pre").append(`<span class="remove_lx">角色悟性: ${xtwx}+${htwx}\n练习效率: ${lxxl}%\n等级上限: ${djsx}级\n需要潜能: ${qianneng}\n需要时间: ${timeString}\n</span>`);
                    fn.scroll(".content-message");
                } else if (funny.state === "你正在读书") {
                    // 学习每一跳的消耗公式=(先天悟性+后天悟性)×(1+学习效率%-先天悟性%)×3
                    let cost = (xtwx + htwx) * (1 +  xxxl / 100 - xtwx / 100) * 3;
                    $(".content-message pre").append(`学习${name}消耗了${parseInt(cost)}点潜能。\n`);
                    if (funny.data.id === "j9h729c52bc") {
                        let time = qianneng / cost / 12;
                        let timeString = time < 60 ? `${parseInt(time)}分钟` : `${parseInt(time / 60)}小时${parseInt(time % 60)}分钟`;
                        $(".content-message pre").append(`练满时间 => ${timeString}\n`);
                    }
                    fn.scroll(".content-message");
                }
            }
        }
    });
    // pack
    listener.addListener("dialog", function(data) {
        if (data.dialog === "pack") {

            if (data.can_use == 1 && /养精丹|朱果|潜灵果/.test(data.name)) {
                let count = data.count > 10 ? 10 : data.count;
                let cmd = [];
                for (let i = 0; i < count; i ++) {
                    cmd.push(`use ${data.id}`);
                    cmd.push(500);
                }
                $(".content-message pre").append(
                    $(`<div class="item-commands"></div>`).append(
                        $(`<span>快捷使用${count}次 => ${data.name}</span>`).click(() => {
                            fn.send(cmd);
                        }),
                    ),
                );
            }

            if (data.name) {
                if (/<hig>大宋(.*)<\/hig>|<hig>蒙古(.*)<\/hig>|<hig>笠子帽<\/hig>|<hic>大宋(.*)<\/hic>|<hic>蒙古(.*)<\/hic>|<hic>笠子帽<\/hic>|<hiy>大宋(.*)<\/hiy>|<hiy>蒙古(.*)<\/hiy>|<hiy>笠子帽<\/hiy>/.test(data.name)) {
                    fn.send(`fenjie ${data.id}`);
                }
            }
        }
    });

    listener.addListener("room", function(message, data) {
        if (/cmd cmd=|span cmd=/.test(data.desc)) {
            data.desc = data.desc.replace("<hig>椅子</hig>", "椅子");
            data.desc = data.desc.replace(/span/g, "cmd");//房间描述中<span>标签的命令改为<cmd>
            data.desc = data.desc.replace(/"/g, "'"); // "" => ''
            data.desc = data.desc.replace(/\((.*?)\)/g, "");//去除括号和里面的英文单词
            let a = data.desc.match(/<cmd cmd='([^']+)'>([^<]+)<\/cmd>/g);
            a.forEach(desc => data.desc = `<hic>${desc}</hic> ${data.desc}`);
            let mask = fn.deepCopy(message);
            mask.data = JSON.stringify(data);
            funny.onmessage_fn.apply(this, [mask]);
        } else {
            funny.onmessage_fn.apply(this, [message]);
        }
    });
    listener.addListener("state", function(message, data) {
        if (data.desc && data.desc.length > 0) {
            data.desc = [];
            let mask = fn.deepCopy(message);
            mask.data = JSON.stringify(data);
            funny.onmessage_fn.apply(this, [mask]);
        } else {
            funny.onmessage_fn.apply(this, [message]);
        }
    });

    /* listener.addListener("itemadd", function(data) {
        if (/蒙古兵|十夫长|百夫长|千夫长|万夫长/.test(data.name)) {
            if (data.id) fn.send(`kill ${data.id}`);
        }
    }); */



    if (WebSocket) {
        unsafeWindow.WebSocket = function(url) {
            funny.webSocket = new WebSocket(url);
        };
        unsafeWindow.WebSocket.prototype = {
            get url() {
                return funny.webSocket.url;
            },
            get protocol() {
                return funny.webSocket.protocol;
            },
            get readyState() {
                return funny.webSocket.readyState;
            },
            get bufferedAmount() {
                return funny.webSocket.bufferedAmount;
            },
            get extensions() {
                return funny.webSocket.extensions;
            },
            get binaryType() {
                return funny.webSocket.binaryType;
            },
            set binaryType(type) {
                funny.webSocket.binaryType = type;
            },
            get onerror() {
                return funny.webSocket.onerror;
            },
            set onerror(fn) {
                funny.webSocket.onerror = fn;
            },
            get onopen() {
                return funny.webSocket.onopen;
            },
            set onopen(fn) {
                funny.webSocket.onopen = fn;
            },
            get onclose() {
                return funny.webSocket.onclose;
            },
            set onclose(fn) {
                funny.webSocket.onclose = fn;
            },
            close: function () {
                funny.webSocket.close();
            },
            get onmessage() {
                return funny.webSocket.onmessage;
            },
            set onmessage(fn) {
                funny.onmessage_fn = fn;
                funny.webSocket.onmessage = listener.onmessage;
            },
            send: function (message) {
                listener.sendmessage(message);
            },
        };
    };

    $(document).ready(function() {
        //GM_addStyle(`.room_desc{overflow:hidden;white-space:nowrap;}`);
        GM_addStyle(`.content-bottom{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;}`);
    });
})();