NGA ui-崩铁罗盘求解器

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

// ==UserScript==
// @name         NGA ui-崩铁罗盘求解器
// @namespace    https://gf.qytechs.cn/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();
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址