diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/README.md b/repo/js/AAA-Artifacts-Bulk-Supply/README.md index 1df2a7b68..d44b8759a 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/README.md +++ b/repo/js/AAA-Artifacts-Bulk-Supply/README.md @@ -1,24 +1,25 @@ -测试版本,暂时没空写readme,发现bug请超市作者qq:718135749 +## 琪零、功能及部分原理说明 +1. 根据时间自动选择卡时间和路线,方案具体参考下列说明: +- 两条普通路线全富点98交替执行 +- 达到预期激活时间(比前一天晚)后先去激活以固定刷新时间,如果普通路线执行完成仍然未达到目标时间,则启用备用收尾路线(前一天使用备用时第二天可直接使用收益更高的优先收尾路线) +- 激活完成后继续完成剩余的普通路线 +- 最后完成刚刚激活的收尾和额外路线 +2. 支持多样化的分解狗粮配置,具体参考自定义配置和下面的说明 +3. 支持断点续跑,中断后一天之内重跑将会自动跳过已运行的路线,执行应该执行的路线,但是仍然不建议在激活路线期间(约3分钟)中断 +4. 自动识别运行失败的路线并在日志中进行警告,建议尽快手动前往开图 -可能存在各种bug,仅建议愿意参与测试的用户使用,使用时请超市作者,并反馈遇到的bug - -如果你只是想要获取狗粮,请使用自动狗粮加强版 - - -## 一、使用方法及配置 +## 芽一、使用方法及配置 1. 将脚本添加至调度器。 2. 右键点击脚本以修改 JS 自定义配置。 - **请输入狗粮队伍名称**:改成自己捡狗粮的队伍名字。建议使用迪西雅或e启动奶妈作为行走位,如果需要配置生存位,建议与行走位相同。建议携带:迪西雅(耐肘王,提供移速加成),万叶(路线中有配置万叶吸取狗粮,可提高拾取率) - **请输入清怪队伍名称**:改成自己的战斗队,清理狗粮路线上的小怪,不填则跳过清怪路线,**需要自行匹配战斗策略。** -- **最短时间间隔**:比昨天延后(默认)1分钟开始卡收尾点和额外点。 +- **最短时间间隔**:比昨天延后(默认1分钟)开始卡收尾点和额外点。 - **最大额外等待时间**:98个点拾取完后,可以选择干等N分钟来卡更多次的超限点 - **强制收尾路线交替执行**:默认不开,用于一些用户想收集其他的调查材料,比如茶叶等。替换掉(替补收尾路线)内的文件,可以一天收尾狗粮,一天收尾茶叶。 - **狗粮分解模式**:默认不分解,可选分解成(经验瓶/摩拉) -- **账户名称**:**单账号无需更改。** 多账号使用时建多个配置组,一个账号使用一个配置组,填入游戏账号名称(自己取名),就可以按各自名称记录运行信息。 -3. 一定要正确设置狗粮队和清怪队的名称。 -4. 根据清怪队角色配置,调整战斗超时设置。 - +- **账户名称**:**单账号无需更改。** 多账号使用时建多个配置组,一个账号使用一个配置组,填入游戏账号名称(自己取名),就可以按各自名称分别记录运行信息。 +- **芙宁娜** :狗粮队支持自动使用白芙作为生存位(汐佬逼的),当你狗粮队伍中含有芙宁娜时请勾选,将确保狗粮路线时芙宁娜为白芙状态,清怪和脚本结束时切回黑芙。 ## 二、调查点类型收益 @@ -70,56 +71,21 @@ https://www.kdocs.cn/wo/sl/v13uXscL **额外**:不受满上限影响消失,又叫超限点 -## 六、周循环方案对比 - -### 1. 富6A1B方案 - -- **执行方式**: - - 连续6天跑富A路线(富A与富A间隔≥24H+5min) - - 第7天跑富B路线(与富A间隔≥12H+5min) -- **周总收益**: - - 经验:6×98,469 + 83,160 = 673,974 EXP - - 摩拉:6×22,600 + 21,000 = 156,600 -- **周总耗时**:6×69 + 53 = 467分钟(约7.78小时) - -### 2. 富1A1B方案 - -- **执行方式**: - - 每天交替跑富A和富B路线(间隔≥12H+5min) -- **周总收益**: - - 经验:3.5×(98,469+83,160) = 635,701 EXP - - 摩拉:3.5×(22,600+21,000) = 152,600 -- **周总耗时**:3.5×(69+53) = 427分钟(约7.11小时) - -### 3. ABE 1A1B方案(基准) - -- **执行方式**: - - 每天交替跑ABE A线和B线(点位不重叠,无间隔要求) -- **周总收益**: - - 经验:3.5×(77,742+77,868) = 544,677 EXP - - 摩拉:3.5×(6,600+6,800) = 46,900 -- **周总耗时**:3.5×(41+43) = 294分钟(约4.9小时) - -### 4. 收益对比表 - -| 指标 | 富6A1B | 富1A1B | ABE1A1B | 富6A1B增长 | 富1A1B增长 | -| ------ | ------- | ------- | ------- | ---------------- | --------------- | -| 周经验 | 673,974 | 635,701 | 544,677 | +129,297 (23.7%) | +91,024 (16.7%) | -| 周摩拉 | 156,600 | 152,600 | 46,900 | +109,700 (233.9%)| +105,700 (225.4%)| -| 周耗时 | 7.78h | 7.11h | 4.9h | +2.88h | +2.21h | - - -## 七、队伍配置 +## 六、队伍配置建议 - **根据自己CPU配置选择合适的移速**:电脑性能较差以至于收益远不如及格线时,降低队伍移速(使用较矮小的体型,不使用双风,四风原典,迪西雅天赋等)。 - **行走位:优先迪希雅;或芙宁娜等 E启动奶** - **钟剑迪希雅**:耐肘王/白天6-18点移速+10%(路径内置调时间到白天,全程100%吃满天赋) -- **万叶:建议携带,路径内配有E吸狗粮策略(不带不影响运行)** +- **万叶:建议携带,路径内配有E吸狗粮策略(不带不影响运行)**,琴可作为备选项,不要同时携带琴和万叶 - **双风BUFF**:移速+10% 体力消耗-15% ## 更新日志 +### 1.0.0(2025.08.19) +1.正式版上线 +2.优化分解狗粮与识别相关逻辑 +3.勾选通知后同时在摩拉识别和经验识别的界面截图发送通知 ### 0.0.9(2025.08.18) 1.优化度假村若干路线 ### 0.0.8(2025.08.18) diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/confirm.png b/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/confirm.png new file mode 100644 index 000000000..df37f4cf0 Binary files /dev/null and b/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/confirm.png differ diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/decompose.png b/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/decompose.png new file mode 100644 index 000000000..1ee3afbfa Binary files /dev/null and b/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/decompose.png differ diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/doDecompose.png b/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/doDecompose.png new file mode 100644 index 000000000..3e3bde8bb Binary files /dev/null and b/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/doDecompose.png differ diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/doDecompose2.png b/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/doDecompose2.png new file mode 100644 index 000000000..6f4699bf2 Binary files /dev/null and b/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/doDecompose2.png differ diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/quickChoose.png b/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/quickChoose.png new file mode 100644 index 000000000..25f4961fd Binary files /dev/null and b/repo/js/AAA-Artifacts-Bulk-Supply/assets/RecognitionObject/quickChoose.png differ diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/main.js b/repo/js/AAA-Artifacts-Bulk-Supply/main.js index 796397acb..eec4b06ae 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/main.js +++ b/repo/js/AAA-Artifacts-Bulk-Supply/main.js @@ -19,6 +19,13 @@ const ConfirmButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("a const DestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/DestoryButton.png")); const MidDestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/DestoryButton.png"), 900, 600, 500, 300); const CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/CharacterMenu.png"), 60, 991, 38, 38); + +const decomposeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/decompose.png")); +const quickChooseRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/quickChoose.png")); +const confirmRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/confirm.png")); +const doDecomposeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/doDecompose.png")); +const doDecompose2Ro = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/doDecompose2.png")); + const normalPathA = "assets/ArtifactsPath/普通A"; const normalPathB = "assets/ArtifactsPath/普通B"; const normalPathC = "assets/ArtifactsPath/普通C"; @@ -76,7 +83,7 @@ let failcount = 0; moraDiff -= await mora(); //执行普通路线,直到预定激活开始时间 - log.info("开始第一次执行普通路线"); + log.info("开始执行普通路线"); await runNormalPath(true); if (state.cancel) return; @@ -86,7 +93,7 @@ let failcount = 0; if (state.cancel) return; //执行剩余普通路线 - log.info("开始第二次执行普通路线"); + log.info("开始执行剩余普通路线"); await runNormalPath(false); if (state.cancel) return; @@ -309,8 +316,7 @@ async function processArtifacts(times = 1) { await sleep(1000); await click(670, 45); await sleep(500); - - await recognizeTextAndClick("分解", { x: 635, y: 991, width: 81, height: 57 }); + await findAndClick(decomposeRo); await sleep(1000); //识别已储存经验(1570-880-1650-930) @@ -330,12 +336,12 @@ async function processArtifacts(times = 1) { let firstNumber2 = 0; if (settings.keep4Star) { - await recognizeTextAndClick("快速选择", { x: 248, y: 996, width: 121, height: 49 }); + await findAndClick(quickChooseRo); moveMouseTo(960, 540); await sleep(1000); - await click(370, 1020); // 点击“确认选择”按钮 - await sleep(1500); + await findAndClick(confirmRo);// 点击“确认选择”按钮 + await sleep(1000); decomposedNum = await recognizeTextInRegion(regionToCheck3); @@ -356,7 +362,7 @@ async function processArtifacts(times = 1) { await recognizeTextAndClick("分解", { x: 635, y: 991, width: 81, height: 57 }); await sleep(1000); } - await recognizeTextAndClick("快速选择", { x: 248, y: 996, width: 121, height: 49 }); + await findAndClick(quickChooseRo); moveMouseTo(960, 540); await sleep(1000); @@ -364,7 +370,7 @@ async function processArtifacts(times = 1) { await click(370, 370);//取消选择四星 await sleep(1000); } - await click(370, 1020); // 点击“确认选择”按钮 + await findAndClick(confirmRo);// 点击“确认选择”按钮 await sleep(1500); let decomposedNum2 = await recognizeTextInRegion(regionToCheck3); @@ -381,7 +387,7 @@ async function processArtifacts(times = 1) { log.info("识别失败"); } //识别当前总经验 - let regionToCheck2 = { x: 1500, y: 900, width: 150, height: 100 }; + let regionToCheck2 = { x: 1470, y: 880, width: 205, height: 70 }; let newNum = await recognizeTextInRegion(regionToCheck2); let newValue = 0; @@ -392,16 +398,20 @@ async function processArtifacts(times = 1) { log.warn(`在指定区域未识别到有效数字: ${newValue}`); } + if (settings.notify) { + notification.Send(`当前总经验: ${newValue}`); + } + if (settings.decomposeMode === "分解(经验瓶)") { log.info(`用户选择了分解,执行分解`); // 根据用户配置,分解狗粮 - await sleep(1000); - await click(1620, 1020); // 点击分解按钮 - await sleep(1000); + await sleep(500); - // 4. 识别"进行分解"按钮 - await click(1340, 755); // 点击进行分解按钮 + await findAndClick(doDecomposeRo); // 点击分解按钮 + await sleep(500); + // 4. "进行分解"按钮 + await findAndClick(doDecompose2Ro); // 点击进行分解按钮 await sleep(1000); // 5. 关闭确认界面 @@ -428,31 +438,33 @@ async function processArtifacts(times = 1) { return result; } - async function destroyArtifacts(times = 1) { - async function findAndClick(target) { + async function findAndClick(target, maxAttempts = 3) { + let attempts = 0; + while (attempts < maxAttempts) { gameRegion = captureGameRegion(); - gameRegion.find(target).click(); + let result = gameRegion.find(target); gameRegion.dispose(); + if (result.isExist) { + result.click(); + break; + } + attempts++; + await sleep(250 * attempts); } - await genshin.returnMainUi(); - keyPress("B"); - await sleep(1500); - const gameRegion = captureGameRegion(); - let ArtifactsButton = gameRegion.find(ArtifactsButtonRo); - gameRegion.dispose(); - if (ArtifactsButton.isExist()) { - log.info("识别到圣遗物按钮"); - ArtifactsButton.click(); - await sleep(1500); - } + } + async function destroyArtifacts(times = 1) { + await genshin.returnMainUi(); + await sleep(250); + keyPress("B"); + await sleep(250); + await findAndClick(ArtifactsButtonRo, 5); try { for (let i = 0; i < times; i++) { await findAndClick(DeleteButtonRo);// 点击摧毁 await sleep(600); await findAndClick(AutoAddButtonRo);// 点击自动添加 - await sleep(600); - await sleep(300); + await sleep(900); click(150, 150); await sleep(300); click(150, 220); @@ -555,6 +567,9 @@ async function mora() { } await sleep(500); tryTimes++; + if (settings.notify) { + notification.Send(`当前摩拉: ${Number(result)}`); + } await genshin.returnMainUi(); } return Number(result); @@ -718,7 +733,7 @@ async function readCDInfo(accountName) { if (Array.isArray(parsed) && parsed.every(item => typeof item === 'string')) { CDInfo = parsed; } else { - log.warn('文件内容不是字符串数组,使用空数组'); + log.warn('文件内容异常,使用默认状态'); CDInfo = []; } } catch (e) { @@ -732,7 +747,6 @@ async function readCDInfo(accountName) { //更新cd信息 async function writeCDInfo(accountName) { - log.info("修改CDInfo文件"); if (state.cancel) return; const CDInfoFilePath = `CDInfo/${accountName}.json`; await file.writeText(CDInfoFilePath, JSON.stringify(CDInfo), false); @@ -899,7 +913,7 @@ async function runPaths(folderFilePath, PartyName, doStop) { failcount++; skiprecord = true; log.warn(`路线${Path.fileName},没有正常完成,请检查是否开图`); - await sleep(1000); + await sleep(5000); } } catch (error) { log.error(`发生错误:${error.message}`); diff --git a/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json b/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json index 4d4456308..fb5085ce9 100644 --- a/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json +++ b/repo/js/AAA-Artifacts-Bulk-Supply/manifest.json @@ -1,11 +1,11 @@ { "manifest_version": 1, - "name": "AAA狗粮批发(测试版本)", - "version": "0.0.9", + "name": "AAA狗粮批发", + "version": "1.0.0", "tags": [ "狗粮" ], - "description": "直接借助普通路线实现卡时间获取最高狗粮收益", + "description": "直接利用普通路线来给收尾和额外路线卡时间,花最少的时间拿最多的狗粮", "saved_files": [ "records/*.txt" ],