【AutoJs】[王者]一键换装源码
苍弈Cy
2022年02月09日 02:18

/*

 * By:ClanK(965387139)

 * 设备型号 Redmi K40 Gaming

 * 安卓版本 11

 * MIUI版本 12.5.3

 * 分辨率   2400*1080

 * 开发版本 AutoJsPro 8.8.20

 * 可以使用 AutoJs 4.1.1 参考开发思路,部分代码不兼容

 *

 * 综合图色助手  https://gitee.com/yiszza/ScriptGraphicHelper

 * AutoJsPro文档 http://docs.autojs.org/#/

 */

/*

 * ⚠️ 尽量不设置商店透明度 会影响图色识别

 * ⚠️ MIUI需要将游戏从[游戏加速]里面移除并重启

 */

// 连接多了点 速度有点慢

// 不管了 截图获取手机画面

// 先获取 出装 ,也就是商店进入图标

// 获取颜色必须记住一点 就是在需要的时候颜色不会变化 尽量不要有透明度 或者背景不会变化

// 这里获取颜色后点击生成 然后赋值

// 复制后需要将 "autojs&#​34; 删除 这个没有作用

// 颜色抓取记得观察鼠标选中的颜色范围 如果周围颜色差别不大 显示的是绿色 其次是黄色 如果是红色最好是再找其他点

// 这里抓取坐标范围 关闭商店的位置需要在设置按钮下面 防止速度过快点开设置

// 抓取范围记得只能小不能大 把红框限制在能点击的地方

/* 停止所有脚本功能打包后启用 未打包可以在设置里面关闭 */

