修了个bug (#1680)

This commit is contained in:
DarkFlameMaster
2025-08-23 21:55:55 +08:00
committed by GitHub
parent 729375df1a
commit 7df93d4dc9
4 changed files with 61 additions and 26 deletions

View File

@@ -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
* 初版发布

View File

@@ -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 {

View File

@@ -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": [
{

View File

@@ -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}`);
}
}