130 lines
4.6 KiB
JavaScript
130 lines
4.6 KiB
JavaScript
(async function () {
|
||
// 1. 初始化(分辨率由游戏环境自动提供)
|
||
// 输出当前系统时间到 monster_count.txt 文件
|
||
const now = new Date();
|
||
const formattedTime = now.toLocaleString('zh-CN', {
|
||
year: 'numeric',
|
||
month: '2-digit',
|
||
day: '2-digit',
|
||
hour: '2-digit',
|
||
minute: '2-digit',
|
||
second: '2-digit'
|
||
}).replace(/\//g, '.');
|
||
const storagePath = "monster_count.txt"; // 结果存储文件
|
||
const timeContent = `\n${formattedTime}\n`;
|
||
file.writeTextSync(storagePath, timeContent, true); // 追加模式
|
||
|
||
await genshin.returnMainUi(); // 返回主界面
|
||
keyPress("VK_ESCAPE"); // 打开派蒙菜单
|
||
await sleep(1500); // 等待1.5秒
|
||
|
||
// 2. 识别并点击【图鉴】
|
||
const archiveTemplate = RecognitionObject.TemplateMatch(
|
||
file.readImageMatSync("assets/RecognitionObject/图鉴.png"),
|
||
0, 0, 1920, 1080
|
||
);
|
||
const archiveRegion = captureGameRegion().find(archiveTemplate);
|
||
if (!archiveRegion.isEmpty()) {
|
||
archiveRegion.click();
|
||
}
|
||
await sleep(3000); // 等待3秒
|
||
|
||
// 3. 识别并点击【生物志】
|
||
const faunaTemplate = RecognitionObject.TemplateMatch(
|
||
file.readImageMatSync("assets/RecognitionObject/生物志.png"),
|
||
0, 0, 1920, 1080
|
||
);
|
||
const faunaRegion = captureGameRegion().find(faunaTemplate);
|
||
if (!faunaRegion.isEmpty()) {
|
||
faunaRegion.click();
|
||
}
|
||
await sleep(400);
|
||
click(1355, 532);
|
||
await sleep(2000); // 等待2秒
|
||
|
||
// 4. 循环处理怪物识别
|
||
// 读取 name.txt 文件中的怪物名称列表
|
||
const monsterList = file.readTextSync("name.txt").split('\n').filter(name => name.trim()!== '');
|
||
let monsterNum = 1;
|
||
|
||
for (const monsterId of monsterList) {
|
||
let pageTurns = 0;
|
||
let monsterRegion = null;
|
||
|
||
while (pageTurns < 70) {
|
||
// 4a. 识别怪物图片
|
||
const monsterTemplate = RecognitionObject.TemplateMatch(
|
||
file.readImageMatSync(`assets/monster/${monsterId.trim()}.png`),
|
||
0, 0, 1920, 1080
|
||
);
|
||
monsterRegion = captureGameRegion().find(monsterTemplate);
|
||
|
||
if (!monsterRegion.isEmpty()) {
|
||
break; // 识别到怪物,跳出翻页循环
|
||
}
|
||
|
||
// 未识别到则翻页
|
||
await scrollPage(300); // 调用翻页函数
|
||
pageTurns++;
|
||
}
|
||
|
||
if (!monsterRegion || monsterRegion.isEmpty()) {
|
||
log.info(`Monster ID: ${monsterId.trim()}, not found after 70 page turns.`);
|
||
continue; // 达到翻页上限仍未找到,处理下一个怪物
|
||
}
|
||
|
||
monsterRegion.click(); // 点击怪物图标
|
||
await sleep(10); // 等待界面加载
|
||
|
||
// 4b. 识别数量区域(870,1000,100,30)
|
||
const countRegion = new ImageRegion(
|
||
captureGameRegion().SrcMat,
|
||
830, 980,
|
||
null, // owner 参数设置为 null
|
||
null, // converter 参数设置为 null
|
||
null // drawContent 参数设置为 null
|
||
);
|
||
// 创建OCR识别对象
|
||
const ocrObject = RecognitionObject.Ocr(830, 980, 140, 70);
|
||
const countResults = countRegion.findMulti(ocrObject);
|
||
let monsterCount = "-1";
|
||
|
||
if (countResults.count > 0) {
|
||
for (let i = 0; i < countResults.count; i++) {
|
||
const text = countResults[i].text;
|
||
const numbers = text.match(/\d+/);
|
||
if (numbers) {
|
||
monsterCount = numbers[0];
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 4c. 输出日志
|
||
log.info(`NO.${monsterNum} 怪物名称: ${monsterId.trim()}, 数量: ${monsterCount}`);
|
||
monsterNum++;
|
||
|
||
// 4d. 存储结果到文件
|
||
const writeContent = `${monsterId.trim()},${monsterCount}\n`;
|
||
file.writeTextSync(storagePath, writeContent, true); // 追加模式
|
||
}
|
||
})();
|
||
|
||
// 翻页函数(优化坐标为屏幕中心)
|
||
async function scrollPage(totalDistance, stepDistance = 10, delayMs = 5) {
|
||
moveMouseTo(400, 750); // 移动到屏幕水平中心,垂直750坐标
|
||
await sleep(50);
|
||
leftButtonDown();
|
||
|
||
const steps = Math.ceil(totalDistance / stepDistance);
|
||
for (let j = 0; j < steps; j++) {
|
||
const remainingDistance = totalDistance - j * stepDistance;
|
||
const moveDistance = remainingDistance < stepDistance ? remainingDistance : stepDistance;
|
||
moveMouseBy(0, 1.2*(-moveDistance)); // 向上滚动
|
||
await sleep(delayMs);
|
||
}
|
||
|
||
await sleep(200);
|
||
leftButtonUp();
|
||
await sleep(100);
|
||
} |