From 9b3e8f798834cd8d3a0b0fd7fd2914bcd3ba6f57 Mon Sep 17 00:00:00 2001 From: mno <718135749@qq.com> Date: Wed, 21 Jan 2026 20:52:01 +0800 Subject: [PATCH] =?UTF-8?q?js=EF=BC=9A=E9=94=84=E5=9C=B0=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E9=BE=99=E6=9B=B4=E6=96=B0=EF=BC=8C=E6=96=B0=E5=A2=9Ejs?= =?UTF-8?q?=E8=B4=B5=E9=87=8D=E7=89=A9=E5=93=81=E8=AF=86=E5=88=AB=20(#2755?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * js:锄地一条龙 从了汐姐姐了 * js:摩拉&原石识别 * Update main.js --- repo/js/AutoHoeingOneDragon/README.md | 2 +- repo/js/AutoHoeingOneDragon/main.js | 77 +++-- repo/js/AutoHoeingOneDragon/manifest.json | 2 +- repo/js/AutoHoeingOneDragon/settings.json | 22 +- repo/js/OcrFreeMora&Primogem/README.md | 2 + .../assets/RecognitionObject/mora.png | Bin 0 -> 2414 bytes .../assets/RecognitionObject/任务.png | Bin 0 -> 2133 bytes .../assets/RecognitionObject/养成道具.png | Bin 0 -> 2966 bytes .../assets/RecognitionObject/加号.png | Bin 0 -> 405 bytes .../assets/RecognitionObject/原石.png | Bin 0 -> 1641 bytes .../assets/RecognitionObject/相遇之缘.png | Bin 0 -> 8241 bytes .../assets/RecognitionObject/纠缠之缘.png | Bin 0 -> 7974 bytes .../assets/RecognitionObject/贵重物品.png | Bin 0 -> 2676 bytes .../assets/RecognitionObject/贵重物品2.png | Bin 0 -> 2645 bytes .../assets/背包摩拉数字/0.png | Bin 0 -> 616 bytes .../assets/背包摩拉数字/1.png | Bin 0 -> 259 bytes .../assets/背包摩拉数字/2.png | Bin 0 -> 534 bytes .../assets/背包摩拉数字/3.png | Bin 0 -> 523 bytes .../assets/背包摩拉数字/4.png | Bin 0 -> 467 bytes .../assets/背包摩拉数字/5.png | Bin 0 -> 529 bytes .../assets/背包摩拉数字/6.png | Bin 0 -> 579 bytes .../assets/背包摩拉数字/7.png | Bin 0 -> 406 bytes .../assets/背包摩拉数字/8.png | Bin 0 -> 594 bytes .../assets/背包摩拉数字/9.png | Bin 0 -> 526 bytes .../assets/背包物品数字/0.png | Bin 0 -> 478 bytes .../assets/背包物品数字/1.png | Bin 0 -> 227 bytes .../assets/背包物品数字/2.png | Bin 0 -> 528 bytes .../assets/背包物品数字/3.png | Bin 0 -> 545 bytes .../assets/背包物品数字/4.png | Bin 0 -> 463 bytes .../assets/背包物品数字/5.png | Bin 0 -> 457 bytes .../assets/背包物品数字/6.png | Bin 0 -> 441 bytes .../assets/背包物品数字/7.png | Bin 0 -> 380 bytes .../assets/背包物品数字/8.png | Bin 0 -> 502 bytes .../assets/背包物品数字/9.png | Bin 0 -> 515 bytes repo/js/OcrFreeMora&Primogem/main.js | 303 ++++++++++++++++++ repo/js/OcrFreeMora&Primogem/manifest.json | 16 + repo/js/OcrFreeMora&Primogem/settings.json | 17 + 37 files changed, 399 insertions(+), 42 deletions(-) create mode 100644 repo/js/OcrFreeMora&Primogem/README.md create mode 100644 repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/mora.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/任务.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/养成道具.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/加号.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/原石.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/相遇之缘.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/纠缠之缘.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/贵重物品.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/贵重物品2.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/0.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/1.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/2.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/3.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/4.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/5.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/6.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/7.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/8.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/9.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包物品数字/0.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包物品数字/1.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包物品数字/2.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包物品数字/3.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包物品数字/4.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包物品数字/5.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包物品数字/6.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包物品数字/7.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包物品数字/8.png create mode 100644 repo/js/OcrFreeMora&Primogem/assets/背包物品数字/9.png create mode 100644 repo/js/OcrFreeMora&Primogem/main.js create mode 100644 repo/js/OcrFreeMora&Primogem/manifest.json create mode 100644 repo/js/OcrFreeMora&Primogem/settings.json diff --git a/repo/js/AutoHoeingOneDragon/README.md b/repo/js/AutoHoeingOneDragon/README.md index 600cb8092..dacd221a6 100644 --- a/repo/js/AutoHoeingOneDragon/README.md +++ b/repo/js/AutoHoeingOneDragon/README.md @@ -37,7 +37,7 @@ - - 选项 **输出地图追踪文件** ,会将选择的路线读取并分组输出到js文件夹下pathingOut文件夹 - - 选项 **强制刷新所有运行记录** ,用于清除js记录的运行历史 - **选择执行第几个路径组:** 本js支持分组运行地图追踪,分组方式详见后续选项,需要分组运行时请确保精英目标数量,小怪目标数量,各个路径组的标签等信息【完全相同】,复制配置组时未知原因无法正确复制配置,请不要使用 - - 如果你需要分组执行,请先建立和组数对应的配置组,分别添加本js,路径组一要【排除】的标签填写需要完全禁用的标签,如蕈兽,路径组二要【选择】的标签填写需要分配到路径组二的路线的标签,如小怪,不同配置组的js中选择对应的配队和路径组编号,其他配置保持默认的情况下即可实现精英和小怪分队伍和配置组锄地,更多路径组数量以此类推 + - 如果你需要分组执行,请先建立和组数对应的配置组,分别添加本js,路径组一要【排除】的标签填写需要完全禁用的标签,如蕈兽,路径组二要【选择】的标签填写需要分配到路径组二的路线的标签,如小怪,不同配置组的js中选择对应的配队和路径组编号,其他配置保持默认的情况下即可实现精英和小怪分队伍和配置组锄地,更多路径组数量以此类推,需要分组运行的可以参考b站官号视频https://www.bilibili.com/video/BV1JYGVzHEmD/?spm_id_from=333.1387.collection.video_card.click - **本路径组使用配队名称:** 填写该路径组使用的配队名称,js会自动切换 - **拾取模式:** 需要注意,沙暴路线只在模板匹配模式下可用 - - 模板匹配拾取:推荐使用,速度最快,性能消耗最低 diff --git a/repo/js/AutoHoeingOneDragon/main.js b/repo/js/AutoHoeingOneDragon/main.js index 3ba75f90e..364051260 100644 --- a/repo/js/AutoHoeingOneDragon/main.js +++ b/repo/js/AutoHoeingOneDragon/main.js @@ -1,4 +1,4 @@ -//当前js版本1.20.0 +//当前js版本1.21.0 let timeMoveUp; let timeMoveDown; @@ -78,7 +78,7 @@ let lastEatBuff = 0; disableSelfOptimization: settings.disableSelfOptimization ?? false, eEfficiencyIndex: settings.eEfficiencyIndex ?? 2.5, mEfficiencyIndex: settings.mEfficiencyIndex ?? 0.5, - splitFactor: settings.splitFactor ?? 0, + ignoreFactor: settings.ignoreFactor ?? 0, targetEliteNum: settings.targetEliteNum ?? 400, targetMonsterNum: settings.targetMonsterNum ?? 2000, priorityTags: settings.priorityTags ?? "", @@ -117,7 +117,7 @@ let lastEatBuff = 0; settings.disableSelfOptimization = cfg.disableSelfOptimization ?? false; settings.eEfficiencyIndex = cfg.eEfficiencyIndex ?? 2.5; settings.mEfficiencyIndex = cfg.mEfficiencyIndex ?? 0.5; - settings.splitFactor = cfg.splitFactor ?? 0; + settings.ignoreFactor = cfg.ignoreFactor ?? 0; settings.targetEliteNum = cfg.targetEliteNum ?? 400; settings.targetMonsterNum = cfg.targetMonsterNum ?? 2000; settings.priorityTags = cfg.priorityTags ?? ""; @@ -294,9 +294,11 @@ async function processPathings(groupTags) { const monsterInfoObject = JSON.parse(monsterInfoContent); // 读取路径文件夹中的所有文件 + log.info("开始读取路径文件"); let pathings = await readFolder("pathing", true); //加载路线cd信息 + log.info("路径文件读取完成,开始加载cd信息"); await initializeCdTime(pathings, accountName); // 定义解析 description 的函数 @@ -326,7 +328,7 @@ async function processPathings(groupTags) { return routeInfo; } let index = 0 - + log.info("cd信息加载完成,开始处理路线详细信息"); // 遍历每个路径文件并处理 for (const pathing of pathings) { index++; @@ -376,6 +378,22 @@ async function processPathings(groupTags) { } } + // ===== 根据 settings.ignoreFactor 过滤 ===== + const ignoreFactor = Number(settings.ignoreFactor); + if (Number.isInteger(ignoreFactor) && ignoreFactor > 0) { + // 新增保护标签 + const protectTags = ['精英高收益', '高危', '传奇']; + const hasProtectTag = protectTags.some(tag => pathing.tags.includes(tag)); + + if (!hasProtectTag && // 不含保护标签 + pathing.e <= ignoreFactor && // 精英数达标 + pathing.m >= 5 * pathing.e) { // 普通数足够 + // 清零 + pathing.e = 0; + pathing.mora_e = 0; + } + } + const allTags = groupTags[0]; // 已经是 [...new Set(...)] 的结果 // 2. 待匹配文本:路径名 + 描述 const textToMatch = (pathing.fullPath + " " + (description || "")); @@ -421,6 +439,7 @@ async function processPathings(groupTags) { pathing.t = avg; } } + log.info("预处理阶段完成"); return pathings; // 返回处理后的 pathings 数组 } @@ -457,6 +476,7 @@ async function markPathings(pathings, groupTags, priorityTags, excludeTags) { } async function findBestRouteGroups(pathings, k1, k2, targetEliteNum, targetMonsterNum) { + log.info("开始根据配置寻找路线组合"); /* ========== 0. 原初始化不动 ========== */ let nextTargetEliteNum = targetEliteNum; let iterationCount = 0; @@ -476,25 +496,14 @@ async function findBestRouteGroups(pathings, k1, k2, targetEliteNum, targetMonst const G1 = p.mora_e + p.mora_m, G2 = p.mora_m; p.G1 = G1; p.G2 = G2; - /* 分离系数 0-1:0 无惩罚,1 最大惩罚 95 % */ - const splitFactor = +(settings.splitFactor ?? 0); - - /* 混合度:纯血 λ=0,最混合 λ=1 */ - const λ = (p.e === 0 || p.m === 0) ? 0 - : 1 - Math.min(p.e, p.m) / Math.max(p.e, p.m); - - /* 仅 E2 惩罚,上限 95 %,线性 */ - const penalty = 1 - 0.95 * splitFactor * λ; - /* 收益 */ const eliteGain = p.e === 0 ? 200 : (G1 - G2) / p.e; const normalGain = p.m === 0 ? 40.5 : G2 / p.m; - /* 打分:E1 不惩罚,E2 带惩罚 */ p.E1 = (eliteGain ** k1) * (G1 / p.t); if (p.e === 0) p.E1 = 0; - p.E2 = (normalGain ** k2) * (G2 / p.t) * penalty; + p.E2 = (normalGain ** k2) * (G2 / p.t); maxE1 = Math.max(maxE1, p.E1); maxE2 = Math.max(maxE2, p.E2); @@ -539,18 +548,22 @@ async function findBestRouteGroups(pathings, k1, k2, targetEliteNum, targetMonst } /* ========== 2. 迭代:直到“双达标”才停 ========== */ + while (iterationCount < 100) { selectRoutesByEliteTarget(nextTargetEliteNum); selectRoutesByMonsterTarget(targetMonsterNum); - // 新收敛条件:必须同时大于等于双目标 + // 新条件:总量必须落在区间里 if (totalSelectedElites >= targetEliteNum && - totalSelectedMonsters >= targetMonsterNum) { + totalSelectedElites <= iterationCount / 20 && + totalSelectedMonsters >= targetMonsterNum && + totalSelectedMonsters <= iterationCount / 4) { break; } - // 只要没达标,就加压:把精英目标向上推 - const eliteShort = targetEliteNum - totalSelectedElites; - nextTargetEliteNum += Math.max(1, Math.round(0.1 * eliteShort)); + + // 只调精英目标:若当前选多了就降门槛,选少了就抬门槛 + const eliteGap = targetEliteNum - totalSelectedElites; + nextTargetEliteNum += Math.round(0.7 * eliteGap); // 可正可负,自动收敛 iterationCount++; } @@ -577,6 +590,7 @@ async function findBestRouteGroups(pathings, k1, k2, targetEliteNum, targetMonst const newE = totalSelectedElites - p.e; const newM = totalSelectedMonsters - p.m; if (newE >= targetEliteNum && newM >= targetMonsterNum) { + //log.info("调试-删掉了一条路线") p.selected = false; totalSelectedElites = newE; totalSelectedMonsters = newM; @@ -616,7 +630,7 @@ async function findBestRouteGroups(pathings, k1, k2, targetEliteNum, targetMonst log.info("使用原文件顺序运行"); pathings.sort((a, b) => a.index - b.index); } - + log.info("路线组合结果如下:"); log.info(`总精英怪数量: ${totalSelectedElites.toFixed(0)}`); log.info(`总普通怪数量: ${totalSelectedMonsters.toFixed(0)}`); log.info(`总收益: ${totalGainCombined.toFixed(0)} 摩拉`); @@ -725,9 +739,20 @@ async function runPath(fullPath, map_name, pm, pe) { /* ---------- 主任务 ---------- */ const pathingTask = (async () => { + let doLogMonsterCount = true; log.info(`开始执行路线: ${fullPath}`); await fakeLog(`${fullPath}`, false, true, 0); - if (settings.logMonsterCount) { + try { + await pathingScript.runFile(fullPath); + } catch (error) { + log.error(`执行地图追踪出现错误${error.message}`); + } + try { + await sleep(1); + } catch (e) { + doLogMonsterCount = false; + } + if (settings.logMonsterCount && doLogMonsterCount) { const m = Math.floor(pm); const e = Math.floor(pe); const lines = []; @@ -737,12 +762,6 @@ async function runPath(fullPath, map_name, pm, pe) { if (lines.length) log.debug(lines.join('\n')); } - - try { - await pathingScript.runFile(fullPath); - } catch (error) { - log.error(`执行地图追踪出现错误${error.message}`); - } await fakeLog(`${fullPath}`, false, false, 0); state.running = false; })(); diff --git a/repo/js/AutoHoeingOneDragon/manifest.json b/repo/js/AutoHoeingOneDragon/manifest.json index cc684017d..f3f8ac53b 100644 --- a/repo/js/AutoHoeingOneDragon/manifest.json +++ b/repo/js/AutoHoeingOneDragon/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "锄地一条龙", - "version": "1.20.10", + "version": "1.21.0", "description": "一站式解决自动化锄地,支持只拾取狗粮,请仔细阅读README.md后使用", "authors": [ { diff --git a/repo/js/AutoHoeingOneDragon/settings.json b/repo/js/AutoHoeingOneDragon/settings.json index 6dd1f0e10..93d6101ef 100644 --- a/repo/js/AutoHoeingOneDragon/settings.json +++ b/repo/js/AutoHoeingOneDragon/settings.json @@ -31,7 +31,7 @@ { "name": "partyName", "type": "input-text", - "label": "本路径组使用配队名称" + "label": "本路径组使用配队名称【注意】请只在这里填写要使用的配队,配置组中配队项留空" }, { "name": "sortMode", @@ -47,7 +47,7 @@ { "name": "pickup_Mode", "type": "select", - "label": "拾取模式", + "label": "拾取模式【注意】bgi原版拾取性能开销大,准确低,尽量不要使用", "options": [ "模板匹配拾取,拾取狗粮和怪物材料", "模板匹配拾取,只拾取狗粮", @@ -59,7 +59,7 @@ { "name": "activeDumperMode", "type": "input-text", - "label": "泥头车模式,将在接近战斗点前提前释放部分角色e技能\n需要启用时填写这些角色在队伍中的编号\n有多个角色需要释放时用【中文逗号】分隔" + "label": "泥头车模式,将在接近战斗点前提前释放部分角色e技能\n需要启用时填写这些角色在队伍中的编号\n有多个角色需要释放时用【中文逗号】分隔\n【注意】精英路线启用泥头车将有可能导致狗粮损失\n【注意】盾位角色启用泥头车将可能导致第一轮战斗后半段无护盾覆盖" }, { "name": "eatBuff", @@ -74,25 +74,25 @@ { "name": "findFInterval", "type": "input-text", - "label": "识别间隔(毫秒)\n两次检测f图标之间等待时间", + "label": "识别间隔(毫秒)\n两次检测f图标之间等待时间\n建议区间10-200", "default": "100" }, { "name": "pickupDelay", "type": "input-text", - "label": "拾取后延时(毫秒)\n观察到日志显示连续拾取相同物品时建议调大", + "label": "拾取后延时(毫秒)\n观察到日志显示连续拾取相同物品时建议调大\n建议区间32-200", "default": "50" }, { "name": "rollingDelay", "type": "input-text", - "label": "滚动后延时(毫秒)\n观察到拾取错误时建议调大", + "label": "滚动后延时(毫秒)\n观察到拾取错误时建议调大\n建议区间16-100", "default": "32" }, { "name": "timeMove", "type": "input-text", - "label": "单次滚动周期(毫秒)\n观察到上下滚动不全时建议调大", + "label": "单次滚动周期(毫秒)\n观察到上下滚动不全时建议调大\n建议区间800-2000", "default": "1000" }, { @@ -135,7 +135,7 @@ { "name": "disableSelfOptimization", "type": "checkbox", - "label": "勾选后禁用根据运行记录优化路线选择的功能\n完全使用路线原有信息" + "label": "勾选后禁用根据运行记录优化路线选择的功能\n完全使用路线原有信息\n【注意】启用该选项将导致无法根据个人运行清空自动优化路线选择" }, { "name": "eEfficiencyIndex", @@ -152,13 +152,13 @@ { "name": "curiosityFactor", "type": "input-text", - "label": "好奇系数,缺少记录的路线预期用时将被削减对应比例以更多尝试未知路线,填0-1之间的数,会导致显示的预计时间出现偏差", + "label": "好奇系数,缺少记录的路线预期用时将被削减对应比例以更多尝试未知路线,填0-1之间的数\n【注意】启用该选项将导致显示的预计用时出现偏差", "default": "0" }, { - "name": "splitFactor", + "name": "ignoreFactor", "type": "input-text", - "label": "精英小怪分离系数,填0-1数字\n越大越倾向于分离出更多的纯小怪路线\n总耗时大幅增加,但是有利于小怪路线蹭更多经验\n建议保持默认即可", + "label": "精英数量小于等于该值,且有5倍及以上精英数量的小怪的路线将被视为纯小怪路线,用于将含有极少量精英和大量小怪的路线当做小怪路线打\n【注意】启用该选项将导致总用时大幅增加", "default": "0" }, { diff --git a/repo/js/OcrFreeMora&Primogem/README.md b/repo/js/OcrFreeMora&Primogem/README.md new file mode 100644 index 000000000..c92ae70c6 --- /dev/null +++ b/repo/js/OcrFreeMora&Primogem/README.md @@ -0,0 +1,2 @@ +建议设置分辨率1080p,无滤镜等会影响画面的因素,其他情况下识别错误属于正常现象 +背包中图纸过多可能导致粉球蓝球被挤到下一页,无法识别 \ No newline at end of file diff --git a/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/mora.png b/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/mora.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5a6a3f660ba73d0e7314d193cbe4388318301b GIT binary patch literal 2414 zcmV-!36b`RP)~6P+#8s@C(x}ALummy`Lx351rn>@&Ia z+N3g>6gO9!CjGEU&%0C)?SIQr$uN37&S=b+$r{-0e@7+a!_YY}ECY_C-*MXj;Dkar zfeFJipg2ZId^(j*KRVp|ajm&A8Lo_H%44zS`^XPt|BuU8rkirrS>4X~)4iDp^(o45 zfi|epb`NR`SvjGobSQ=f!xsEh|3?bN(L+&b)m4=`t=eR|zBH=NzKw12DTgyzdd1+S z{-Pj4wh~Wyigsq7*xYo#*Qmv+4gAC-W2NkDqAZrIQfFSIF4Uv_v)rtFYzO^ z$^@;fw2@sN{ETon?5&g;iq4`^$#Ut6LARijuY7979gAr{bbOLDhfuCU|2c;f}z2ly*QA}n{M

e*FNwHZ~Zv)mmkteD~F*uJh7J z-rz-E9Hy#I(zp1COD#<*As);{YZOG~DNZd--CaUeq5e2ti9cIQ>250uiX#9Z$mH#{ zYNI^sXaysx^*5-BZmuhgT88F(n&RNK!NAt3ND^VR=6kwcktq=(wCB09?ToDnm`+7f zOViY{G>w8d^2Vc=X@CALaepNffkpzd^6@$u#i-1jX%5;H#_815ZPD|+S>(Pr?tH!C z%Gj(vPu~(m=@qGZIq7(TpxnzmUB`<%g3s2`JJT_n!l;7<)ZsF!CjPh0;mEDggg0eK zz{fs@UY>a_!3v5zR417_Mb7pVawN}TuF-FIl6<9a&`2{R<8eAEPA?^>k1J#n(&17v z_odtNyWqv9fcXyCLR;`$b3kLtgV7qV^}bkPXEI=Fs#vEWOD2$WO(7atmglX0?2 z*%-sD_Jj*6KwO5)Iu|7@1rO&t@aayYMb1O{c5m?(3oXHm9T33b9z!k9o_+_}=#No< z&rlxW6bDJF?_}latMji#M{`Mglh3yJVe8z$vl!xjp2yRq44Do zfnv7r2n)oo@cr}#JYMeBn`OhzddMMJe5wyy?TO;k9eMe7T#D^mtT~_NA)t8x=6G=u zF>>$}RC0h&@IPnXdx`@DzbgQbEKR%Lx0_LNMa?l{zsyEe~&wMoV#;=25{vLCm zOLFX{c>#(u!DCHNX4->B8-tEksy=sxFL#CZP+i*aR)e|rLsUn>-|np#^FERlC(DYB zv1lh+_2SI>@n*a{oAFZj0kZV~88}ht*-f_T&9EFK+Bf8Z0Z-u`eI=kFs{QsXeW?fa zsl~6C>ePU?;8Gj}rS7vW0sJzzF8ssRB(pv;a3~iz#&Vsk1`Si~1~dQUP;0zzuhmYkfw)_JKTbcdmrkJ~aGX6k(wJA%ZGKK(hi-2{v7 zG$1Sb_gd7ycvS2061$lim&H#1`8MzAYG+YBXsQM@&T^cpbssKrdt)Rqpq|mvC2<#(T_7QW&L{gGtVO$5Hj zJ*-FFD}(-0jrg?_`=^lZIK^@wDRiuV{(HlV`+d2 zzT7-Z0o{5q57VC(DLQbLuZ}o@w@3?h2S^gJ)|V zPgOjcsc@RBc3Eon+#HOQu9X;+i&y%2^?t&|F1q%0f>&s?KLQI)p}}!?83iXWAXu7z zEZ)U0BE;LiGSQ01cr;lBnyB-dW&3>Y4A>ls*qews62+e`CCfJP${p0DX5Msjb$xxk zwa%s$B!B`V{SjD53iW67|BUF{=!aqp0+H#UaHNN~&x@G98uM)gb?)=;y%sycD<6F} zc)|OVA^X#z=U@C3+y3g~7PVU4+SU;sjdTl&4tSah{m1xo(!#rc;U>a7C20D+@7geAXXd#?OjsPtpX9PinDlUX9Owz$GaMC!%79{TxBiF! zd?^3(!U=^COhHHj**7}HJ@o10fCzBlli+YaXjEY2(H gE93vG``OU{4VPwv`VV&)r~m)}07*qoM6N<$f`t6dv;Y7A literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/任务.png b/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/任务.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1d83bc079c94e652ed6bef1177ed78f31b2d64 GIT binary patch literal 2133 zcmV-b2&(sqP)N)k{(UW(77yi}liEIx`)RBSyny`FYXZ%=#Y+;(cM)oR67q4GvT0!erz zQOTFPXJ?1-Fo1V%XYR}zCy^xkm;d^&wfD{gM5X_~$Ak6+C}OCO_7~s%6-D&-xm|(~ zuhyf8UW1tiE!OoF|Fgi(mOrq)`E+A#Yjb@ou(2K3*xvF76l2pLXbS)8=GwA^L3-6muR$no+0`+vXvmw$EB(m&Rq#O%y`_5H?|U#I7wjU*-Jy}o25d|k?wC|ux} zn^IojnOr8pG0G4Xj^+v^c@@tjBAG-4Tv;F$ap9HOR7~I*s20l*H>G?s5}x<^8X+D( zNnD0ln#g4m0>{8~km)$92*ELBDtq$zV8Zc8rybB~2OKu{mxE961>`q|2M_{JMrDW+ zgH{pMd}lVhl{&op|l_kpEB9_s@@ zFyvMIQiceB4`x%b!~Ok9=X3*v1~Uy0*k(N5)unZTlOTvxOi_tw`26wA0)`suA=H@Z z@vjTf@OeD}9JmQ$X>rBlnjN%Q)u^!n0#)hNsIgmPc1=tJPn3ZtvMnG^zZ~|NM&bSN zFNPX1)M)7+3mzXSK@jPfs02$_SbEYq-K92TRRTn%e}Jm=^)X@h0Q<0@EL%bRoqlb1 zzbpfa=+&4}jTyVU%txR0n;-;WVIm#>0aOtoCLA95UIfu2$Q=l$&3#?UL7(HvsA4)! zJ|F0H1M-7p2!np`LttY&lZYrlFhn{grh}vT0_n85<$EP#%IEL^q@!3(M++rb zhWPa1gI+s;A$mEC`k{lpJ(kW2TtkThPcTF(DnXPf++lNLh-5@%hzYv~)|J3Bcnb)D zV-lC4N3K~6)ypyS$eWCW6q+W4s45{rptV$@cZ~@kI7SdBEj$t77y=$QiA-lxFaPmE zmH|WbFP`t_@g#t_j}jdrZdnRGDAO8(FOXjkKX+@)kfU2;{<~zj0ttwfA;M7LrgT6L zH1`Ro&CM4`*e9;ym#vf#I3^wYF+6C45JMI#Y|Kr9fm5+B-yrkuZz5=1&aH@m38j2g^1 zJ3UXPYb%BZltzdOM^89BcOdSxZGi**Rp6QS>9{H7@nqy#;Mw}hMl5^|C*FqPp)if< zxHp8@K-%h?Pczp|AU-(<_ zx|matL1g6%q-;z{iDroEIc#1|*sQ7$igSm+GhBfT9v_YWGO6vcXnQQS@u}eP5hzhv z0QrCexSb&Gdg31Gz!Q<>C#!1ID2H!;Sz+S1qXZ|;9dg@lnGSh9(Z-mu@VRYl63$x~ zVo;;T@zIHB=z9kxSo*q{10`COzcqxo^k{EPJQ-c_t;ua$jT)C1S34?k%Tl*2HDUL3 zfNXe&>!3=up&n(=r|h7prtWZL6BJvxNDm1Z&OJkc2f8q)z*R(UXeh<&0J zgdkQ&=5Y2BamqXKmq(n&IL0>86 zafj8_Asr4oP~zu8a0N1PDM6I!tg~)W(`?LII*PfU3IR5ZiOUP9#4SrX?QRt5MO3wr zrgBJtsPs;|=jPr@R9FgrDX54ZQcjRKfpvzE3H~dHn=+M2Mt*y`^V`#%OfmwuuL>Lz zgp>|Z39#>|AGEfpf&aBzU1d63myWvc6V;CpEJK9OzOJus7!5;R8grM%+^e;$F0Y5q zzH)`;y{NePkUG-P6_$c4lxzxY1BrC( zuQzWO=6s{Wc5Qbbs?s$CqC;y@Ri&qYblAS&_5Jnc4Uvx3E0M>Ow(&`*1gh$VA$vkP zhY+`As=`uuGWzGMe=g21jSShkH74|-4rvuC9a0Oa_PR9Y5mA-5uV2T1T!;&Cx{$lF zTc_&NfvS3C2t6tmu5ElOk0&oLzPL?o`ou3q(m83aX*LfF%C`*izM3lq$3K00000 LNkvXXu0mjfI=$&0 literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/养成道具.png b/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/养成道具.png new file mode 100644 index 0000000000000000000000000000000000000000..0c328a07bc9b59acdcfda2798c17e31c91001de0 GIT binary patch literal 2966 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 literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/原石.png b/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/原石.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3d70aa633fe49211b7af2e43cddcda731a4dea GIT binary patch literal 1641 zcmV-v2A27WP)sJ$J9>?=P_068X*f%}4h#HH4MF=G1KAFjdnMueE>_xQ4!*P4v*0OGGE6PQY1+}0C z5DYx~-;HG`FnUFUSO0mJ8 zFVeA{gfFC);WCVT^Pb8MPlcQJ8DBeKcPZBzl&xsO>j|$sO>PElePe=FrLxWVu0h_r zE>!jvT7yWTx&G5tF6Cj?r|G%nd?-#JX1TUqsWT$wPOnpL`hFDJc9pa(u^E8ae>vZ5 zaq7}>i_(56;ghPEx_}I(#%59zLIo@anvHykZ+y+ z3#meD(8}&8qz%gh`<@sAWWQD-Jsz$OnLlLeyJyxN@`G zaa$s~njaWmXcVIeVN#KnSJ`d4U$qwd=Ch}lW+}&Grf(fiKY`!YxvLLC#xob16$XW_9o=nOcBu%n6vGuN)8&g} zAy1?frkGHH@#iR4I=-AuZ{*oX8nyyVIumfDosPmYH~S<4OHr^#p?8Zr`Go%2Rr+Jv zLwt32l`3SPJnI{@L_Jz2c|zunh{EVjg}11!ahoH znG#%~goBi1h-w^S4qSq&ewNoPQ5`zkP}_`m_Kc5uQoSCIm}P74GM_lOs#V~-fWHZK zUXb2}@eK&3;o!g7zn`Z*`Z0Up`!ZGk%-8=`kd07E8?BmRPc1Xu_7G2nn}jm7?nKK$ z{_!J1{8aD6EqCVHCS#tZW%o;xbx!UF)eM|p11|&HS&o05``f?Rk9!K$zvSyjX{DVZ z=2&8#J>@U`_|UIAcd5Eo!ox@lN|=?p_Ev@FSVPMvM~@#B8Bh1l-SHLryqwtq$Zhyx z1!ibirno?c<&VJ!{qW(X;*ljr9ODd0IPd3vUyEt}(OXq3Iee_4QKaBuq;(IJv?z7$ zLWR2KGeOm-jWx=ybHnqugLL;iXG_3D4rVf(FU!?T!3WoYKU%DJFpNSjfpP}eq!KCTgWU76`yVJN=4?f*`nYPxn&#hOtsvis6T9o4@RP(7%%Io=A^* zVQmK#6JU4(8Xq_8%hyTU8(WnK{-R*T%X^{FThaYsdaH^sH;I*pT03uel3(1+TwLUw zVfe}p#47ZJ;Ov$AN9vko8hyo831#VPy2=vMTV)!u`dG`!KPIm^S<5gt?}qOl!RN~` zv`!t9b~Fg(D#B86Rl;9L%Vk>?hehqTHZsim1sHV0+1@FBy-5hwB8yPk)YY n!u6Fbzl9V?Rb`{0^R4_3(2ITrIj00000NkvXXu0mjf3C1fr literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/相遇之缘.png b/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/相遇之缘.png new file mode 100644 index 0000000000000000000000000000000000000000..102dad188fee0b6b77735797e5ab4641f7f906f3 GIT binary patch literal 8241 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 literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/纠缠之缘.png b/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/纠缠之缘.png new file mode 100644 index 0000000000000000000000000000000000000000..474aa3aedc2e577a929d1c0b85d5f8e788f00b6a GIT binary patch literal 7974 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 literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/贵重物品2.png b/repo/js/OcrFreeMora&Primogem/assets/RecognitionObject/贵重物品2.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7c7b854922ac4941056cb46f85828393edefb0 GIT binary patch literal 2645 zcmV-b3aa&qP)$DjfN!;KK%egA;B#?cXFK$G3Ks*7rRx}WFM-+sEMyCey14-JcZ`-h$j zd(dhfy~87tl_iziVLWz!BrsZnplQ$VNQAc&G4GmsIV&Dat7H^`VMqspU}H=B-HL`P zUQ25_sV@o>-f-s~b7_S4A z7y`!wa6Ifx#JpMQf;8qwgLFYPUtQN!RK^9^d_jBnTg9AhQ|os@VV^BEbizKH-v!w= zwQm)3g7$8J%`YnBR@XHxsOAY!jumq31-9ZL=NTv(^-{w_L4GMGx1@?)+bHbpo0ynb zd_S+%EJKD>t4V7&>+EKo)ue?Ct6I(S;`{lDi3wq6AG@|Ox1=h+l+*A~piwVnMv3`R znln(M2>fPlhF#luEssf}0wgN%TR}xBqmJ9q`uJH_yRfIbXP~=hpk3JW_*oaXp|zAz z_gg^)R`XgOlU>{RW^M-4k2qpbZ5&w2N?+r66#+pIVDT^K&@WNS&Y3Rf&;b@71VMZp zGdRK?oeL$nYmrJ{-)7d6sK9wpNL1i9vtBBF9o)72!zfV%4!A8N;?ew4&UsMsOF1Lr z(SZAyBV()_PT_N@5=G#M&+f2n42r}Bw~lE@ltYp5%q2=$!7a|9NbIm|M0|E!lD~_R zJi1W?4*P5{q??k*`z3Tzs%ThJ4DiUb)9Wm@w5R@_T6M@YdNIHg z4NJ_1)q^-YoZjDn6872*8=pG5`twUUWTF)|6#^?cg>s2fMy3M!rJRnge#6G6u=ntN zelC=l9}an~CjDnYd-v5`MyhG71ao{jhf!3P>b!XuO<61zMg6p@Wekq&X2QQ3Q5aHva4# z$lS$Clrj<(Ak*kYWn7=r9P!zU%ea}*u_h!c@MrJ9!JH!4I-Wp5T+qB?j&g%_9+ck- zD(*je8uO#CrEn|@tQjDoEthzpvXnLe{~nCap&?&QQo#CN#5M-ltv#6(dU z7k8W?bG@))c4iuJL6~2h2~`CvGH!fs6Le-419NbTSwB7wdUiH(D=|Op+1VT)2X8U! zGeBUENK~Lr&}rQGoEBwyNd>U^nGNNYRJRE_KP)N#iZ9L-zf%%Mp!iu(^<F=L1C7CvX@Ib+&thC7 zP{nT6{nLVAyWfCDYi=x)%e(H}BS_QzE&XOhcDlyZOXf`cReKEz{`e z%d5G}&*%ZK7dG@?jvkZEF5%E^~DBnzGZ|f4Jtc1?fYd>Nqj4$iz5_(;#%XB3Lw>XM7vmvjQ040jR8ue05eRJ}O zCY>Ry{MY<)exm?G;Wr9?%`eYfAAd@s05$c^*qNRf#pN(arLWF!5j%bPT~NSn`6fAk z%`cZqU%4Cx;w26%)oayUek+cDX6AY!YeYOcA|Ab7$U3t!UV+PR)oaz5$J46dffL-d zEH5f=+^NCB6K|X@L!tuL^2@K~m!Id&h1tAur)GIk86;Y-(Xho+6oK7aM%m=#^+I&Z zl8)f}%1Knig^WE&LBXb6$YZq_*WN4Nj*Ur$U40Ll zo>lQ4p;s(-xp)Ft{3_m~2Tjj}U43I?()Y@@7ULSK#L<_5Q~kuRkoTjW{isK$`GBIt zLpz5wX;5%;A+OB|8#c5b7gX~z(^D^{ukbW8J++{k-_U+^!iLb%DG+Z+sLGz-5fAO` zM?G5>ePww?)|U0l*N8hFa>j$(r@>E>{i9DE@!)nmbB$?2f^Cn3;}Fz{Y*8}qpS`2&kto_*nB_J!=M3qSm;Fh5tRn2H~SPdv1Z zeiHis>2dHeC=qtWLvEE~`es4l#S0g+f4rFeWA^_5CVFwTWFG|v00000NkvXXu0mjf D6D0~n literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/0.png b/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/0.png new file mode 100644 index 0000000000000000000000000000000000000000..3e08bf71304150598402546ecf43b85c31e20680 GIT binary patch literal 616 zcmV-u0+;=XP)l&PU!n~35Elgfq6p95s+w6s?VgNP;FE* zq}Bp5JdxBF@Uz|em}P$Un_CX&^F=w@IdFBDBG8nFe*IR(6_5~WldV=xLn|D)UXmM7 zC>;DXY(dFjbvzZxFg+(xr;-t9^*hydgB4}cQybme^4f=Oj6!k~y24s!`xjI$CSkf! z%}6!o8QOmlc=zS~*SrE! ztY!C(s5y!H@4qvlal8<(iU^HZrsJ3Lf z&Z&o@-1>})_IXQJ?Ao)lvUMUubZ&igZhcl&$HL{SZe2V3`pNan7f#l6PG-od?p(5R z&F$;wUO&C@28^H*x38at@Zls>qNJ&R_M&Ciubf7gfY>p4_QD%i&!89uk*H{$c=q&B zED|M6{ijbI8SD}rlc9l#?p&-AmoA*B#wv02=z+542@KIWb(bl8T#aI;Uh+bw=kkMCH~4B>?+8H=h3DlOF&8002ov JPDHLkV1jdFcaQ)8 literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/2.png b/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/2.png new file mode 100644 index 0000000000000000000000000000000000000000..562b3bf8941bda14442a054127e755f7a04c5e64 GIT binary patch literal 534 zcmV+x0_pvUP)4E@ z?N8HC6vppA*anS>_`%UK$h_<&Tim+MAS-@QT#TYDh(@!)1SdnBF3Th{WV0&7E$d!b zdr22oX|G}9{t;5{Rud9Po)0JY{PH~KoLs;_o`Ib2L3Cp~-H;`-*ZR|yn~fjag%85x z*bUz_1356}nR>PUx_ek77+ui7P|{ng4#5i&sbx*A5{yocJK6mENL-9QnJ?|;aj#7< zI>qQ^dIkL2D^Y_??%hP#$3TvOoI~(RKX>SRvmpWHV4q+#FxA-NLw3fRk81PFhS_UT zGoWiS!ARHSNL*wgXKO8+)Vo%TU<8b#Cc)@X`5juAvk4Y*`JIm^#~mxgP{7o^fNS>d zMA&=X-pwNHLEeaK>NP|vIbv2v19rD-^ zf6eWTuRQIv_h^cSs?Xj$zZJN{LT(5-Lf%h>O}fOuRKI@v>=uQwnPGwjx$XzcQn7C+ z1S9jP^&*)V55V(TN6=){U;bVkoD+RRS$w;6)9)G)JT1UhK0_}{Fe;XEuG!!Pf`vS2 z$P%5DV3f(NhZbTUF+9|KB=~49ky-{lt!_h?72vOKeTl0DG_{KL_7zeN_U&U%vhY&< Y1B-*qBhjc1c>n+a07*qoM6N<$f_wn_Gynhq literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/3.png b/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/3.png new file mode 100644 index 0000000000000000000000000000000000000000..4857790fe4dedef8f3ee62446e57cd9f214c0abc GIT binary patch literal 523 zcmV+m0`&cfP)33j z;ZNE?7{>2^gheM=QpW(7D51K-OjsA8BnFg}EyFJ)I94OVl1;yC6GYL0$SfW$l(MGC zTAG3Ok67w!SVQvW&0X$y&->hyLvc2(scqAcXX<{`6Y(V-OF9S=4Haw}@|`Y8!qwh> zKC_!Em%dFj$u#79Ll#=~l~4p(n^BK%Uby{X2SGXr(&Y=i-^qZmt_t}=!GeYg&gM8E zpsxfY{mw6#@bmn{f)t5QuxUHAOhr1lVH)y8ld5MWX0wrz)A_`^p>hmR8#{19f3Po#G2Vfsk=yjliG zm0K3{_fNN6`abWWfP3npHj^KwS#)p%jkT_6$YV{ye2v@BXLDTT_%2zNBhmhLQyicZ7C4ox%hjYMTaN#quh>(Sw{ZHSvk=J6rI z9UVn1cwP+5Z=U%tvjhcTTZYGGpC0e31py@z;uHX)5N)(~#Bg9c!L(WsA|VbNf&vVV zQmvg>Sk0ziEBO>Y5aIvO1G?$p{cT2!U0+|8bM*sJp6gO+8SvZE@g?;hV&_*G)>z8cb%f^>Kugh(q9K8b`{7g|;LoMs+#U}_ zGYo6|X=u5-M(etJP`_igR`MzSIS5AChEB9jQr8Lqb(2eJA^MpNuWXvoRkiM~rdFyO zlk{mO{r;3>* zYfl6l=2p%jDRZU6d~rj@l#&KsCCzc4T?7a+x22P~^V9X?9T*(z?UatjCE!KI9yBTr-!&z6@|>!PHgdY z$m0vXi+{LKidyoZ0}t|PV7$AB#pxOC%s4g2dHu~=NkbcIiS9*LW(S{4CN&PXs(`U^ z)|my9ogbqa8y9;Ue<%&kjt>Y%HTjJ521ZfF#zlAUxnWlYg~J@dr~#!wC^E{K?fmD_ zx`{idj2*)`HRtxM)}f@;ZPrSF_XYb`GQp^KDer&%!Y{4OzFgjnL@Oog41&?11I2ur z&Jo>>4|}TiIu>u*ije#D-07ivnY6fltKr{b7PqPo+;v+yEeN5For!0z|33H!porj0 TbS4gi00000NkvXXu0mjfKI-|| literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/6.png b/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/6.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2dd27ff003235f0349969cbfa0ffe4cccf8914 GIT binary patch literal 579 zcmV-J0=)f+P)2%G zZBN=z6ae7q?h_uMDW5t@?7_j~M8 za7j0A9H3F>Sa2RzC`sfck2@Osj{sDicE)= zLpWj4=rE{2WdM>y{@(?s=4wLM^YgA35M9r!rDiP`3=I&2CB6pMh9t(D%U+o&mQpp7I#Hu7L5w^-2L*70oP&1NM!vt*8ufWZdd*Xfnea2 zse+Ou@?C)j9|u&9YT3C3=ipyy(WzN`JhmaUYyII!uDfiro?BZF4Fs zYfHjl6bJBqM;AeXFcS^SaMMh*O*2UeqM{4kj7mtv+v_5<3ro_>x#@h&Tx>eh+J~t1 zgxVOwdHLh~|K}iz48~7i;*s$}kwJqiA{#pgPBQH9hDOIphWC$8dtzN`SL2BUV!&|C zOw152G7M@(MFvcnHakciWF@HkyBkFY;#)O#88=|K78z}x=y?nl<(Pua70@Eoqz1je zRuma@1U8vY!6yGUnHGHMYzD4r)=GiMrWT>S?TZ|%uuWsYH_%LO4Ymw3BIXSz4 zYdUQ&c&{f~71FRNY(u5W9RTA7OUB_1NSQn29E5TU=%oVL2R_Ku+V>@*5= zejwBrK!n+S$#e>$uE1ro869N7sa);~BBA-Rdl=P0bBilXnTCjGpWOb47NHn!_pG+~ zvLb_?RKLw%Pnumi$l(oj1@1#s#r#rmRQweG2610_;i@8QCIA2c07*qoM6N<$g7rPK A0ssI2 literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/8.png b/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/8.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4608259abecf985e09775c68b89c075427f7e9 GIT binary patch literal 594 zcmV-Y09+3kI)zsc`@~TomNTHGva@3%$ZBjrJibaYsw!ToHf_DLq_i{yEa$Ks& zhiJ^=)@t%kb{@Z(?92dyq!lXK;q)dG@tTm6y4CApbJ(d0d^YwqYF>2BX!Hb00qvYQ znTSi>>O>ZwO77P~q44t;7VvF5CUvGzI(6WB^KM?h^w#Syahb6MC$e~b)qKCY1_~Ex z)TUBAx7yqUNg=sCzFH}VQm4m1KwZcqCv~*HU~*uNUa;}GQcFz-QmAO5ybpLl5 zU}t0Fvu4&vC@G|QdMTGVz8$qtSAd>NSadkO7(&MS+Q)XI@E_N16dcPdkGK`DzfqoE z3!r0kNdFA~g)l24R&$5Ug?_5{}@ai7d*! zdbd@Q`*l1)2Nr$403ei<)#lkv?6jK&^as>qEJ0Y|V$mpLuq#OVj>FQ;nHi(qWN|VE gyGCbJkTg#H1+X3;IrQ$ETmS$707*qoM6N<$g3V1C&j0`b literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/9.png b/repo/js/OcrFreeMora&Primogem/assets/背包摩拉数字/9.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4cac4d71a8203967f7f0b7b230f7131f0e05f6 GIT binary patch literal 526 zcmV+p0`dKcP)4E@ z{ZHCp5Xbv}K0oXUkuluXE@PsQF=q=QT9S!l1|yiv0m^)Zq3k6rDo7bED_yBAir|0} zBK#3cy~d$YlP8zE=RUdn-g6IuFoiH>wL9m7A9COK>$P(4qNcZGRVroo(u|L_Ja!;V z5(rb%GqZg0;IeZv)U{h@&{eaU)C-4)aJm?tJAky_loRp9tH~Lsi`h%>b{Z1gr*^i8 z?X8V&^AE(aPq8P@ra%cEd--kuOaHGj)U{r#Mih^70JR$u?F|3~HWUiiznI zQsq3;{t=F(nK?-)Jj{^@lW*SoMLutGrNU3}M*12M!X)EmCE?iQvY9l99qL*<7QdRq zqQX126s5_fi94 QjsO4v07*qoM6N<$g5-7e82|tP literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/0.png b/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/0.png new file mode 100644 index 0000000000000000000000000000000000000000..6dad5ef07934a779ec6bdf481db94c48df1cf6cb GIT binary patch literal 478 zcmV<40U`d0P)3qb z>rdKH7zXh3?;RKB^e~tm(&^+BSPOEopxm4gv~p2)0nM_^7`$|{`Dt@nqM$*I zj&4d=)&3XDBq4s-=l7TQc^;s&FZX|Zi!Ee^O%wVT4zoQ#QXZYr&iZFdCH_i21C6>A zjlF%Ww-PU1$v4ZQD6XyNXxDU~ma;lRf*^pcd{IY^KYD5o%*2}~hpHmCf1R&pHwOq> zqqju36yTC+h%hqPmOiZ9{b{L+tSa*E?pMm@hX`B7gTU#HK!iz(&E<>Tv#Q9ogT1NH zJVclnbpjLZg9w`#A73u_#BseAnM*;02M8LFlm{Ygwg&`J?1|>d;avP3L|CJ@JQTwJ z1!n#=GSNPsf0!bL?^6b!Gr&C+g$Nt*#AdG0`yuUr_XatLuwl#%;)|L4wM=^X(@p1R z7wzm+y9;R7G$?F;em3Ih(^8W`u5l!(iu}8E`f(-ugrNI}UU7-{;J99!Uq~YZGc@9i zFJ>y0%4&AQ>Ii9c7CRfRR=Qy;Q#;t07*qoM6N<$f~-d0UH||9 literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/1.png b/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d10d92194bf41c615ab9098f06209826d55d9d1f GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^>_9BY!2~4d?N3px zZBN=@7=@p|MN1`x#Y!=-nPR|Z!>k)|NFWjo6HwTjbB-k~kfy@2x7aa( z3P=?Yy3l{IAj{$h?_A%`opX{4=$hI)Kgs1jhr%1n>=WIBuCG-82X z-)g-ogCG|%+sGS}bH!poyJ+c}dfu+jxt0+WnlVz6MBrQuASlFUX!+>7uBl@dJggCg z28*5Nc@T>yR)TBc=w|EW_c*Q{AK9JEWryQS`4A{oxg!6lS7og?n&_%ZB({Z4Q3i{h z32;j77x>?-YigrjiEkzEK3p_fA?0C3u{h{9|9uPx?L$cnauE!tt@o&>+`1?h`<=$f zhpwqwueJAK-~ITB8FLVnFSV0BuKfISaXPLC!$JG)`#m_%m?mc7Jah0V*F96NPJ?nu zB5A*Af$XKZ)@dAJC33;KTDt`fUq)SmL SSrL^000002GJ zaZeI)0ET~GkGx7c4+Nti)^WfI0s}h%Q3gYS0R^Fm5MXFy&|x#UV2ojsS_le)op(`@ zSKYU0j4l6upLcuT2k;zA56;QrzCX0-a0P5mzta;6M-$a*WyoCe919q_n|SqFsUfDN z_?*(DP(OPxH!qapTB9RhAcxE)D3{Ba-hNl4cDMp$@g4PniYIrJ8bSc0IRF)o`-xBGaJ#4`)mKz`uCVqqV?stR4S3h{ZJ(S2(<{MxZdn6 zQ)Te&y4SmCv2=HGgy-0={f@^UnU-j$W>nrl6lC{u)>U6BvpeXu|8GiVc4rj^0gPH~ zYrq?fP9d0S$=y6UoDhF+nAmn2k?936YF+h#WI8LB8)g;8*mk#eq>wTAE>DEV00000NkvXXu0mjfO9A;2 literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/4.png b/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/4.png new file mode 100644 index 0000000000000000000000000000000000000000..8d2eb411f2f0d5e646c47ec24b093697847cdff9 GIT binary patch literal 463 zcmV;=0WkiFP)A0004&Nkl4Ft zYfHjl6bJBqy%_~ElL&Q2`8-+Lh;qx&E`~;{jI@mC3L)JvQo%P_dCL?lr`2q0Nh??Q zEh4SOB7*;$!}&euzB4Ww0TMltYDa7ZG)!206ynjAOn!*o^@ z1DMV_HZ{MvytcU=MEFXHV;MQg3Rp z{ZBz*6vv-`@3u;MLg`h_B<+m~wI6381dj;~l}R6ZJ&Kj{|DHts!E`wn=xPbP0~ zSf=nB^6njRgi5~#hQ?GFM4|BcZ^GsAafHrD0NK~6tHgG#N^=m)6mYGDBX;-w;5ZoW z7b$te%E);%lfF+sraZfc7(_i#Hh~rj`3$I4X_Lhvp4JSE%npsK21jw;uu?cVFH@W2 zakBgMT9v-IydpL|IwPSqSS{8qe=y9@dCv3`i}N&bmJm4N00000NkvXXu0mjf0=v~` literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/6.png b/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/6.png new file mode 100644 index 0000000000000000000000000000000000000000..657f58790d4e74a5d277fc40e8dcd4f9232888d2 GIT binary patch literal 441 zcmV;q0Y?6bP)2f4 zX-mRj0Kjp--c$;kR!l9?d|Y0M*UZwwl2QhWhJ^&Bd6dv8$?$+k(a4BpdE}N_YU#I# z2O)a<|GoKh#zS^AVBQ<_`NgHfMFQQLFBoQ8FXJIQ9H(0kgK)=ovsuqAX8at&ZDxOT?1_uuoODu85xk;yOj@?BSfys>uja{;2 jmMG08yZbnr=rC`;j|KlM?yMVb00000NkvXXu0mjfo*%@! literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/7.png b/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/7.png new file mode 100644 index 0000000000000000000000000000000000000000..9225bd42c72844727ea6e0d695dc7feb08ebb610 GIT binary patch literal 380 zcmV-?0fYXDP)3pw zT}#4X7>4)v-pT`cZGj|qps$-Pmw_6l5*kd9pid#PL@Wdo>(ma?C^E9C?MrKGX=>%a zh?vY)!gY3W-_QMEB3~DI_CEsm*b-RGK?NO)lktZb3_vsyvz1~Jd)VP|_B5B*$z*e} z`1bTHLC|5gR>f3V=)8&=sw`Yr$_^@s+m}=6laJmDHXJBAEwK@0woG#*L5Bs79S)SS z?yAyRp=h>J78{*BNPqTZgMMl}xV;eo(E<^u-rZ=GqjXo5@`a)aCueZdA7c8Qwn2-0 zJ-D6#5NV_IH9zUEzI39DPI}%`&+AcelcZn0f?MSYjT@2XyuvPO&$S= zOgI?`$FnwMI{zzZ9GR00001@A zYfsu>0EOSb*NzeJtw5oIBEE&TC?G-vOVy&H76yjljmQjPVKEa7e85X$h{nqRftZY? zq90H;`4$Qk^ocVG}vHt%q`hGa2_)?=x=o2ypy$Hm3D z7)dC5&BzBZh;$ZLwR-uxCo9M5wOjiP|AC-!NDnb(^FGw?6gKF0-`}3*f@><>uma!& zts&XtLb3PKQ5=nbX`G-TG&*t*!Om<$_&>A_lo{{3);M>u6UW{6q s`LU_Fal7A)d=}d84XmaQvaN^vzf-UAR&x*PLI3~&07*qoM6N<$f`^gjwg3PC literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/9.png b/repo/js/OcrFreeMora&Primogem/assets/背包物品数字/9.png new file mode 100644 index 0000000000000000000000000000000000000000..172ab8a99f2317c16e30d28348f2bc99633ac36a GIT binary patch literal 515 zcmV+e0{s1nP)2#v zZBN=z7`=b*l4T~|Zqs1h$mDhfd6j}GhzPz8G0w;a5j$9Q4NMr|XyMy7-IlQlI27$x znayY-|6(sCGbYcs=RD^;=N!=2l+H;bUns7wKMT&s{BzOJ!rJ=gmMDsf-0o`%Xf^5^ zPg5p(de~^QxMl<4RkO`ckPgZoNb@hxPn&>C?~a<>5Meg-SgJ~2>K`kj==4Sm1ohyN zue|>T_(M?xK@A&iLUylrdEVC)O_dW{={w^N13|4lNdkvA3=tkPdqh#}Yl=SkLeWG| zLxg>SW#IHiAi~CnQ`<{g~Gqfw{V8XgPh^Tmi z16Muew0$H=Qid0jsZ53!QXEg&1Nw8NQW@yNS3Tv|&$I526Sdpf6>=nI3xl{002ovPDHLk FV1jZ8?kE5N literal 0 HcmV?d00001 diff --git a/repo/js/OcrFreeMora&Primogem/main.js b/repo/js/OcrFreeMora&Primogem/main.js new file mode 100644 index 000000000..e38a0ca70 --- /dev/null +++ b/repo/js/OcrFreeMora&Primogem/main.js @@ -0,0 +1,303 @@ +(async function () { + setGameMetrics(1920, 1080, 1); + await canCanNeed(); +})(); + +async function canCanNeed() { + let tryTimes = 0; + let moraRes = -1; + let primogemRes = -1; + let pinkRes = -1; + let blueRes = -1; + while ((tryTimes < 2) && ((moraRes < 0) || (primogemRes < 0) || (pinkRes <= 0 && settings.pink) || (blueRes <= 0 && settings.blue))) { + await genshin.returnMainUi(); + await sleep(100); + keyPress("B"); + + await sleep(1000); + //切换到贵重物品 + const gzwpRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/贵重物品.png")); + const gzwpRo2 = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/贵重物品2.png")); + let trys = 0; + while (trys < 10) { + trys++ + let res1 = await findAndClick(gzwpRo, 1); + let res2 = await findAndClick(gzwpRo2, 2); + if (res1 || res2) { + break; + } + } + await sleep(1000); + if (moraRes < 0) { + const moraRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/mora.png"), 0, 970, 600, 1080 - 970); + const gameRegion = captureGameRegion(); + let moraX = 336; + let moraY = 1004; + try { + const result = gameRegion.find(moraRo); + if (result.isExist()) { + moraX = result.x; + moraY = result.y; + } + } catch (err) { + } finally { + gameRegion.dispose(); + } + let attempts = 0; + while (moraRes < 0 && attempts < 5) { + attempts++; + moraRes = await numberTemplateMatch("assets/背包摩拉数字", moraX, moraY, 300, 40, 0.95, 0.8, 5); + } + if (moraRes >= 0) { + log.info(`成功识别到摩拉数值: ${moraRes}`); + } else { + log.warn("未能识别到摩拉数值。"); + } + } + if (primogemRes < 0) { + const primogemRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/原石.png"), 0, 970, 600, 1080 - 970); + const plusRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/加号.png"), 0, 970, 600, 1080 - 970); + const gameRegion = captureGameRegion(); + let primogemX = 152; + let primogemY = 1007; + let plusX = 262; + let plusY = 1007; + try { + const result = gameRegion.find(primogemRo); + if (result.isExist()) { + primogemX = result.x; + primogemY = result.y; + } + } catch (err) { } + + try { + const result = gameRegion.find(plusRo); + if (result.isExist()) { + plusX = result.x; + plusY = result.y; + } + } catch (err) { + } finally { + gameRegion.dispose(); + } + + let attempts = 0; + while (primogemRes < 0 && attempts < 5) { + attempts++; + primogemRes = await numberTemplateMatch("assets/背包摩拉数字", primogemX + 28, primogemY, plusX - primogemX, 40, 0.95, 0.8, 5); + } + if (primogemRes >= 0) { + log.info(`成功识别到原石数值: ${primogemRes}`); + + } else { + log.warn("未能识别到原石数值。"); + } + } + if (pinkRes <= 0 && settings.pink) { + const pinkRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/纠缠之缘.png")); + pinkRo.Use3Channels = true; + pinkRo.Threshold = 0.85; + pinkRo.InitTemplate(); + const gameRegion = captureGameRegion(); + let pinkX = 0; + let pinkY = 0; + try { + const result = gameRegion.find(pinkRo); + if (result.isExist()) { + pinkX = result.x; + pinkY = result.y; + log.info(`在${pinkX},${pinkY}找到了纠缠之缘`); + let attempts = 0; + while (pinkRes < 0 && attempts < 3) { + attempts++; + pinkRes = await numberTemplateMatch("assets/背包物品数字", pinkX, pinkY + 97, 124, 26, 0.95, 0.8, 5); + } + if (pinkRes >= 0) { + log.info(`成功识别到纠缠之缘数量: ${pinkRes}`); + } else { + log.warn("未能识别到纠缠之缘数量。"); + } + } else { + pinkRes = 0; + log.info("未找到纠缠之缘"); + } + } catch (err) { + } finally { + gameRegion.dispose(); + } + + } + if (blueRes <= 0 && settings.blue) { + const blueRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/相遇之缘.png")); + blueRo.Use3Channels = true; + blueRo.Threshold = 0.85; + blueRo.InitTemplate(); + const gameRegion = captureGameRegion(); + let blueX = 0; + let blueY = 0; + try { + const result = gameRegion.find(blueRo); + if (result.isExist()) { + blueX = result.x; + blueY = result.y; + log.info(`在${blueX},${blueY}找到了相遇之缘`); + let attempts = 0; + while (blueRes < 0 && attempts < 5) { + attempts++; + blueRes = await numberTemplateMatch("assets/背包物品数字", blueX, blueY + 97, 124, 26, 0.95, 0.8, 5); + } + if (blueRes >= 0) { + log.info(`成功识别到相遇之缘数量: ${blueRes}`); + } else { + log.warn("未能识别到相遇之缘数量。"); + } + } else { + blueRes = 0; + log.info("未找到相遇之缘"); + } + } catch (err) { + } finally { + gameRegion.dispose(); + } + + } + await sleep(500); + tryTimes++; + } + let logInfo = `当前贵重物品如图识别结果为:\n摩拉:${moraRes}\n原石:${primogemRes}`; + if (settings.pink) { + logInfo += `\n纠缠之缘:${pinkRes}`; + } + if (settings.blue) { + logInfo += `\n相遇之缘:${blueRes}`; + } + if (settings.accountName) { + logInfo = `当前账户:${settings.accountName}\n` + logInfo; + } + log.info(logInfo) + notification.Send(logInfo); + return; +} + +/** + * 在指定区域内,用 0-9 的 PNG 模板做「多阈值 + 非极大抑制」数字识别, + * 最终把检测到的数字按左右顺序拼成一个整数返回。 + * + * @param {string} numberPngFilePath - 存放 0.png ~ 9.png 的文件夹路径(不含文件名) + * @param {number} x - 待识别区域的左上角 x 坐标,默认 0 + * @param {number} y - 待识别区域的左上角 y 坐标,默认 0 + * @param {number} w - 待识别区域的宽度,默认 1920 + * @param {number} h - 待识别区域的高度,默认 1080 + * @param {number} maxThreshold - 模板匹配起始阈值,默认 0.95(最高可信度) + * @param {number} minThreshold - 模板匹配最低阈值,默认 0.8(最低可信度) + * @param {number} splitCount - 在 maxThreshold 与 minThreshold 之间做几次等间隔阈值递减,默认 3 + * @param {number} maxOverlap - 非极大抑制时允许的最大重叠像素,默认 2;只要 x 或 y 方向重叠大于该值即视为重复框 + * + * @returns {number} 识别出的整数;若没有任何有效数字框则返回 -1 + * + * @example + * const mora = await numberTemplateMatch('摩拉数字', 860, 70, 200, 40); + * if (mora >= 0) console.log(`当前摩拉:${mora}`); + */ +async function numberTemplateMatch( + numberPngFilePath, + x = 0, y = 0, w = 1920, h = 1080, + maxThreshold = 0.95, + minThreshold = 0.8, + splitCount = 3, + maxOverlap = 2 +) { + let ros = []; + for (let i = 0; i <= 9; i++) { + ros[i] = RecognitionObject.TemplateMatch( + file.ReadImageMatSync(`${numberPngFilePath}/${i}.png`), x, y, w, h); + } + + function setThreshold(roArr, newThreshold) { + for (let i = 0; i < roArr.length; i++) { + roArr[i].Threshold = newThreshold; + roArr[i].InitTemplate(); + } + } + + const gameRegion = captureGameRegion(); + const allCandidates = []; + + /* 1. splitCount 次等间隔阈值递减 */ + for (let k = 0; k < splitCount; k++) { + const curThr = maxThreshold - (maxThreshold - minThreshold) * k / Math.max(splitCount - 1, 1); + setThreshold(ros, curThr); + + /* 2. 0-9 每个模板跑一遍,所有框都收 */ + for (let digit = 0; digit <= 9; digit++) { + const res = gameRegion.findMulti(ros[digit]); + if (res.count === 0) continue; + + for (let i = 0; i < res.count; i++) { + const box = res[i]; + allCandidates.push({ + digit: digit, + x: box.x, + y: box.y, + w: box.width, + h: box.height, + thr: curThr + }); + } + } + + } + gameRegion.dispose(); + + /* 3. 无结果提前返回 -1 */ + if (allCandidates.length === 0) { + return -1; + } + + /* 4. 非极大抑制(必须 x、y 两个方向重叠都 > maxOverlap 才视为重复) */ + const adopted = []; + for (const c of allCandidates) { + let overlap = false; + for (const a of adopted) { + const xOverlap = Math.max(0, Math.min(c.x + c.w, a.x + a.w) - Math.max(c.x, a.x)); + const yOverlap = Math.max(0, Math.min(c.y + c.h, a.y + a.h) - Math.max(c.y, a.y)); + if (xOverlap > maxOverlap && yOverlap > maxOverlap) { + overlap = true; + break; + } + } + if (!overlap) { + adopted.push(c); + //log.info(`在 [${c.x},${c.y},${c.w},${c.h}] 找到数字 ${c.digit},匹配阈值=${c.thr}`); + } + } + + /* 5. 按 x 排序,拼整数;仍无有效框时返回 -1 */ + if (adopted.length === 0) return -1; + adopted.sort((a, b) => a.x - b.x); + + return adopted.reduce((num, item) => num * 10 + item.digit, 0); +} + +async function findAndClick(target, maxAttempts = 20) { + for (let attempts = 0; attempts < maxAttempts; attempts++) { + const gameRegion = captureGameRegion(); + try { + const result = gameRegion.find(target); + if (result.isExist) { + await sleep(50); + result.click(); + await sleep(50); + return true; // 成功立刻返回 + } + log.warn(`识别失败,第 ${attempts + 1} 次重试`); + } catch (err) { + } finally { + gameRegion.dispose(); + } + if (attempts < maxAttempts - 1) { // 最后一次不再 sleep + await sleep(250); + } + } + return false; +} \ No newline at end of file diff --git a/repo/js/OcrFreeMora&Primogem/manifest.json b/repo/js/OcrFreeMora&Primogem/manifest.json new file mode 100644 index 000000000..8af6edafe --- /dev/null +++ b/repo/js/OcrFreeMora&Primogem/manifest.json @@ -0,0 +1,16 @@ +{ + "manifest_version": 1, + "name": "摩拉&原石识别", + "version": "1.1", + "tags": [], + "description": "更准确、更低性能开销的摩拉和原石等贵重物品识别", + "saved_files": [], + "authors": [ + { + "name": "mno", + "links": "https://github.com/Bedrockx" + } + ], + "settings_ui": "settings.json", + "main": "main.js" +} \ No newline at end of file diff --git a/repo/js/OcrFreeMora&Primogem/settings.json b/repo/js/OcrFreeMora&Primogem/settings.json new file mode 100644 index 000000000..44536c2bc --- /dev/null +++ b/repo/js/OcrFreeMora&Primogem/settings.json @@ -0,0 +1,17 @@ +[ + { + "name": "accountName", + "type": "input-text", + "label": "账户名,用于输出识别结果时区分不同账号信息,非必须" + }, + { + "name": "pink", + "type": "checkbox", + "label": "识别纠缠之缘/粉球" + }, + { + "name": "blue", + "type": "checkbox", + "label": "识别相遇之缘/蓝球" + } +] \ No newline at end of file