$settings.setEnabled('stop_all_on_volume_up&#​39;, true);         // 屏蔽 音量+ 停止所有脚本功能

events.setKeyInterceptionEnabled("volume_up&#​34;, true);         // 屏蔽 音量+ 调整音量功能

events.setKeyInterceptionEnabled("volume_down&#​34;, true);       // 屏蔽 音量- 调整音量功能

events.observeKey();  // 启用音量监听

events.onKeyDown("volume_up&#​34;, function (event) {    // 监听 音量+ 按下

    log("音量+ 按下&#​34;);

    Replace();                                      // 替换装备

});

events.onKeyUp("volume_up&#​34;, function (event) {      // 监听 音量+ 弹起

    log("音量+ 弹起&#​34;);

});

events.onKeyDown("volume_down&#​34;, function (event) {  // 监听 音量- 按下

    log("音量- 按下&#​34;);

    if (EquipSlots < 6) {                           // 调整装备栏出售位置

        EquipSlots += 1;

    } else {

        EquipSlots = 1;

    };

    /*

    if (EquipGrid < ReplaceList.length) {           // 调整替换装备顺序

        EquipGrid += 1;

    } else {

        EquipGrid = 1;

    };

    */

});

events.onKeyUp("volume_down&#​34;, function (event) {    // 监听 音量- 弹起

    log("音量- 弹起&#​34;);

});

let colorList = {

    "出装&#​34;: [2234,36,"#​d4aa68",[[2,6,&#​34;#e2b872&#​34;],[-23,-3,"#​e0af6d"],[-23,9,&#​34;#f0c77c&#​34;],[1,101,"#​33aff9"],[-8,110,&#​34;#3eb3f5&#​34;],[-10,192,"#​c4dced"],[-14,212,&#​34;#d8e9f9&#​34;],[-14,290,"#​2dc21d"],[-5,297,&#​34;#2bc81a&#​34;]]],

    "商店&#​34;: [2045,91,"#​cfe7fe",[[-7,-13,&#​34;#badbfd&#​34;],[18,15,"#​f0f8ff"],[21,-17,&#​34;#b2d8ff&#​34;],[-9,17,"#​f1f9ff"],[-1778,20,&#​34;#dcab69&#​34;],[-1753,24,"#​dbb06e"]]],

    "预购&#​34;: [1902,844,"#​33659e",[[16,30,&#​34;#3f81ba&#​34;],[158,1,"#​33659e"],[196,23,&#​34;#3c76b0&#​34;],[-21,98,"#​434240"],[-6,120,&#​34;#4f4e4b&#​34;],[193,93,"#​41403e"],[210,117,&#​34;#4d4c49&#​34;],[149,-750,"#​d8e9ff"],[160,-739,&#​34;#edf6fe&#​34;]]],

    "出售&#​34;: [1897,844,"#​33659e",[[-1,29,&#​34;#3e7ab2&#​34;],[192,3,"#​3668a1"],[193,28,&#​34;#3b7daf&#​34;],[213,13,"#​3a6ca6"],[150,-753,&#​34;#cfe7fe&#​34;],[168,-739,"#​edf6fe"]]],

    "购买&#​34;: [1882,933,"#​917047",[[15,33,&#​34;#b29157&#​34;],[207,8,"#​967544"],[217,31,&#​34;#b29157&#​34;],[22,-83,"#​3668a1"],[174,-81,&#​34;#3668a1&#​34;],[217,-62,"#​3e78b2"],[21,-60,&#​34;#3d7ab2&#​34;]]],

};

let rangeList = {

    "主动释放&#​34;: [2085,395,2141,445],

    "打开商店&#​34;: [2205,24,2242,54],

    "关闭商店&#​34;: [2028,101,2078,118],

    "出售&#​34;:  [1861,833,2130,885],

    "购买&#​34;:  [1858,927,2134,981],

    "装备栏1&#​34;:  [818,923,888,974],

    "装备栏2&#​34;: [983,921,1044,973],

    "装备栏3&#​34;: [1150,920,1206,980],

    "装备栏4&#​34;: [1301,922,1374,975],

    "装备栏5&#​34;: [1466,924,1527,973],

    "装备栏6&#​34;: [1635,917,1685,970],

    "攻击&#​34;:  [313,308,382,346],

    "法术&#​34;: [310,415,388,460],

    "防御&#​34;:  [308,524,381,569],

    "移动&#​34;: [311,636,384,677],

    "打野&#​34;: [313,741,380,780],

    "游走&#​34;: [308,848,383,894],

    "名刀&#​34;:  [1586,280,1638,338],

    "复活甲&#​34;:  [1585,574,1642,630],

    "血魔&#​34;: [882,431,935,490],

    "炽热&#​34;: [877,440,938,484],

    "辉月&#​34;: [736,438,800,483],

    "救赎&#​34;: [1021,418,1073,475],

};

let EquipSlots = 1;                        // 出售装备位置

let EquipGrid = 1;                         // 替换装备位置

let ReplaceList = ["名刀&#​34;, "复活甲&#​34;];      // 替换装备顺序列表

function ScreenCapture() {    // 截图权限

    let AllowThreads = threads.start(function () { // 点击允许

        if (auto.service != null) {

            for (let i = 60; i >= 0; i--) {

                try {

                    let Allow = isAllow();

                    if (Allow) {

                        Allow.click();

                    };

                } catch (error) {

                    console.error(error);

                };

                sleep(1000);

            };

        };

        function isAllow() {

            return textMatches(/(允许|立即开始|同意)/).findOnce();

        };

    });

    if (!requestScreenCapture(true)) { // 请求 截图权限

        console.error("获取失败&#​34;);

        return false;

    } else {

        console.warn("获取成功&#​34;);

        AllowThreads.interrupt();      // 关闭 自动允许

        return true;

    };

};

function StopOtherEngine() {  // 关闭其他脚本

    let AllEngine = engines.all();

    let MyEngine = engines.myEngine();

    let EngineLen = AllEngine.length;

    for (let i = 0; i < EngineLen; i++) {

        let DelEngine = AllEngine.pop();

        if (DelEngine != MyEngine) {

            console.info('STOP:&#​39;, DelEngine.id);

            DelEngine.forceStop();

        } else {

            console.info('THIS:&#​39;, DelEngine.id);

        };

    };

};

function cmpColor(img, item) {

    try {

        return images.detectsMultiColors(img, item[0], item[1], item[2], item[3]);

    } catch (error) {

        console.error("cmpColor_Error:&#​34;, error);

    };

    return false;

};

function rangeClick(range) {

    try {

        let X = random(range[0], range[2]);

        let Y = random(range[1], range[3]);

        let Duration = random(5, 10);

        return press(X, Y, Duration);

    } catch (error) {

        console.error("rangeClick_Error:&#​34;, error);

    };

    return false;

};

function Replace() {

    threads.shutDownAll();                     // 关闭所有线程 防止多余线程干扰执行

    threads.start(function () {                // 启动换装线程

        let StartTime = Date.now();            // 换装线程启动时间

        let Process = 0;                       // 换装线程进度

        let Duration = 3000;                   // 换装线程最长持续时间 超出这个时间会退出执行

        while (StartTime + Duration > Date.now()) {

            let img = captureScreen();         // 截取屏幕 用于识别运行进程

            if (Process == 0) {

                if (cmpColor(img, colorList["商店&#​34;])) {              // 商店已经打开

                    if (cmpColor(img, colorList["出售&#​34;]) && !cmpColor(img, colorList["购买&#​34;]) && !cmpColor(img, colorList["预购&#​34;])) {

                        console.warn("装备栏已选中&#​34;);

                        Process = 1;

                    } else if (EquipSlots == 1) {                    // 选择出售装备位置

                        rangeClick(rangeList["装备栏1&#​34;]);

                    } else if (EquipSlots == 2) {

                        rangeClick(rangeList["装备栏2&#​34;]);

                    } else if (EquipSlots == 3) {

                        rangeClick(rangeList["装备栏3&#​34;]);

                    } else if (EquipSlots == 4) {

                        rangeClick(rangeList["装备栏4&#​34;]);

                    } else if (EquipSlots == 5) {

                        rangeClick(rangeList["装备栏5&#​34;]);

                    } else if (EquipSlots == 6) {

                        rangeClick(rangeList["装备栏6&#​34;]);

                        /* ... */

                    };

                } else {                                             // 商店还没打开

                    console.warn("打开商店&#​34;);

                    rangeClick(rangeList["打开商店&#​34;]);               // 打开商店

                };

            } else if (Process == 1) {

                if (cmpColor(img, colorList["商店&#​34;])) {              // 商店已经打开

                    if (cmpColor(img, colorList["出售&#​34;]) && !cmpColor(img, colorList["购买&#​34;]) && !cmpColor(img, colorList["预购&#​34;])) {

                        console.warn("出售装备&#​34;);

                        rangeClick(rangeList["出售&#​34;]);               // 出售装备

                    } else {                                         // 已经出售

                        console.warn("装备已出售&#​34;);

                        Process = 2;

                    };

                } else {                                             // 商店还没打开

                    console.warn("打开商店&#​34;);

                    rangeClick(rangeList["打开商店&#​34;]);               // 打开商店

                };

            } else if (Process == 2) {

                if (cmpColor(img, colorList["商店&#​34;])) {              // 商店已经打开

                    if (cmpColor(img, colorList["购买&#​34;])) {          // 已经选择购买装备

                        console.warn("购买装备已选中&#​34;);

                        Process = 3;

                    } else if (cmpColor(img, colorList["预购&#​34;])) {   // 金币不足

                        toast("金币不足&#​34;);

                        console.error("金币不足&#​34;);

                        Process = 4;

                    } else if (ReplaceList[EquipGrid - 1] == "名刀&#​34;) {

                        console.warn("选中[名刀]&#​34;);

                        rangeClick(rangeList["攻击&#​34;]);               // 购买装备类型

                        sleep(50);

                        rangeClick(rangeList["名刀&#​34;]);               // 购买装备位置

                    } else if (ReplaceList[EquipGrid - 1] == "复活甲&#​34;) {

                        console.warn("选中[复活甲]&#​34;);

                        rangeClick(rangeList["防御&#​34;]);               // 购买装备类型

                        sleep(50);

                        rangeClick(rangeList["复活甲&#​34;]);             // 购买装备位置

                    } else if (ReplaceList[EquipGrid - 1] == "血魔&#​34;) {

                        console.warn("选中[血魔]&#​34;);

                        rangeClick(rangeList["防御&#​34;]);               // 购买装备类型

                        sleep(50);

                        rangeClick(rangeList["血魔&#​34;]);               // 购买装备位置

                    } else if (ReplaceList[EquipGrid - 1] == "炽热&#​34;) {

                        console.warn("选中[炽热]&#​34;);

                        rangeClick(rangeList["法术&#​34;]);               // 购买装备类型

                        sleep(50);

                        rangeClick(rangeList["炽热&#​34;]);               // 购买装备位置

                    } else if (ReplaceList[EquipGrid - 1] == "辉月&#​34;) {

                        console.warn("选中[辉月]&#​34;);

                        rangeClick(rangeList["法术&#​34;]);               // 购买装备类型

                        sleep(50);

                        rangeClick(rangeList["辉月&#​34;]);               // 购买装备位置

                    } else if (ReplaceList[EquipGrid - 1] == "救赎&#​34;) {

                        console.warn("选中[救赎]&#​34;);

                        rangeClick(rangeList["游走&#​34;]);               // 购买装备类型

                        sleep(50);

                        rangeClick(rangeList["救赎&#​34;]);               // 购买装备位置

                    };

                } else {                                             // 商店还没打开

                    console.warn("打开商店&#​34;);

                    rangeClick(rangeList["打开商店&#​34;]);               // 打开商店

                };

            } else if (Process == 3) {

                if (cmpColor(img, colorList["商店&#​34;])) {              // 商店已经打开

                    if (cmpColor(img, colorList["购买&#​34;])) {          // 购买装备

                        console.warn("购买装备&#​34;);

                        rangeClick(rangeList["购买&#​34;]);               // 购买装备

                    } else {                                         // 已经购买

                        console.warn("已经购买&#​34;);

                        Process = 4;

                    };

                } else {                                             // 商店还没打开

                    console.warn("打开商店&#​34;);

                    rangeClick(rangeList["打开商店&#​34;]);               // 打开商店

                };

            } else if (Process == 4) {

                if (cmpColor(img, colorList["商店&#​34;])) {              // 商店已经打开

                    console.warn("关闭商店&#​34;);

                    rangeClick(rangeList["关闭商店&#​34;]);               // 关闭商店

                } else {                                             // 换装完成

                    toast("换装完成&#​34;);

                    console.warn("换装完成&#​34;);

                    if (ReplaceList[EquipFrid-1] == "血魔&#​34; || ReplaceList[EquipFrid-1] == "炽热&#​34; || ReplaceList[EquipFrid-1] == "救赎&#​34;) {

                        sleep(100)

                        toast("释放装备主动技能&#​34;)

                        console.warn("释放装备主动技能&#​34;);

                        rangeClick(rangeList["主动释放&#​34;]);               // 主动释放

                    }

                    break;

                };

            };

        };

        console.warn("换装用时[&#​34; + String(Date.now() - StartTime) + "]ms&#​34;);

        console.log(EquipGrid, ReplaceList.length);

        if (EquipGrid < ReplaceList.length) {           // 调整替换装备顺序

            EquipGrid += 1;

        } else {

            EquipGrid = 1;

        };

    });

};

setTimeout(() => {

    ScreenCapture();         // 获取 截图权限

    StopOtherEngine();       // 关闭 其他脚本

    if ($settings.isEnabled('foreground_service&#​39;) == false) { // 前台服务 未启动

        $settings.setEnabled('foreground_service&#​39;, false);    // 前台服务 开启

    };

}, 500);

events.on("exit&#​34;, function () {

    try {

        if ($settings.isEnabled('foreground_service&#​39;) == true) { // 前台服务 已启动

            $settings.setEnabled('foreground_service&#​39;, false);   // 前台服务 关闭

        };

    } catch (error) {

        console.error('Exit:&#​39;, error);

    };

    $debug.gc();

    console.warn('结束运行&#​39;);

});