Files
bettergi-scripts-list/repo/js/ActivitySwitchNotice/main.js
云端客 7809496731 活动期限/周本通知器 0.0.8 (#2763)
* feat(ActivitySwitchNotice): 添加地图任务识别功能

- 新增 mapMission 工具模块用于OCR地图任务识别
- 在初始化工具列表中加入 mapMission 模块
- 修改 main 函数增加异常处理和开关控制逻辑
- 优化代码格式和缩进一致性
- 添加地图任务OCR识别区域配置参数

* feat(ActivitySwitchNotice): 添加地图任务识别功能并优化配置管理

- 实现地图任务识别功能,支持伴月纪闻任务和每日委托奖励识别
- 新增initSettings函数用于统一管理配置文件读取和初始化
- 在settings.json中添加地图任务相关的多选框配置选项
- 更新manifest.json版本至0.0.8并添加最低BGI版本要求
- 重构ocrMapMission函数以支持多任务名称匹配
- 添加openMap和mapMission工具函数用于地图操作和任务识别
- 优化通知系统,移除不必要的参数并完善错误处理
- 调整设置界面布局,添加分隔符提升用户体验

* feat(map): 添加地图任务识别功能

- 实现多复选框配置映射表获取功能
- 添加根据复选框名称获取对应值的方法
- 重构OCR地图任务识别函数,优化参数和错误处理
- 集成UID识别并在通知中显示
- 更新地图任务识别流程和结果显示格式
- 添加地图任务识别数量统计日志
- 在README中更新版本历史记录

* feat(map): 添加地图任务识别功能

- 实现多复选框配置映射表获取功能
- 添加根据复选框名称获取对应值的方法
- 重构OCR地图任务识别函数,优化参数和错误处理
- 集成UID识别并在通知中显示
- 更新地图任务识别流程和结果显示格式
- 添加地图任务识别数量统计日志
- 在README中更新版本历史记录

* feat(ActivitySwitchNotice): 添加新的活动任务选项并设置默认值

- 添加探索派遣奖励选项
- 添加豪斗旅纪奖励选项
- 设置伴月纪闻任务为默认选项之一
- 设置探索派遣奖励为默认选项之一
- 设置每日委托奖励为默认选项之一
- 更新配置结构以支持多选默认值
2026-01-23 00:01:53 +08:00

174 lines
5.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
let manifest = {};
let manifest_json = "manifest.json";
let configSettings = undefined
/**
* 初始化设置函数
* 从配置文件中读取设置信息并返回
* @returns {Object} 返回解析后的JSON设置对象
*/
async function initSettings() {
// 默认设置文件路径
let settings_ui = "settings.json";
try {
// 读取并解析manifest.json文件
manifest = JSON.parse(file.readTextSync(manifest_json));
// 调试日志输出manifest内容
log.debug("manifest={key}", manifest);
// 调试日志输出manifest中的settings_ui配置
log.debug("settings_ui={key}", manifest.settings_ui);
log.info(`|脚本名称:{name},版本:{version}`, manifest.name, manifest.version);
if (manifest.bgi_version) {
log.info(`|最小可执行BGI版本:{bgi_version}`, manifest.bgi_version);
}
log.info(`|脚本作者:{authors}\n`, manifest.authors.map(a => a.name).join(","));
// 更新settings_ui变量为manifest中指定的路径
settings_ui = manifest.settings_ui
} catch (error) {
// 捕获并记录可能的错误
log.warn("{error}", error.message);
}
// 读取并解析设置文件
const settingsJson = JSON.parse(file.readTextSync(settings_ui));
// 如果configSettings未定义则将其设置为解析后的设置对象
if (!configSettings) {
configSettings = settingsJson
}
// 调试日志:输出最终解析的设置对象
log.debug("settingsJson={key}", settingsJson);
// 返回设置对象
return settingsJson
}
/**
* 获取多复选框的映射表
* 该函数会从初始化的设置中提取所有类型为"multi-checkbox"的条目,
* 并将这些条目的名称和对应的选项值存储在一个Map对象中返回
* @returns {Promise<Map>} 返回一个Promise对象解析为包含多复选框配置的Map
*/
async function getMultiCheckboxMap() {
// 如果configSettings存在则使用它否则调用initSettings()函数获取
const settingsJson = configSettings ? configSettings : await initSettings();
// 创建一个新的Map对象用于存储多复选框的配置
// Map结构为: {名称: 选项数组}
let multiCheckboxMap = new Map();
// 遍历设置JSON中的每个条目
settingsJson.forEach((entry) => {
// 如果条目没有name属性或者类型不是"multi-checkbox",则跳过该条目
if (!entry.name || entry.type !== "multi-checkbox") return;
// 解构条目中的name和label属性便于后续使用
const {name, label} = entry;
// 获取当前name对应的设置值如果存在则转换为数组否则使用空数组
const options = settings[name] ? Array.from(settings[name]) : [];
// 记录调试信息,包含名称、标签、选项和选项数量
log.debug("name={key1},label={key2},options={key3},length={key4}", name, label, JSON.stringify(options), options.length);
// 将名称和对应的选项数组存入Map
multiCheckboxMap.set(name, options);
})
// 返回包含多复选框配置的Map
return multiCheckboxMap
}
/**
* 根据复选框组名称获取对应的值
* 这是一个异步函数,用于从复选框映射中获取指定名称的值
* @param {string} name - 复选框组的名称
* @returns {Promise<any>} 返回一个Promise解析为复选框组对应的值
*/
async function getValueByMultiCheckboxName(name) {
// 获取复选框映射表,这是一个异步操作
let multiCheckboxMap = await getMultiCheckboxMap()
// log.debug("multiCheckboxMap={key}", JSON.stringify(multiCheckboxMap))
// multiCheckboxMap.entries().forEach(([name, options]) => {
// log.debug("name={key1},options={key2}", name, JSON.stringify(options))
// })
// 从映射表中获取并返回指定名称对应的值
let values = multiCheckboxMap.get(name);
log.debug("values={key}", JSON.stringify(values))
return values
}
async function init() {
let utils = [
"uid",
"ws",
"notice",
"campaignArea",
"activity",
"mapMission",
]
for (let util of utils) {
eval(file.readTextSync(`utils/${util}.js`));
}
// manifest = JSON.parse(file.readTextSync("manifest.json"));
await initSettings();
log.debug("main 初始化完成");
}
// 判断是否在主界面的函数
const isInMainUI = () => {
let captureRegion = captureGameRegion();
let res = captureRegion.Find(RecognitionObject.TemplateMatch(
file.ReadImageMatSync("assets/paimon_menu.png"),
0,
0,
640,
216
));
captureRegion.dispose();
return !res.isEmpty();
};
async function toMainUi() {
let ms = 300
let index = 1
await sleep(ms);
while (!isInMainUI()) {
await sleep(ms);
await genshin.returnMainUi(); // 如果未启用,则返回游戏主界面
await sleep(ms);
if (index > 3) {
throw new Error(`多次尝试返回主界面失败`);
}
index += 1
}
}
(async function () {
await init();
if (settings.toMainUi) {
await toMainUi();
}
await main();
await toMainUi();
})();
/**
* @returns {Promise<void>}
*/
async function main() {
let ms = 600
const mapList = await getValueByMultiCheckboxName('mapMissionKeys')|| []
// log.info(`mapList=>{0}`,JSON.stringify(mapList))
if (mapList.length > 0) {
try {
log.info(`开始识别地图任务`)
await mapUtil.mapMission(mapList)
} finally {
await toMainUi()
}
}
let openKey = true
try {
await campaignAreaUtil.dailyCommissionMain(openKey)
await sleep(ms * 2);
openKey = false
} catch (e) {
await toMainUi()
throw e
}
await campaignAreaUtil.campaignAreaMain(openKey)
await sleep(ms * 2);
await toMainUi()
await activityUtil.activityMain()
}