js:狗粮重制版1.6.0 (#1359)
This commit is contained in:
@@ -171,7 +171,8 @@ https://www.kdocs.cn/wo/sl/v13uXscL
|
|||||||
|
|
||||||
|
|
||||||
## 更新日志
|
## 更新日志
|
||||||
|
### 1.6.0(2025.07.16)
|
||||||
|
1.新增摧毁换取摩拉的选项和沿途分解选项
|
||||||
### 1.5.9(2025.07.15)
|
### 1.5.9(2025.07.15)
|
||||||
1.微调(激活大炮第二炮掉出影响/204卡木条/216避开穷点/224避开书本/302微调/405微调/407微调/428微调/605微调)
|
1.微调(激活大炮第二炮掉出影响/204卡木条/216避开穷点/224避开书本/302微调/405微调/407微调/428微调/605微调)
|
||||||
### 1.5.7(2025.07.13)
|
### 1.5.7(2025.07.13)
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 3.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
@@ -9,6 +9,9 @@ let finished = false;
|
|||||||
const accountName = settings.accountName || "默认账户";
|
const accountName = settings.accountName || "默认账户";
|
||||||
let version = "default";
|
let version = "default";
|
||||||
let runnedToday = false;
|
let runnedToday = false;
|
||||||
|
let artifactExperienceDiff = 0;
|
||||||
|
let moraDiff = 0;
|
||||||
|
let pathIndex = 0;
|
||||||
|
|
||||||
//预处理
|
//预处理
|
||||||
const minIntervalTime = settings.minIntervalTime || "5";
|
const minIntervalTime = settings.minIntervalTime || "5";
|
||||||
@@ -20,6 +23,7 @@ const runActivatePath = settings.runActivatePath || false;
|
|||||||
let enemyType = "无";
|
let enemyType = "无";
|
||||||
|
|
||||||
(async function () {
|
(async function () {
|
||||||
|
setGameMetrics(1920, 1080, 1);
|
||||||
//伪造js结束记录
|
//伪造js结束记录
|
||||||
await fakeLog("自动狗粮重制版", true, true, 0);
|
await fakeLog("自动狗粮重制版", true, true, 0);
|
||||||
|
|
||||||
@@ -370,8 +374,12 @@ let enemyType = "无";
|
|||||||
}
|
}
|
||||||
|
|
||||||
//运行前按自定义配置清理狗粮
|
//运行前按自定义配置清理狗粮
|
||||||
const result1 = await decomposeArtifacts(settings.keep4Star, settings.doDecompose);
|
if (settings.decomposeMode === "分解(经验瓶)") {
|
||||||
|
await processArtifacts(21);
|
||||||
|
} else {
|
||||||
|
artifactExperienceDiff -= await processArtifacts(21);
|
||||||
|
}
|
||||||
|
moraDiff -= await mora();
|
||||||
artifacts: {
|
artifacts: {
|
||||||
if (runnedToday && finished) {
|
if (runnedToday && finished) {
|
||||||
break artifacts;
|
break artifacts;
|
||||||
@@ -379,19 +387,9 @@ let enemyType = "无";
|
|||||||
|
|
||||||
// 开始运行狗粮路线
|
// 开始运行狗粮路线
|
||||||
let runArtifactsResult = true;
|
let runArtifactsResult = true;
|
||||||
|
|
||||||
runArtifactsResult = await runArtifactsPaths(runRouteA, grindPartyName, settings.useABE);
|
runArtifactsResult = await runArtifactsPaths(runRouteA, grindPartyName, settings.useABE);
|
||||||
const result2 = await decomposeArtifacts(settings.keep4Star, settings.doDecompose);
|
artifactExperienceDiff += await processArtifacts(21);
|
||||||
// 计算 mora 和 artifactExperience 的差值
|
moraDiff += await mora();
|
||||||
const moraDiff = Number(result2.mora) - Number(result1.mora); // 将字符串转换为数字后计算差值
|
|
||||||
let artifactExperienceDiff;
|
|
||||||
if (!settings.doDecompose) {
|
|
||||||
artifactExperienceDiff = result2.artifactExperience - result1.artifactExperience;
|
|
||||||
} else {
|
|
||||||
artifactExperienceDiff = result2.artifactExperience;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
log.info(`狗粮路线获取摩拉: ${moraDiff}`);
|
log.info(`狗粮路线获取摩拉: ${moraDiff}`);
|
||||||
log.info(`狗粮路线获取狗粮经验: ${artifactExperienceDiff}`);
|
log.info(`狗粮路线获取狗粮经验: ${artifactExperienceDiff}`);
|
||||||
|
|
||||||
@@ -503,6 +501,10 @@ async function runArtifactsPaths(runRouteA, grindPartyName, useABE) {
|
|||||||
|
|
||||||
// 执行地图追踪文件
|
// 执行地图追踪文件
|
||||||
for (const fileName of jsonFilePaths) {
|
for (const fileName of jsonFilePaths) {
|
||||||
|
pathIndex++;
|
||||||
|
if ((pathIndex % 5 === 0) && settings.autoSalvage && settings.decomposeMode != "保留") {
|
||||||
|
artifactExperienceDiff += await processArtifacts(1);
|
||||||
|
}
|
||||||
const fullPath = fileName;
|
const fullPath = fileName;
|
||||||
await fakeLog(fileName, false, true, 0);
|
await fakeLog(fileName, false, true, 0);
|
||||||
currentTask += 1; // 更新当前任务计数器
|
currentTask += 1; // 更新当前任务计数器
|
||||||
@@ -934,12 +936,6 @@ function validateTimeoutSetting(value, defaultValue, timeoutType) {
|
|||||||
return timeout;
|
return timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 定义替换映射表
|
|
||||||
const replacementMap = {
|
|
||||||
"监": "盐",
|
|
||||||
"卵": "卯"
|
|
||||||
};
|
|
||||||
|
|
||||||
// 定义所有图标的图像识别对象,每个图片都有自己的识别区域
|
// 定义所有图标的图像识别对象,每个图片都有自己的识别区域
|
||||||
let CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/CharacterMenu.png"), 60, 991, 38, 38);
|
let CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/CharacterMenu.png"), 60, 991, 38, 38);
|
||||||
|
|
||||||
@@ -974,12 +970,7 @@ async function recognizeTextAndClick(targetText, ocrRegion, timeout = 3000) {
|
|||||||
let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域
|
let resList = captureGameRegion().findMulti(RecognitionObject.ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height)); // 指定识别区域
|
||||||
// 遍历识别结果,检查是否找到目标文本
|
// 遍历识别结果,检查是否找到目标文本
|
||||||
for (let res of resList) {
|
for (let res of resList) {
|
||||||
// 后处理:根据替换映射表检查和替换错误识别的字符
|
|
||||||
let correctedText = res.text;
|
let correctedText = res.text;
|
||||||
for (let [wrongChar, correctChar] of Object.entries(replacementMap)) {
|
|
||||||
correctedText = correctedText.replace(new RegExp(wrongChar, 'g'), correctChar);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (correctedText.includes(targetText)) {
|
if (correctedText.includes(targetText)) {
|
||||||
// 如果找到目标文本,计算并点击文字的中心坐标
|
// 如果找到目标文本,计算并点击文字的中心坐标
|
||||||
let centerX = Math.round(res.x + res.width / 2);
|
let centerX = Math.round(res.x + res.width / 2);
|
||||||
@@ -1024,7 +1015,7 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) {
|
|||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
retryCount++; // 增加重试计数
|
retryCount++; // 增加重试计数
|
||||||
log.warn(`OCR 摩拉数识别失败,正在进行第 ${retryCount} 次重试...`);
|
log.warn(`OCR 识别失败,正在进行第 ${retryCount} 次重试...`);
|
||||||
}
|
}
|
||||||
await sleep(500); // 短暂延迟,避免过快循环
|
await sleep(500); // 短暂延迟,避免过快循环
|
||||||
}
|
}
|
||||||
@@ -1032,8 +1023,204 @@ async function recognizeTextInRegion(ocrRegion, timeout = 5000) {
|
|||||||
return null; // 如果未识别到文字,返回 null
|
return null; // 如果未识别到文字,返回 null
|
||||||
}
|
}
|
||||||
|
|
||||||
async function decomposeArtifacts(keep4Star, doDecompose) {
|
async function decomposeArtifacts() {
|
||||||
setGameMetrics(1920, 1080, 1);
|
keyPress("B");
|
||||||
|
await sleep(1000);
|
||||||
|
await click(670, 45);
|
||||||
|
await sleep(500);
|
||||||
|
|
||||||
|
await recognizeTextAndClick("分解", { x: 635, y: 991, width: 81, height: 57 });
|
||||||
|
await sleep(1000);
|
||||||
|
|
||||||
|
//识别已储存经验(1570-880-1650-930)
|
||||||
|
let regionToCheck1 = { x: 1570, y: 880, width: 80, height: 50 };
|
||||||
|
let initialNum = await recognizeTextInRegion(regionToCheck1);
|
||||||
|
let initialValue = 0;
|
||||||
|
|
||||||
|
if (initialNum && !isNaN(parseInt(initialNum, 10))) {
|
||||||
|
initialValue = parseInt(initialNum, 10);
|
||||||
|
log.info(`已储存经验识别成功: ${initialValue}`);
|
||||||
|
} else {
|
||||||
|
log.warn(`在指定区域未识别到有效数字: ${initialValue}`);
|
||||||
|
}
|
||||||
|
let regionToCheck3 = { x: 100, y: 885, width: 170, height: 50 };
|
||||||
|
let decomposedNum = 0;
|
||||||
|
let firstNumber = 0;
|
||||||
|
let firstNumber2 = 0;
|
||||||
|
|
||||||
|
if (settings.keep4Star) {
|
||||||
|
await recognizeTextAndClick("快速选择", { x: 248, y: 996, width: 121, height: 49 });
|
||||||
|
moveMouseTo(960, 540);
|
||||||
|
await sleep(1000);
|
||||||
|
|
||||||
|
await click(370, 1020); // 点击“确认选择”按钮
|
||||||
|
await sleep(1500);
|
||||||
|
|
||||||
|
decomposedNum = await recognizeTextInRegion(regionToCheck3);
|
||||||
|
|
||||||
|
// 使用正则表达式提取第一个数字
|
||||||
|
const match = decomposedNum.match(/已选(\d+)/);
|
||||||
|
|
||||||
|
// 检查是否匹配成功
|
||||||
|
if (match) {
|
||||||
|
// 将匹配到的第一个数字转换为数字类型并存储在变量中
|
||||||
|
firstNumber = Number(match[1]);
|
||||||
|
log.info(`1-4星总数量: ${firstNumber}`);
|
||||||
|
} else {
|
||||||
|
log.info("识别失败");
|
||||||
|
}
|
||||||
|
keyPress("VK_ESCAPE");
|
||||||
|
|
||||||
|
|
||||||
|
await recognizeTextAndClick("分解", { x: 635, y: 991, width: 81, height: 57 });
|
||||||
|
await sleep(1000);
|
||||||
|
}
|
||||||
|
await recognizeTextAndClick("快速选择", { x: 248, y: 996, width: 121, height: 49 });
|
||||||
|
moveMouseTo(960, 540);
|
||||||
|
await sleep(1000);
|
||||||
|
|
||||||
|
if (settings.keep4Star) {
|
||||||
|
await click(370, 370);//取消选择四星
|
||||||
|
await sleep(1000);
|
||||||
|
}
|
||||||
|
await click(370, 1020); // 点击“确认选择”按钮
|
||||||
|
await sleep(1500);
|
||||||
|
|
||||||
|
let decomposedNum2 = await recognizeTextInRegion(regionToCheck3);
|
||||||
|
|
||||||
|
// 使用正则表达式提取第一个数字
|
||||||
|
const match2 = decomposedNum2.match(/已选(\d+)/);
|
||||||
|
|
||||||
|
// 检查是否匹配成功
|
||||||
|
if (match2) {
|
||||||
|
// 将匹配到的第一个数字转换为数字类型并存储在变量中
|
||||||
|
firstNumber2 = Number(match2[1]);
|
||||||
|
log.info(`分解总数是: ${firstNumber2}`);
|
||||||
|
} else {
|
||||||
|
log.info("识别失败");
|
||||||
|
}
|
||||||
|
//识别当前总经验
|
||||||
|
let regionToCheck2 = { x: 1500, y: 900, width: 150, height: 100 };
|
||||||
|
let newNum = await recognizeTextInRegion(regionToCheck2);
|
||||||
|
let newValue = 0;
|
||||||
|
|
||||||
|
if (newNum && !isNaN(parseInt(newNum, 10))) {
|
||||||
|
newValue = parseInt(newNum, 10);
|
||||||
|
log.info(`当前总经验识别成功: ${newValue}`);
|
||||||
|
} else {
|
||||||
|
log.warn(`在指定区域未识别到有效数字: ${newValue}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.decomposeMode === "分解(经验瓶)") {
|
||||||
|
log.info(`用户选择了分解,执行分解`);
|
||||||
|
// 根据用户配置,分解狗粮
|
||||||
|
await sleep(1000);
|
||||||
|
await click(1620, 1020); // 点击分解按钮
|
||||||
|
await sleep(1000);
|
||||||
|
|
||||||
|
// 4. 识别"进行分解"按钮
|
||||||
|
await click(1340, 755); // 点击进行分解按钮
|
||||||
|
|
||||||
|
await sleep(1000);
|
||||||
|
|
||||||
|
// 5. 关闭确认界面
|
||||||
|
await click(1340, 755);
|
||||||
|
await sleep(1000);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log.info(`用户未选择分解,不执行分解`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. 计算分解获得经验=总经验-上次剩余
|
||||||
|
const resinExperience = Math.max(newValue - initialValue, 0);
|
||||||
|
log.info(`分解可获得经验: ${resinExperience}`);
|
||||||
|
let fourStarNum = firstNumber - firstNumber2;
|
||||||
|
if (settings.keep4Star) {
|
||||||
|
log.info(`保留的四星数量: ${fourStarNum}`);
|
||||||
|
}
|
||||||
|
let resultExperience = resinExperience;
|
||||||
|
if (resultExperience === 0) {
|
||||||
|
resultExperience = initialValue;
|
||||||
|
}
|
||||||
|
const result = resultExperience;
|
||||||
|
await genshin.returnMainUi();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 摧毁圣遗物换摩拉
|
||||||
|
*/
|
||||||
|
async function destroyArtifacts(times = 1) {
|
||||||
|
const ArtifactsButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/ArtifactsButton.png"));
|
||||||
|
const DeleteButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/DeleteButton.png"));
|
||||||
|
const AutoAddButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/AutoAddButton.png"));
|
||||||
|
const ConfirmButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/ConfirmButton.png"));
|
||||||
|
const DestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/DestoryButton.png"));
|
||||||
|
const MidDestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/DestoryButton.png"), 900, 600, 500, 300);
|
||||||
|
await genshin.returnMainUi();
|
||||||
|
keyPress("B");
|
||||||
|
await sleep(1500);
|
||||||
|
|
||||||
|
let ArtifactsButton = captureGameRegion().find(ArtifactsButtonRo);
|
||||||
|
if (ArtifactsButton.isExist()) {
|
||||||
|
log.info("识别到圣遗物按钮");
|
||||||
|
ArtifactsButton.click();
|
||||||
|
await sleep(1500);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
for (let i = 0; i < times; i++) {
|
||||||
|
captureGameRegion().find(DeleteButtonRo).click();// 点击摧毁
|
||||||
|
await sleep(600);
|
||||||
|
captureGameRegion().find(AutoAddButtonRo).click();// 点击自动添加
|
||||||
|
await sleep(600);
|
||||||
|
await sleep(300);
|
||||||
|
click(150, 150);
|
||||||
|
await sleep(300);
|
||||||
|
click(150, 220);
|
||||||
|
await sleep(300);
|
||||||
|
click(150, 300);
|
||||||
|
if (!settings.keep4Star) {
|
||||||
|
await sleep(300);
|
||||||
|
click(150, 370);
|
||||||
|
}
|
||||||
|
captureGameRegion().find(ConfirmButtonRo).click();// 点击快捷放入
|
||||||
|
await sleep(600);
|
||||||
|
captureGameRegion().find(DestoryButtonRo).click();// 点击摧毁
|
||||||
|
await sleep(600);
|
||||||
|
captureGameRegion().find(MidDestoryButtonRo).click();// 弹出页面点击摧毁
|
||||||
|
await sleep(600);
|
||||||
|
click(960, 1000);// 点击空白处
|
||||||
|
await sleep(1000);
|
||||||
|
}
|
||||||
|
} catch (ex) {
|
||||||
|
log.info("背包里的圣遗物已摧毁完毕,提前结束")
|
||||||
|
} finally {
|
||||||
|
await genshin.returnMainUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async function processArtifacts(times = 1) {
|
||||||
|
await genshin.returnMainUi();
|
||||||
|
let result = 0;
|
||||||
|
try {
|
||||||
|
if (settings.decomposeMode === "销毁(摩拉)") {
|
||||||
|
result = await destroyArtifacts(times);
|
||||||
|
} else {
|
||||||
|
result = await decomposeArtifacts();
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
log.error(`处理狗粮分解时发生异常: ${error.message}`);
|
||||||
|
}
|
||||||
|
await genshin.returnMainUi();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function mora() {
|
||||||
|
let result = 0;
|
||||||
|
let tryTimes = 0;
|
||||||
|
while (result = 0 && tryTimes < 3) {
|
||||||
await genshin.returnMainUi();
|
await genshin.returnMainUi();
|
||||||
|
|
||||||
// 按下 C 键
|
// 按下 C 键
|
||||||
@@ -1075,140 +1262,16 @@ async function decomposeArtifacts(keep4Star, doDecompose) {
|
|||||||
recognizedText = await recognizeTextInRegion(ocrRegionMora);
|
recognizedText = await recognizeTextInRegion(ocrRegionMora);
|
||||||
if (recognizedText) {
|
if (recognizedText) {
|
||||||
log.info(`成功识别到摩拉数值: ${recognizedText}`);
|
log.info(`成功识别到摩拉数值: ${recognizedText}`);
|
||||||
|
result = recognizedText;
|
||||||
} else {
|
} else {
|
||||||
log.warn("未能识别到摩拉数值。");
|
log.warn("未能识别到摩拉数值。");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.warn("未能识别到角色菜单或天赋,跳过摩拉数值识别。");
|
log.warn("未能识别到角色菜单或天赋");
|
||||||
}
|
}
|
||||||
await sleep(500);
|
await sleep(500);
|
||||||
|
tryTimes++;
|
||||||
await genshin.returnMainUi();
|
await genshin.returnMainUi();
|
||||||
|
|
||||||
keyPress("B");
|
|
||||||
await sleep(1000);
|
|
||||||
await click(670, 45);
|
|
||||||
await sleep(500);
|
|
||||||
|
|
||||||
await recognizeTextAndClick("分解", { x: 635, y: 991, width: 81, height: 57 });
|
|
||||||
await sleep(1000);
|
|
||||||
|
|
||||||
//识别已储存经验(1570-880-1650-930)
|
|
||||||
let regionToCheck1 = { x: 1570, y: 880, width: 80, height: 50 };
|
|
||||||
let initialNum = await recognizeTextInRegion(regionToCheck1);
|
|
||||||
let initialValue = 0;
|
|
||||||
|
|
||||||
if (initialNum && !isNaN(parseInt(initialNum, 10))) {
|
|
||||||
initialValue = parseInt(initialNum, 10);
|
|
||||||
log.info(`已储存经验识别成功: ${initialValue}`);
|
|
||||||
} else {
|
|
||||||
log.warn(`在指定区域未识别到有效数字: ${initialValue}`);
|
|
||||||
}
|
}
|
||||||
let regionToCheck3 = { x: 100, y: 885, width: 170, height: 50 };
|
return Number(result);
|
||||||
let decomposedNum = 0;
|
|
||||||
let firstNumber = 0;
|
|
||||||
let firstNumber2 = 0;
|
|
||||||
|
|
||||||
if (keep4Star) {
|
|
||||||
await recognizeTextAndClick("快速选择", { x: 248, y: 996, width: 121, height: 49 });
|
|
||||||
moveMouseTo(960, 540);
|
|
||||||
await sleep(1000);
|
|
||||||
|
|
||||||
await click(370, 1020); // 点击“确认选择”按钮
|
|
||||||
await sleep(1500);
|
|
||||||
|
|
||||||
decomposedNum = await recognizeTextInRegion(regionToCheck3);
|
|
||||||
|
|
||||||
// 使用正则表达式提取第一个数字
|
|
||||||
const match = decomposedNum.match(/已选(\d+)/);
|
|
||||||
|
|
||||||
// 检查是否匹配成功
|
|
||||||
if (match) {
|
|
||||||
// 将匹配到的第一个数字转换为数字类型并存储在变量中
|
|
||||||
firstNumber = Number(match[1]);
|
|
||||||
log.info(`1-4星总数量: ${firstNumber}`);
|
|
||||||
} else {
|
|
||||||
log.info("识别失败");
|
|
||||||
}
|
|
||||||
keyPress("VK_ESCAPE");
|
|
||||||
|
|
||||||
|
|
||||||
await recognizeTextAndClick("分解", { x: 635, y: 991, width: 81, height: 57 });
|
|
||||||
await sleep(1000);
|
|
||||||
}
|
|
||||||
await recognizeTextAndClick("快速选择", { x: 248, y: 996, width: 121, height: 49 });
|
|
||||||
moveMouseTo(960, 540);
|
|
||||||
await sleep(1000);
|
|
||||||
|
|
||||||
if (keep4Star) {
|
|
||||||
await click(370, 370);//取消选择四星
|
|
||||||
await sleep(1000);
|
|
||||||
}
|
|
||||||
await click(370, 1020); // 点击“确认选择”按钮
|
|
||||||
await sleep(1500);
|
|
||||||
|
|
||||||
let decomposedNum2 = await recognizeTextInRegion(regionToCheck3);
|
|
||||||
|
|
||||||
// 使用正则表达式提取第一个数字
|
|
||||||
const match2 = decomposedNum2.match(/已选(\d+)/);
|
|
||||||
|
|
||||||
// 检查是否匹配成功
|
|
||||||
if (match2) {
|
|
||||||
// 将匹配到的第一个数字转换为数字类型并存储在变量中
|
|
||||||
firstNumber2 = Number(match2[1]);
|
|
||||||
log.info(`分解总数是: ${firstNumber2}`);
|
|
||||||
} else {
|
|
||||||
log.info("识别失败");
|
|
||||||
}
|
|
||||||
//识别当前总经验
|
|
||||||
let regionToCheck2 = { x: 1500, y: 900, width: 150, height: 100 };
|
|
||||||
let newNum = await recognizeTextInRegion(regionToCheck2);
|
|
||||||
let newValue = 0;
|
|
||||||
|
|
||||||
if (newNum && !isNaN(parseInt(newNum, 10))) {
|
|
||||||
newValue = parseInt(newNum, 10);
|
|
||||||
log.info(`当前总经验识别成功: ${newValue}`);
|
|
||||||
} else {
|
|
||||||
log.warn(`在指定区域未识别到有效数字: ${newValue}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doDecompose) {
|
|
||||||
log.info(`用户选择了分解,执行分解`);
|
|
||||||
// 根据用户配置,分解狗粮
|
|
||||||
await sleep(1000);
|
|
||||||
await click(1620, 1020); // 点击分解按钮
|
|
||||||
await sleep(1000);
|
|
||||||
|
|
||||||
// 4. 识别"进行分解"按钮
|
|
||||||
await click(1340, 755); // 点击进行分解按钮
|
|
||||||
|
|
||||||
await sleep(1000);
|
|
||||||
|
|
||||||
// 5. 关闭确认界面
|
|
||||||
await click(1340, 755);
|
|
||||||
await sleep(1000);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
log.info(`用户未选择分解,不执行分解`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 7. 计算分解获得经验=总经验-上次剩余
|
|
||||||
const resinExperience = Math.max(newValue - initialValue, 0);
|
|
||||||
log.info(`分解可获得经验: ${resinExperience}`);
|
|
||||||
let fourStarNum = firstNumber - firstNumber2;
|
|
||||||
if (settings.keep4Star) {
|
|
||||||
log.info(`保留的四星数量: ${fourStarNum}`);
|
|
||||||
}
|
|
||||||
let resultExperience = resinExperience;
|
|
||||||
if (resultExperience === 0) {
|
|
||||||
resultExperience = initialValue;
|
|
||||||
}
|
|
||||||
const result = {
|
|
||||||
mora: recognizedText, // 将 recognizedText 赋值给 mora
|
|
||||||
artifactExperience: resultExperience,
|
|
||||||
fourStarNum: fourStarNum
|
|
||||||
};
|
|
||||||
await genshin.returnMainUi();
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 1,
|
"manifest_version": 1,
|
||||||
"name": "自动狗粮重制版",
|
"name": "自动狗粮重制版",
|
||||||
"version": "1.5.9",
|
"version": "1.6.0",
|
||||||
"tags": [
|
"tags": [
|
||||||
"好感",
|
"好感",
|
||||||
"狗粮"
|
"狗粮"
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
{
|
{
|
||||||
"name": "runActivatePath",
|
"name": "runActivatePath",
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"label": "是否启用激活路线,启用后将先花费约3分钟激活狗粮点\n启用该选项后可提高稳定性,并允许中断后重新运行和极大降低最短间隔时间"
|
"label": "是否启用激活路线,启用后将先花费约5分钟激活狗粮点\n启用该选项后可提高稳定性,并允许极大降低最短间隔时间"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "useABE",
|
"name": "useABE",
|
||||||
@@ -47,15 +47,26 @@
|
|||||||
"default": "狗粮"
|
"default": "狗粮"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "doDecompose",
|
"name": "decomposeMode",
|
||||||
"type": "checkbox",
|
"type": "select",
|
||||||
"label": "是否分解狗粮(默认不分解)"
|
"label": "狗粮分解模式",
|
||||||
|
"options": [
|
||||||
|
"保留",
|
||||||
|
"分解(经验瓶)",
|
||||||
|
"销毁(摩拉)"
|
||||||
|
],
|
||||||
|
"default": "保留"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "keep4Star",
|
"name": "keep4Star",
|
||||||
"type": "checkbox",
|
"type": "checkbox",
|
||||||
"label": "是否保留四星(默认不保留)"
|
"label": "是否保留四星(默认不保留)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "autoSalvage",
|
||||||
|
"type": "checkbox",
|
||||||
|
"label": "是否沿路自动分解(默认:否)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "minIntervalTime",
|
"name": "minIntervalTime",
|
||||||
"type": "input-text",
|
"type": "input-text",
|
||||||
|
|||||||
Reference in New Issue
Block a user