220 lines
7.8 KiB
JavaScript
220 lines
7.8 KiB
JavaScript
(async function () {
|
||
const startTime = Date.now();
|
||
setGameMetrics(1920, 1080, 1);
|
||
|
||
|
||
//================= 1.设定路线 =================
|
||
|
||
const folder1 = 'assets/枫丹地脉花-路线1 厄里那斯/';
|
||
const folder2 = 'assets/枫丹地脉花-路线2 秋分山西侧锚点左下/';
|
||
const folder3 = 'assets/枫丹地脉花-路线3 秋分山西侧锚点右/';
|
||
const folder4 = 'assets/枫丹地脉花-路线4 柔灯港上锚点/';
|
||
const folder5 = 'assets/枫丹地脉花-路线5 新枫丹科学院左锚点/';
|
||
const folder6 = 'assets/枫丹地脉花-路线6 芒索斯山东麓/';
|
||
|
||
const pathing1 = [
|
||
"枫丹地脉花-路线1 厄里那斯-1:厄里那斯神像下.json",
|
||
"枫丹地脉花-路线1 厄里那斯-2:厄里那斯神像右下.json",
|
||
"枫丹地脉花-路线1 厄里那斯-3:厄里那斯神像右下_.json",
|
||
"枫丹地脉花-路线1 厄里那斯-4:厄里那斯神像右下下下.json",
|
||
"枫丹地脉花-路线1 厄里那斯-5:厄里那斯神像下下下下.json",
|
||
"枫丹地脉花-路线1 厄里那斯-6:厄里那斯神像下下下.json",
|
||
];
|
||
|
||
const pathing2 = [
|
||
"枫丹地脉花-路线2 秋分山西侧锚点左下-1:秋分山左下.json",
|
||
"枫丹地脉花-路线2 秋分山西侧锚点左下-2:秋分山左下+.json",
|
||
"枫丹地脉花-路线2 秋分山西侧锚点左下-3:秋分山左下下.json",
|
||
"枫丹地脉花-路线2 秋分山西侧锚点左下-4:秋分山左下下下.json",
|
||
"枫丹地脉花-路线2 秋分山西侧锚点左下-5:秋分山左左下下.json",
|
||
];
|
||
|
||
const pathing3 = [
|
||
"枫丹地脉花-路线3 秋分山西侧锚点右-1:锚点右.json",
|
||
"枫丹地脉花-路线3 秋分山西侧锚点右-2:锚点右右.json",
|
||
"枫丹地脉花-路线3 秋分山西侧锚点右-3:锚点右右右.json",
|
||
"枫丹地脉花-路线3 秋分山西侧锚点右-4:东侧锚点上.json",
|
||
];
|
||
|
||
const pathing4 = [
|
||
"枫丹地脉花-路线4 柔灯港上锚点-1:锚点左上.json",
|
||
"枫丹地脉花-路线4 柔灯港上锚点-2:锚点左上+.json",
|
||
"枫丹地脉花-路线4 柔灯港上锚点-3:锚点左左上.json",
|
||
"枫丹地脉花-路线4 柔灯港上锚点-4:锚点左上++.json",
|
||
];
|
||
|
||
const pathing5 = [
|
||
"枫丹地脉花-路线5 新枫丹科学院左锚点-1:锚点左上.json",
|
||
"枫丹地脉花-路线5 新枫丹科学院左锚点-2:锚点上.json",
|
||
"枫丹地脉花-路线5 新枫丹科学院左锚点-3:科学院左上锚点.json",
|
||
"枫丹地脉花-路线5 新枫丹科学院左锚点-4:科学院左上锚点左上.json",
|
||
];
|
||
|
||
const pathing6 = [
|
||
"枫丹地脉花-路线6 芒索斯山东麓-1:锚点下.json",
|
||
"枫丹地脉花-路线6 芒索斯山东麓-2:锚点右.json",
|
||
"枫丹地脉花-路线6 芒索斯山东麓-3:锚点左.json",
|
||
"枫丹地脉花-路线6 芒索斯山东麓-4:锚点左上.json",
|
||
];
|
||
|
||
|
||
|
||
|
||
// ================= 2. 配置读取 =================
|
||
|
||
let filePath; // 声明变量
|
||
if (settings.path === undefined) { // 检查用户是否选了地址
|
||
log.error("请在游戏中确认想刷地脉的首点位置,然后在js设置中选择路线。",);
|
||
throw new Error("用户未设置路线,已终止执行"); // 没选就报错后停止
|
||
}
|
||
else {
|
||
filePath = settings.path
|
||
}
|
||
|
||
|
||
// 路线映射表-将用户设置映射对应路线
|
||
const pathingMap = {
|
||
"路线1 厄里那斯": pathing1,
|
||
"路线2 秋分山西侧锚点左下": pathing2,
|
||
"路线3 秋分山西侧锚点右": pathing3,
|
||
"路线4 柔灯港上锚点": pathing4,
|
||
"路线5 新枫丹科学院左锚点": pathing5,
|
||
"路线6 芒索斯山东麓": pathing6
|
||
};
|
||
|
||
const folderMap = {
|
||
"路线1 厄里那斯": folder1,
|
||
"路线2 秋分山西侧锚点左下": folder2,
|
||
"路线3 秋分山西侧锚点右": folder3,
|
||
"路线4 柔灯港上锚点": folder4,
|
||
"路线5 新枫丹科学院左锚点": folder5,
|
||
"路线6 芒索斯山东麓": folder6
|
||
};
|
||
|
||
|
||
// 输出选择的路线
|
||
log.info(`已选择路线:${settings.path}`);
|
||
|
||
// 定义路线常量
|
||
const selectedPath = pathingMap[filePath];
|
||
const selectedFolder = folderMap[filePath];
|
||
|
||
|
||
|
||
// 读取原始次数配置
|
||
const rawTimes = settings.times ? settings.times : "6";
|
||
|
||
// 验证是否为数字
|
||
let timesValue;
|
||
if (!/^-?\d+\.?\d*$/.test(rawTimes)) { // 匹配整数和小数
|
||
timesValue = 6
|
||
log.info("⚠️ 刷本次数设置不为数字,改为默认值6");
|
||
} else {
|
||
// 转换为数字
|
||
const num = parseFloat(rawTimes);
|
||
|
||
// 范围检查
|
||
if (num < 1) {
|
||
timesValue = 1;
|
||
log.info(`⚠️ 次数 ${num} 小于1,已调整为1`);
|
||
} else if (num > 6) {
|
||
timesValue = 6;
|
||
log.info(`⚠️ 次数 ${num} 大于6,已调整为6`);
|
||
} else {
|
||
// 处理小数
|
||
if (!Number.isInteger(num)) {
|
||
timesValue = Math.floor(num);
|
||
log.info(`⚠️ 次数 ${num} 不是整数,已向下取整为 ${timesValue}`);
|
||
} else {
|
||
timesValue = num;
|
||
}
|
||
}
|
||
}
|
||
const timesConfig = { value: timesValue };
|
||
|
||
//已定义好路线路径、刷本次数的常量。现在需要定义领取动作,并做刷本动作,并保持自动拾取关闭。路线为selectedFolder+selectedPath,次数为timesConfig
|
||
|
||
|
||
//路径存在性检查
|
||
|
||
|
||
if (selectedPath) {
|
||
for (const jsonFile of selectedPath) {
|
||
|
||
}
|
||
} else {
|
||
throw new Error("未找到路径文件");
|
||
}
|
||
|
||
|
||
//定义领取动作
|
||
async function claimRewards() {
|
||
|
||
log.info("尝试领取奖励,优先使用浓缩,按下两次esc避免使用月亮");
|
||
|
||
for (let i = 0; i < 6; i++) {
|
||
keyPress("F");
|
||
await sleep(i < 5 ? 400 : 600);
|
||
}
|
||
|
||
click(918, 760);
|
||
await sleep(1600);
|
||
|
||
keyPress("VK_ESCAPE");
|
||
await sleep(800);
|
||
keyPress("VK_ESCAPE");
|
||
await sleep(800);
|
||
|
||
}
|
||
//定义了领取动作为claimRewards
|
||
|
||
|
||
|
||
|
||
|
||
// ================= 3. 主执行逻辑 =================
|
||
try {
|
||
|
||
// 计算实际执行次数(取用户设置次数与路线长度的最小值)
|
||
const maxExecutions = Math.min(timesConfig.value, selectedPath.length);
|
||
log.info(`本条路线执行至第 ${maxExecutions} 朵花`);
|
||
|
||
// 按顺序执行路径文件
|
||
let executedCount = 0;
|
||
for (const jsonFile of selectedPath) {
|
||
if (executedCount >= maxExecutions) {
|
||
log.info("已达到执行次数,终止运行");
|
||
break; // 条件1触发:次数限制
|
||
}
|
||
|
||
// 关闭自动拾取
|
||
dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: false }));
|
||
|
||
// 执行单个路径文件
|
||
log.info(`开始执行第 ${executedCount + 1}/${maxExecutions} 次路径:${jsonFile}`);
|
||
|
||
await pathingScript.runFile(`${selectedFolder}${jsonFile}`);
|
||
|
||
// 领取奖励
|
||
log.info(`此时应该可以按F接触地脉花`);
|
||
log.info(`开始第 ${executedCount + 1} 朵花的奖励领取`);
|
||
await claimRewards();
|
||
|
||
// 确保重新开启自动拾取
|
||
dispatcher.addTimer(new RealtimeTimer("AutoPick", { forceInteraction: true }));
|
||
|
||
|
||
// 冷却等待(可选)
|
||
await sleep(1000);
|
||
|
||
executedCount++;
|
||
}
|
||
|
||
log.info("本次地脉花路线已执行完毕。");
|
||
} catch (error) {
|
||
log.error(`执行过程中发生错误:${error.message}`);
|
||
}
|
||
|
||
|
||
|
||
})(); |