Greasy Fork

来自缓存

Greasy Fork is available in English.

NGA ui-崩铁罗盘求解器

一个基于nga-ui的罗盘求解器

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         NGA ui-崩铁罗盘求解器
// @namespace    http://greasyfork.icu/users/994825
// @version      1.0
// @description  一个基于nga-ui的罗盘求解器
// @author       InfSeinP
// @match        *://nga.178.com/*
// @match        *://ngabbs.com/*
// @match        *://bbs.nga.cn/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Init common
    const page = typeof unsafeWindow == 'undefined' ? window : unsafeWindow;
    const $ = page.$;
    const _$ = page._$;
    const commonui = page.commonui;
    if (!commonui) { return; }

    // Core functions
    const _getN = (moon) => {
        return moon===4 ? 3 : 6/moon;
    }
    const _getM = (startRotate, moon, isAdd) => {
        for (let i = 0; i < 15; i++) {
            const curr = startRotate + (isAdd ? 1 : -1) * moon * 60 * i;
            if (curr % 360 === 0) { return i; }
        }
        return -1;
    }
    const _solve = (N1,N2,N3,M1,M2,M3) => {
        let x = 0;
        let y = 0;
        let z = 0;
        while (x <= 10 && y <= 10 && z <= 10) {
            if ((x + y) % N1 == M1) {
                if ((x + z) % N2 == M2) {
                    if ((y + z) % N3 == M3) {
                        return [x,y,z];
                    }
                }
            }
            z++;
            if (z > 10) {
                z = 0;
                y++;
            }
            if (y > 10) {
                y = 0;
                x++;
            }
        }
        return [];
    }

    // Add ui-entry
    commonui.mainMenu && commonui.mainMenu.addItemOnTheFly('罗盘求解器', null, () => {
        const w = commonui.createadminwindow();
        var csz, ft, bt, bs, bt1, bt2, bs1, bs2, blk;
        var xStart, xMoon, xNotAdd, yStart, yMoon, yNotAdd, zStart, zMoon, zNotAdd;
        w._.addContent(null);
        w._.addContent(
            '请观察游戏中的罗盘,填入相应的参数', _$('/br'),
            _$('/span','class','silver','innerHTML','注意: 只支持三个转动组都是2个圈一起转的罗盘!'), _$('/br'),
            _$('/table')._.add(_$('/tbody')._.add(_$('/tr')._.add(
                _$('/td','innerHTML','<strong>圈位 |</strong>','style','padding:3px;text-align:center;'),
                _$('/td','innerHTML','<strong>初始角度</strong>','style','padding:3px;text-align:center;'),
                _$('/td','innerHTML','<strong>| 亮起的月亮数</strong>','style','padding:3px;text-align:center;'),
                _$('/td','innerHTML','<strong>| 逆时针旋转</strong>','style','padding:3px;text-align:center;'),
            ))._.add(_$('/tr')._.add(
                _$('/td','innerHTML','<strong>内圈 |</strong>','style','padding:1px;text-align:center;'),
                _$('/td', xStart = _$('/input','id','csz','maxlength','3','style','width:45px;','placeholder','整数') ,'style','padding:1px;text-align:center;'),
                _$('/td', xMoon = _$('/input','id','csz','maxlength','1','style','width:50px;','placeholder','整数') ,'style','padding:1px;text-align:center;'),
                _$('/td', xNotAdd = _$('/input','type','checkbox') ,'style','padding:1px;text-align:center;'),
            ))._.add(_$('/tr')._.add(
                _$('/td','innerHTML','<strong>中圈 |</strong>','style','padding:1px;text-align:center;'),
                _$('/td', yStart = _$('/input','id','csz','maxlength','3','style','width:45px;','placeholder','整数') ,'style','padding:1px;text-align:center;'),
                _$('/td', yMoon = _$('/input','id','csz','maxlength','1','style','width:50px;','placeholder','整数') ,'style','padding:1px;text-align:center;'),
                _$('/td', yNotAdd = _$('/input','type','checkbox') ,'style','padding:1px;text-align:center;'),
            ))._.add(_$('/tr')._.add(
                _$('/td','innerHTML','<strong>外圈 |</strong>','style','padding:1px;text-align:center;'),
                _$('/td', zStart = _$('/input','id','csz','maxlength','3','style','width:45px;','placeholder','整数') ,'style','padding:1px;text-align:center;'),
                _$('/td', zMoon = _$('/input','id','csz','maxlength','1','style','width:50px;','placeholder','整数') ,'style','padding:1px;text-align:center;'),
                _$('/td', zNotAdd = _$('/input','type','checkbox') ,'style','padding:1px;text-align:center;'),
            ))),
            _$('/button','type','button','class','larger','innerHTML','确认','onclick',async () => {
                /** 获取输入数据 */
                const xS = parseInt(xStart.value); const xM = parseInt(xMoon.value); const xN = xNotAdd.checked;
                const yS = parseInt(yStart.value); const yM = parseInt(yMoon.value); const yN = yNotAdd.checked;
                const zS = parseInt(zStart.value); const zM = parseInt(zMoon.value); const zN = zNotAdd.checked;
                /** 检查输入数据的合法性 */
                let invalid = false; const errmsgs = [];
                if (xS % 60 !== 0 || yS % 60 !== 0 || zS % 60 !== 0) {
                    invalid = true; errmsgs.push('起始角度不正确:应当是60度的整数倍')
                }
                if (xM<1||xM>4 || yM<1||yM>4 || zM<1||zM>4) {
                    invalid = true; errmsgs.push('月亮数不正确:应当是1~4的整数')
                }
                if (invalid) {
                    alert('输入的数据有错误,请检查:\n' + errmsgs.join('\n'))
                    return
                }
                /** 组装公式数据 */
                const n1 = _getN(xM); const n2 = _getN(yM); const n3 = _getN(zM);
                const m1 = _getM(xS, xM, !xN); const m2 = _getM(yS, yM, !yN); const m3 = _getM(zS, zM, !zN);
                /** 对公式求解 */
                const result = _solve(n1,n2,n3,m1,m2,m3)
                if (!result || result.length < 3) {
                    alert('求解失败。')
                } else {
                    let msg = '求解成功! 请尝试这样操作:';
                    if (result[0]) { msg += `\n\t[内圈]和[中圈]一起转动${result[0]}次`}
                    if (result[1]) { msg += `\n\t[内圈]和[外圈]一起转动${result[1]}次`}
                    if (result[2]) { msg += `\n\t[中圈]和[外圈]一起转动${result[2]}次`}
                    alert(msg)
                }
            })
        );
        w._.addTitle('崩铁罗盘求解器');
        w._.show();
    });
})();