mirror of
https://github.com/babalae/bettergi-scripts-list.git
synced 2026-03-30 05:49:51 +08:00
- 更新settings.json中树脂耗尽项的name - 完善树脂耗尽模式,执行结束后再次检查树脂情况,有限次递归调用确保树脂耗尽(常规情况下不会执行到递归逻辑) - 引入树脂统计模块,能够统计可供消耗的树脂 - 修复用书找地脉花检测大地图图像识别失败的问题
190 lines
5.1 KiB
JavaScript
190 lines
5.1 KiB
JavaScript
// 齿轮图标识别对象
|
||
const mapSettingButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/icon/map_setting_button.bmp"));
|
||
|
||
/**
|
||
* 通过冒险之证查找地脉花位置
|
||
* @param {string} country - 国家名称
|
||
* @param {string} type - 地脉花类型
|
||
* @returns {Promise<void>}
|
||
*/
|
||
this.findLeyLineOutcropByBook = async function (country, type) {
|
||
await genshin.returnMainUi();
|
||
await sleep(1000);
|
||
log.info("使用冒险之证寻找地脉花");
|
||
|
||
// 确保运行时位于主界面
|
||
keyPress("F1");
|
||
// 开书等待时间延长至2.5s
|
||
await sleep(2500);
|
||
click(300, 550); // 点击讨伐
|
||
await sleep(1000);
|
||
click(500, 200); // 点击筛选
|
||
await sleep(1000);
|
||
click(500, 500); // 点击其他
|
||
await sleep(1000);
|
||
|
||
// 选择地脉花类型
|
||
if (type === "蓝花(经验书)") {
|
||
click(700, 350); // 点击经验花
|
||
} else {
|
||
click(500, 350); // 点击摩拉花
|
||
}
|
||
await sleep(1000);
|
||
click(1300, 800); // 点击推荐
|
||
await sleep(1000);
|
||
|
||
// 查找并点击指定国家
|
||
await this.findAndClickCountry(country);
|
||
|
||
// 查找并点击停止追踪按钮
|
||
await this.findAndCancelTrackingInBook();
|
||
|
||
// 最多重试3次确保大地图正确打开
|
||
for (let retry = 0; retry < 3; retry++) {
|
||
await sleep(1000);
|
||
click(1500, 850);
|
||
// 等待大地图打开延长至 2.5s
|
||
await sleep(2500);
|
||
|
||
if (await this.checkBigMapOpened()) {
|
||
log.info("识别到大地图");
|
||
break; // 成功打开大地图
|
||
}
|
||
|
||
if (retry < 2) { // 不是最后一次重试
|
||
log.info(`大地图未正确打开,第${retry + 1}次重试...`);
|
||
await genshin.returnMainUi();
|
||
await this.findAndClickCountry(country);
|
||
await this.findAndCancelTrackingInBook();
|
||
} else {
|
||
throw new Error("大地图打开失败,已重试3次");
|
||
}
|
||
}
|
||
|
||
// 获取地脉花位置
|
||
const center = genshin.getPositionFromBigMap();
|
||
leyLineX = center.x;
|
||
leyLineY = center.y;
|
||
log.info(`找到地脉花的坐标:(${leyLineX}, ${leyLineY})`);
|
||
|
||
// 取消追踪
|
||
await this.cancelTrackingInMap();
|
||
};
|
||
|
||
/**
|
||
* 检测大地图是否正确打开(通过检测齿轮图标)
|
||
* @returns {Promise<boolean>} 返回是否检测到齿轮图标
|
||
* @private
|
||
*/
|
||
this.checkBigMapOpened = async function() {
|
||
let captureRegion = captureGameRegion();
|
||
try {
|
||
const imageResult = captureGameRegion().find(mapSettingButtonRo);
|
||
return imageResult.isExist();
|
||
} finally {
|
||
captureRegion.dispose();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 查找并点击指定国家
|
||
* @param {string} country - 国家名称
|
||
* @private
|
||
*/
|
||
this.findAndClickCountry = async function (country) {
|
||
// 挪德卡莱会被识别成挪德卡菜,需要特殊处理
|
||
let match_country = country;
|
||
if (country === "挪德卡莱") {
|
||
match_country = "挪德卡";
|
||
}
|
||
let captureRegion = captureGameRegion();
|
||
try {
|
||
let resList = captureRegion.findMulti(ocrRoThis);
|
||
let found = false;
|
||
for (let i = 0; i < resList.count; i++) {
|
||
let res = resList[i];
|
||
if (res.text.includes(match_country)) {
|
||
res.click();
|
||
found = true;
|
||
break;
|
||
}
|
||
}
|
||
if (!found) {
|
||
// 没找到国家
|
||
throw new Error("冒险之征中未找到国家:" + country + ",请检查该国家地图是否开启");
|
||
}
|
||
} finally {
|
||
captureRegion.dispose();
|
||
}
|
||
};
|
||
|
||
/**
|
||
* 在冒险之征中查找并点击停止追踪按钮
|
||
* @private
|
||
*/
|
||
this.findAndCancelTrackingInBook = async function () {
|
||
let captureRegion = captureGameRegion();
|
||
try {
|
||
let resList = captureRegion.findMulti(ocrRoThis);
|
||
let stop = null;
|
||
for (let i = 0; i < resList.count; i++) {
|
||
let res = resList[i];
|
||
if (res.text.includes("停止")) {
|
||
stop = res;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(stop) {
|
||
log.info("冒险之征中点击停止追踪并重新追踪获取坐标");
|
||
stop.click();
|
||
} else {
|
||
log.info("冒险之征中无需取消追踪");
|
||
}
|
||
} finally {
|
||
captureRegion.dispose();
|
||
}
|
||
await sleep(1000);
|
||
};
|
||
|
||
/**
|
||
* 在地图中取消地脉花追踪
|
||
* @private
|
||
*/
|
||
this.cancelTrackingInMap = async function () {
|
||
// 点击地脉花(因为从书点击追踪后花会在屏幕正中间)
|
||
click(960, 540);
|
||
await sleep(1000);
|
||
|
||
let captureRegion = captureGameRegion();
|
||
let stop = null;
|
||
let leyLine = null;
|
||
|
||
try {
|
||
let resList = captureRegion.findMulti(ocrRoThis);
|
||
if (resList && resList.count > 0) {
|
||
for (let i = 0; i < resList.count; i++) {
|
||
let res = resList[i];
|
||
if (res.text.includes("停止")) {
|
||
stop = res;
|
||
} else if (res.text.includes("地脉") || res.text.includes("衍出")) {
|
||
leyLine = res;
|
||
}
|
||
}
|
||
}
|
||
} finally {
|
||
captureRegion.dispose();
|
||
}
|
||
|
||
|
||
if (stop) {
|
||
log.info("地图中点击取消追踪");
|
||
stop.click();
|
||
} else if (leyLine) {
|
||
log.info("在地图中选择地脉花后点击取消追踪");
|
||
leyLine.click();
|
||
await sleep(1000);
|
||
click(1700, 1010);
|
||
await sleep(1000);
|
||
}
|
||
}; |