Files
bettergi-scripts-list/repo/js/AutoCommission/lib/commission-basic.js
躁动的氨气 204825f37d 强制所有脚本进行dispose(如发生提前释放问题请自行修复) (#2292)
* 强制dispose

* 强制dispose(版本号更新)
2025-11-02 13:27:59 +08:00

174 lines
5.2 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;
}
},
// 获取委托的目标坐标(从路径追踪文件中获取最后一个坐标)
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;
}
},
// 检测委托完成状态(使用图像识别)
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()) {
captureRegion.dispose();
checkRegion.dispose();
return "completed";
}
// 检测未完成状态
var uncompletedResult = checkRegion.find(uncompletedRo);
if (!uncompletedResult.isEmpty()) {
captureRegion.dispose();
checkRegion.dispose();
return "uncompleted";
}
captureRegion.dispose();
checkRegion.dispose();
log.warn("委托{id}状态识别失败", button.id);
return "unknown";
} catch (error) {
log.error("检测委托完成状态时出错: {error}", error.message);
return "unknown";
}
}
};