From 7df93d4dc99c7ec96b19e47d560839c06c064f5b Mon Sep 17 00:00:00 2001 From: DarkFlameMaster <1004452714@qq.com> Date: Sat, 23 Aug 2025 21:55:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E4=BA=86=E4=B8=AAbug=20(#1680)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- repo/js/批量讨伐角色养成材料BOSS/README.md | 12 +++- repo/js/批量讨伐角色养成材料BOSS/main.js | 57 ++++++++++++------- .../js/批量讨伐角色养成材料BOSS/manifest.json | 2 +- repo/js/批量讨伐角色养成材料BOSS/reward.js | 16 +++++- 4 files changed, 61 insertions(+), 26 deletions(-) diff --git a/repo/js/批量讨伐角色养成材料BOSS/README.md b/repo/js/批量讨伐角色养成材料BOSS/README.md index d301939b2..229512c34 100644 --- a/repo/js/批量讨伐角色养成材料BOSS/README.md +++ b/repo/js/批量讨伐角色养成材料BOSS/README.md @@ -97,10 +97,18 @@ ## 六、更新日志 -### 2025.08.21 + +### 2025.08.23 V0.3 + +* fix 修复奖励未领取成功,提前传送的bug +* fix 修复奖励未领取成功,仍然会计数已完成的bug +* update 改了一下boss列表展示的排版 + +### 2025.08.21 * fix 截图资源未释放 * update 地图追踪文件 【从别的大佬那里偷来的】 -### 2025.08.21 + +### 2025.08.21 V0.1 * 初版发布 diff --git a/repo/js/批量讨伐角色养成材料BOSS/main.js b/repo/js/批量讨伐角色养成材料BOSS/main.js index b649071db..171b640e6 100644 --- a/repo/js/批量讨伐角色养成材料BOSS/main.js +++ b/repo/js/批量讨伐角色养成材料BOSS/main.js @@ -1,3 +1,4 @@ +eval(file.readTextSync("reward.js")); (async function () { try { /** @@ -48,23 +49,41 @@ * @param {boolean} returnToStatueAfterEachRound - 是否在每次讨伐后回到七天神像。 */ async function runMain() { - - eval(file.readTextSync("reward.js")); + // --- 打印所有Boss的剩余次数 --- for (let i = 0; i < config.length; i++) { - log.info(`🎵${config[i]["name"]} - 剩余: ${config[i]["remainingCount"]}/${config[i]["totalCount"]}, 队伍: ${config[i]["team"]}`); - //BGI的遮罩日志是12行 - if (i % 11 === 0 && i > 0) { - log.info("⌛️5秒后显示下一页"); - await sleep(5000); + if (i % 10 === 0) { + let currentPage = Math.floor(i / 10) + 1; + log.info(`--- 当前boss队列 (第 ${currentPage} 页) ---`); } - }; + log.info(`🎵${i + 1}.${config[i]["name"]} - 剩余: ${config[i]["remainingCount"]}/${config[i]["totalCount"]}, 队伍: ${config[i]["team"]}`); + + const isEndOfPage = (i + 1) % 10 === 0; + const isLastItem = i === config.length - 1; + + if (isEndOfPage || isLastItem) { + // 补齐空行到10行 + const linesToPad = 10 - (i - (Math.floor(i / 10) * 10) + 1); + for (let p = 0; p < linesToPad; p++) { + log.info(""); + } + + if (isEndOfPage && !isLastItem) { + let currentPage = Math.floor((i + 1) / 10); + log.info(`⌛️当前第 ${currentPage} 页结束,5秒后显示下一页`); + await sleep(5000); + } else if (isLastItem) { + log.info(`🔚列表显示完毕,5秒后继续`); + await sleep(5000); + } + } + } try { + let isClaimFailed = false; // --- 遍历Boss列表 --- for (const boss of config) { let goToBoss = true; - let isClaimFailed = false; const returnToStatueAfterEachRound = boss.returnToStatueAfterEachRound // --- 检查体力是否足够 --- @@ -91,12 +110,8 @@ break; // --- 体力不足,停止讨伐 --- } - log.info(`🪧` + - `当前进度:讨伐『${boss.name}』,` + - `第${round}/${boss.remainingCount}次,` + - `使用队伍:${boss.team},` + - `每轮后回七天神像:${returnToStatueAfterEachRound ? '是' : '否'}`); - + log.info(`📢当前进度:讨伐『${boss.name}』,第${round}/${boss.remainingCount}次`); + log.info(`使用队伍:${boss.team},每轮回七天神像:${returnToStatueAfterEachRound ? '是' : '否'}`); for (let attempt = 1; attempt <= 2; attempt++) { //体力不足和战斗成功后无需重试 @@ -112,16 +127,18 @@ log.info(`⚔️开始第 ${attempt} 次讨伐尝试`); await dispatcher.runTask(new SoloTask("AutoFight")); await autoNavigateToReward(); - await takeReward(isClaimFailed); + isClaimFailed = await takeReward(isClaimFailed); battleSuccess = true; goToBoss = false; // === 更新 讨伐完成次数 与 剩余讨伐次数 === - boss.remainingCount--; - boss.completedCount++; + if (!isClaimFailed) { + boss.remainingCount--; + boss.completedCount++; + }; break; } catch (error) { - log.error(`❌讨伐『${boss.name}』失败,error: ${error}`); + log.error(`❌讨伐『${boss.name}』失败: ${error}`); battleSuccess = false; continue; }; @@ -140,7 +157,7 @@ goToBoss = true; }; - if (!goToBoss && boss.remainingCount > 0) { + if (!goToBoss && boss.remainingCount > 0 && !isClaimFailed) { if (["歌裴莉娅的葬送", "科培琉司的劫罚", "纯水精灵"].includes(boss.name)) { await pathingScript.runFile(`assets/Pathing/${boss.name}战斗后快速前往.json`); } else { diff --git a/repo/js/批量讨伐角色养成材料BOSS/manifest.json b/repo/js/批量讨伐角色养成材料BOSS/manifest.json index df9c9ae4c..cc949f5ce 100644 --- a/repo/js/批量讨伐角色养成材料BOSS/manifest.json +++ b/repo/js/批量讨伐角色养成材料BOSS/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "批量讨伐角色养成材料BOSS", - "version": "0.1", + "version": "0.3", "description": "一次性配置多个角色材料的boss,体力不足时保存进度,每次运行时断点续打。\n\n感谢boss地图追踪作者:@柒叶子@Tool_tingsu,\n\n感谢 @柒叶子【首领讨伐一条龙 - 首领连续讨伐】的地脉花寻路的代码实现 \n\n感谢@wjdsg @Tool_tingsu【纪行周常-10个boss一条龙】循环讨伐的代码实现", "authors": [ { diff --git a/repo/js/批量讨伐角色养成材料BOSS/reward.js b/repo/js/批量讨伐角色养成材料BOSS/reward.js index eaf56f100..6cef7e1d2 100644 --- a/repo/js/批量讨伐角色养成材料BOSS/reward.js +++ b/repo/js/批量讨伐角色养成材料BOSS/reward.js @@ -79,43 +79,52 @@ async function autoNavigateToReward() { async function takeReward(isClaimFailed) { try { const mainUiRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/mainUi.png")); - while (true) { + for (let attempt = 1; attempt <= 100; attempt++) { + log.debug(`尝试领取奖励,第${attempt}次`); captureRegion = captureGameRegion(); // 点击F领取Boss地脉花 + log.debug("尝试接触征讨之花"); let rewardTextArea = captureRegion.DeriveCrop(1210, 515, 200, 50); let rewardResult = rewardTextArea.find(RecognitionObject.ocrThis); if (rewardResult.text === "接触征讨之花" && isClaimFailed == false) { keyPress("F"); await sleep(1000); + captureRegion = captureGameRegion(); } // 使用脆弱树脂领取奖励 let useTextArea = captureRegion.DeriveCrop(850, 740, 250, 35); let useResult = useTextArea.find(RecognitionObject.ocrThis); + log.debug("领取奖励检测到文字: " + useResult.text); if (useResult.text.includes("补充")) { log.info("脆弱树脂不足,跳过领取"); click(1345, 300); await sleep(1000); + captureRegion = captureGameRegion(); isClaimFailed = true; } else if (useResult.text.includes("使用")) { log.info("使用脆弱树脂领取奖励"); click(useResult.x, useResult.y); + captureRegion = captureGameRegion(); await sleep(3000); } // 关闭奖励界面 let closeRewardUi = captureRegion.DeriveCrop(860, 970, 200, 28); let closeResult = closeRewardUi.find(RecognitionObject.ocrThis); + log.debug("底部检测到文字: " + closeResult.text); if (closeResult.text.includes("点击")){ click(975, 1000);//点击空白区域 await sleep(1000); + captureRegion = captureGameRegion(); } // 检查是否回到主界面 let inMainUi = captureRegion.Find(mainUiRo); - if (inMainUi.x > 0) { + if (inMainUi.x > 0 && !useResult.text.includes("树脂")) { + log.debug("回到主界面"); return isClaimFailed; } captureRegion.Dispose(); @@ -125,8 +134,9 @@ async function takeReward(isClaimFailed) { await sleep(500); } + throw new Error('领取奖励超时'); } catch (error) { - log.error(`领取奖励失败,error: ${error}`); + log.error(`领取奖励失败: ${error}`); } } \ No newline at end of file