mirror of
https://github.com/babalae/bettergi-scripts-list.git
synced 2026-03-22 04:29:49 +08:00
201 lines
5.8 KiB
JavaScript
201 lines
5.8 KiB
JavaScript
// 原神每日委托自动执行脚本 - 委托功能基础模块
|
||
var CommissionBasic = {
|
||
// 跳过的委托列表
|
||
skipCommissionsList: [],
|
||
|
||
// 初始化跳过委托列表
|
||
initSkipCommissionsList: function() {
|
||
var settings = Utils.getSetting();
|
||
CommissionBasic.skipCommissionsList = Utils.parseSkipCommissions(settings.skipCommissions);
|
||
if (CommissionBasic.skipCommissionsList.length > 0) {
|
||
log.info(
|
||
"配置的跳过委托列表: {list}",
|
||
CommissionBasic.skipCommissionsList.join(", ")
|
||
);
|
||
}
|
||
},
|
||
|
||
// 检查委托状态(通过委托名称查找位置后检测)
|
||
iscompleted: async function(completedCount) {
|
||
try {
|
||
// 记录已完成的委托数量
|
||
log.info("已完成委托数量: {completedCount}", completedCount);
|
||
|
||
var enterSuccess = await UI.enterCommissionScreen();
|
||
if (!enterSuccess) {
|
||
log.error("无法进入委托界面");
|
||
return false;
|
||
}
|
||
await sleep(900);
|
||
if (completedCount === 0) {
|
||
await UI.pageScroll(1);
|
||
var status = await CommissionBasic.detectCommissionStatusByImage(3);
|
||
if (status === "completed") {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
var status = await CommissionBasic.detectCommissionStatusByImage(
|
||
3 - completedCount
|
||
);
|
||
if (status === "completed") {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
} catch (error) {
|
||
log.error("检查委托完成状态失败: {error}", error.message);
|
||
try {
|
||
await genshin.returnMainUi();
|
||
} catch (exitError) {
|
||
log.warn("退出委托界面失败: {error}", exitError);
|
||
}
|
||
return false;
|
||
}
|
||
},
|
||
|
||
// 计算两点之间的距离
|
||
calculateDistance: function(point1, point2) {
|
||
if (
|
||
!point1 ||
|
||
!point2 ||
|
||
!point1.X ||
|
||
!point1.Y ||
|
||
!point2.x ||
|
||
!point2.y
|
||
) {
|
||
log.warn("无效的位置数据");
|
||
return Infinity;
|
||
}
|
||
return Math.sqrt(
|
||
Math.pow(point1.X - point2.x, 2) + Math.pow(point1.Y - point2.y, 2)
|
||
);
|
||
},
|
||
|
||
// 获取委托的目标坐标(从路径追踪文件中获取最后一个坐标)
|
||
getCommissionTargetPosition: async function(scriptPath) {
|
||
try {
|
||
var scriptContent = await file.readText(scriptPath);
|
||
var pathData = JSON.parse(scriptContent);
|
||
|
||
if (!pathData.positions || pathData.positions.length === 0) {
|
||
log.warn("路径追踪文件 {path} 中没有有效的坐标数据", scriptPath);
|
||
return null;
|
||
}
|
||
|
||
var lastPosition = pathData.positions[pathData.positions.length - 1];
|
||
if (!lastPosition.x || !lastPosition.y) {
|
||
log.warn(
|
||
"路径追踪文件 {path} 的最后一个路径点缺少坐标数据",
|
||
scriptPath
|
||
);
|
||
return null;
|
||
}
|
||
|
||
log.debug(
|
||
"从脚本路径 {path} 获取到目标坐标: ({x}, {y})",
|
||
scriptPath,
|
||
lastPosition.x,
|
||
lastPosition.y
|
||
);
|
||
return {
|
||
x: lastPosition.x,
|
||
y: lastPosition.y,
|
||
};
|
||
} catch (error) {
|
||
log.error("获取委托目标坐标时出错: {error}", error.message);
|
||
return null;
|
||
}
|
||
},
|
||
|
||
// 确保目录存在
|
||
ensureDirectoryExists: async function(dirPath) {
|
||
try {
|
||
// 尝试创建目录,如果目录已存在,writeTextSync不会报错
|
||
// 创建一个临时文件来确保目录存在
|
||
var tempFilePath = dirPath + "/.temp";
|
||
file.writeTextSync(tempFilePath, "");
|
||
// log.info(`已确保目录存在: ${dirPath}`);
|
||
return true;
|
||
} catch (error) {
|
||
log.error("创建目录时出错: {error}", error);
|
||
return false;
|
||
}
|
||
},
|
||
|
||
// 检测委托完成状态(使用图像识别)
|
||
detectCommissionStatusByImage: async function(buttonIndex) {
|
||
try {
|
||
var button = Constants.COMMISSION_DETAIL_BUTTONS[buttonIndex];
|
||
if (!button) {
|
||
log.error("无效的按钮索引: {index}", buttonIndex);
|
||
return "unknown";
|
||
}
|
||
|
||
log.debug("检测委托{id}的完成状态(图像识别)", button.id);
|
||
// 截图
|
||
var captureRegion = captureGameRegion();
|
||
|
||
// 检测区域:按钮位置左右各扩展更大范围
|
||
var checkRegion = captureRegion.deriveCrop(
|
||
button.checkX,
|
||
button.y - 30, // 稍微向上扩展检测区域
|
||
button.checkWidth,
|
||
60 // 增加高度以确保捕获状态图标
|
||
);
|
||
|
||
// 加载完成和未完成的模板图像
|
||
var completedTemplate, uncompletedTemplate;
|
||
|
||
try {
|
||
completedTemplate = file.ReadImageMatSync(Constants.COMPLETED_IMAGE_PATH);
|
||
uncompletedTemplate = file.ReadImageMatSync(
|
||
Constants.UNCOMPLETED_IMAGE_PATH
|
||
);
|
||
} catch (imageError) {
|
||
log.error("加载模板图像失败: {error}", imageError);
|
||
return "unknown";
|
||
}
|
||
|
||
// 创建识别对象,使用更灵活的参数
|
||
var completedRo = RecognitionObject.TemplateMatch(
|
||
completedTemplate,
|
||
0,
|
||
0,
|
||
button.checkWidth,
|
||
60
|
||
);
|
||
var uncompletedRo = RecognitionObject.TemplateMatch(
|
||
uncompletedTemplate,
|
||
0,
|
||
0,
|
||
button.checkWidth,
|
||
60
|
||
);
|
||
|
||
// 降低匹配阈值,提高识别灵活性
|
||
completedRo.threshold = 0.65;
|
||
uncompletedRo.threshold = 0.65;
|
||
|
||
// 检测完成状态
|
||
var completedResult = checkRegion.find(completedRo);
|
||
if (!completedResult.isEmpty()) {
|
||
return "completed";
|
||
}
|
||
|
||
// 检测未完成状态
|
||
var uncompletedResult = checkRegion.find(uncompletedRo);
|
||
if (!uncompletedResult.isEmpty()) {
|
||
return "uncompleted";
|
||
}
|
||
|
||
log.warn("委托{id}状态识别失败", button.id);
|
||
return "unknown";
|
||
} catch (error) {
|
||
log.error("检测委托完成状态时出错: {error}", error.message);
|
||
return "unknown";
|
||
}
|
||
}
|
||
}; |