fix(js): 修复美景音乐播放器概率走歪导致无法结算 (#2587)

This commit is contained in:
Bread Grocery
2025-12-29 08:49:10 +08:00
committed by GitHub
parent 1e9eaf3c35
commit 2e744c9b7b
5 changed files with 80 additions and 45 deletions

View File

@@ -29,22 +29,23 @@
### 🛠️ 脚本配置
| 配置项 | 描述 | 备注 | 默认值 |
| ---------------------- | ---------------------------- | ------------------------------------------------------------------ | ---------------------------------------------- |
| room | 奇域关卡关键词或关卡GUID | | 20031486040 |
| playbacks | 通关回放文件池 | 逗号分隔随机抽取自行录制拷贝到assets/playbacks | 美景音乐播放器结算.json |
| expPerAttempt | 每次通关获取的经验值 | 如果勾选删除关卡存档每个成就加额外50经验值 | 20 |
| deleteStageSave | 删除关卡存档 | 可重复达成成就,获取更多经验值 | false |
| deleteStageSaveKeyword | 删除关卡存档关键字 | 关卡存档视图中的[关卡]列 | 音乐播放 |
| expWeeklyLimit | 每周可获取的经验值上限 | | 4000 |
| force | 忽略本周经验值已达上限 | | false |
| thisAttempts | 指定通关次数 | 0表示自动判断 | 0 |
| dailyEnabled | 执行每日通关任务 | 完后会领取纪游经验、日活奖励 | false |
| dailyRooms | 每日奇域关卡关键词或关卡GUID | 逗号分隔 | 24429042323,28644538672 |
| dailyPlaybacks | 每日通关回放文件随机池 | 同一关卡逗号分隔不同关卡分号分隔自行录制拷贝到assets/playbacks | 通关回放1.json,通关回放2.json;40秒按1通关.json |
| dailyLimit | 每日单个关卡通关上限 | | 1 |
| dailyForce | 忽略每日单个关卡通关上限 | | false |
| goToTeyvat | 完成后返回提瓦特大陆 | | true |
| 配置项 | 描述 | 备注 | 默认值 |
| ---------------------- | -------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------- |
| room | 奇域关卡关键词或关卡GUID | | 20031486040 |
| playbacks | 通关回放文件池 | 逗号分隔随机抽取自行录制拷贝到assets/playbacks | 美景音乐播放器结算.json |
| expPerAttempt | 每次通关获取的经验值 | 如果勾选删除关卡存档每个成就加额外50经验值 | 20 |
| deleteStageSave | 删除关卡存档 | 可重复达成成就,获取更多经验值 | false |
| deleteStageSaveKeyword | 删除关卡存档关键字 | 关卡存档视图中的[关卡]列 | 音乐播放 |
| expWeeklyLimit | 每周可获取的经验值上限 | | 4000 |
| force | 忽略本周经验值已达上限 | | false |
| thisAttempts | 指定通关次数 | 0表示自动判断 | 0 |
| dailyEnabled | 执行每日通关任务 | 完后会领取纪游经验、日活奖励 | false |
| dailyRooms | 每日奇域关卡关键词或关卡GUID | 逗号分隔 | 24429042323,28644538672 |
| dailyPlaybacks | 每日通关回放文件随机池 | 同一关卡逗号分隔不同关卡分号分隔自行录制拷贝到assets/playbacks | 通关回放1.json,通关回放2.json;40秒按1通关.json |
| dailyLimit | 每日单个关卡通关上限 | | 1 |
| dailyForce | 忽略每日单个关卡通关上限 | | false |
| closeStageDialog | 执行通关回放前关闭游戏说明对话框 | 使用通关回放录像自行关闭,则禁用 | true |
| goToTeyvat | 完成后返回提瓦特大陆 | | true |
### ❗ 注意事项

View File

@@ -1,14 +1,33 @@
{
"macroEvents": [
{ "type": 0, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 1094 },
{ "type": 1, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 4578 },
{ "type": 0, "keyCode": 87, "mouseX": 0, "mouseY": 0, "time": 5438 },
{ "type": 1, "keyCode": 87, "mouseX": 0, "mouseY": 0, "time": 10750 },
{ "type": 0, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 1250 },
{ "type": 1, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 1312 },
{ "type": 0, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 11781 },
{ "type": 1, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 11891 },
{ "type": 0, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 12781 },
{ "type": 1, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 12891 }
{ "type": 0, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 2484 },
{ "type": 1, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 4140 },
{ "type": 0, "keyCode": 87, "mouseX": 0, "mouseY": 0, "time": 4343 },
{ "type": 1, "keyCode": 87, "mouseX": 0, "mouseY": 0, "time": 5484 },
{ "type": 0, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 5515 },
{ "type": 1, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 6640 },
{ "type": 0, "keyCode": 87, "mouseX": 0, "mouseY": 0, "time": 7265 },
{ "type": 1, "keyCode": 87, "mouseX": 0, "mouseY": 0, "time": 8140 },
{ "type": 0, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 8218 },
{ "type": 0, "keyCode": 87, "mouseX": 0, "mouseY": 0, "time": 8672 },
{ "type": 1, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 8797 },
{ "type": 0, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 9203 },
{ "type": 1, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 9875 },
{ "type": 0, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 10297 },
{ "type": 1, "keyCode": 68, "mouseX": 0, "mouseY": 0, "time": 10718 },
{ "type": 0, "keyCode": 65, "mouseX": 0, "mouseY": 0, "time": 11047 },
{ "type": 1, "keyCode": 65, "mouseX": 0, "mouseY": 0, "time": 11250 },
{ "type": 1, "keyCode": 87, "mouseX": 0, "mouseY": 0, "time": 11703 },
{ "type": 0, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 12562 },
{ "type": 1, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 12718 },
{ "type": 0, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 13000 },
{ "type": 1, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 13172 },
{ "type": 0, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 13437 },
{ "type": 1, "keyCode": 70, "mouseX": 0, "mouseY": 0, "time": 13562 }
],
"info": {
"name": "",

View File

@@ -358,6 +358,7 @@ var userConfig = {
}, []),
dailyLimit: Math.max(1, Number(settings.dailyLimit || "1")),
dailyForce: settings.dailyForce ?? false,
closeStageDialog: settings.closeStageDialog ?? true,
goToTeyvat: settings.goToTeyvat ?? true
};
//! 脚本数据存储
@@ -371,20 +372,26 @@ var store = useStoreWithDefaults("data", {
// src/modules/regions.ts
//! 通用:查找确认按钮
var findConfirmBtn = () => {
return findTextWithinBounds("确认", 480, 720, 960, 145);
const txt = findTextWithinBounds("确认", 480, 720, 960, 145);
txt?.drawSelf("group_text");
return txt;
};
//! 通用:查找标题文字
var findHeaderTitle = (title, contains) => {
return findTextWithinBounds(title, 0, 0, 300, 95, { contains });
const txt = findTextWithinBounds(title, 0, 0, 300, 95, { contains });
txt?.drawSelf("group_text");
return txt;
};
//! 通用:查找底部按钮文字
var findBottomBtnText = (text, contains) => {
return findTextWithinBounds(text, 0, 980, 1920, 100, { contains });
const txt = findTextWithinBounds(text, 0, 980, 1920, 100, { contains });
txt?.drawSelf("group_text");
return txt;
};
//! 通用:查找关闭对话框按钮
var findCloseDialog = () => {
const img = "assets/UI_BtnIcon_Close.png";
const iro = findImageWithinBounds(img, 410, 160, 1100, 660, { useMask: true, threshold: 0.8 });
const iro = findImageWithinBounds(img, 410, 160, 1100, 660, { useMask: true, threshold: 0.7 });
iro?.drawSelf("group_img");
return iro;
};
@@ -858,14 +865,16 @@ var playStage = async (playbacks) => {
return;
}
//! 关闭游戏说明对话框
await assertRegionDisappearing(
findCloseDialog,
"关闭游戏说明对话框超时",
() => {
findCloseDialog()?.click();
},
{ maxAttempts: 10, retryInterval: 500 }
);
if (userConfig.closeStageDialog) {
await assertRegionDisappearing(
findCloseDialog,
"关闭游戏说明对话框超时",
() => {
findCloseDialog()?.click();
},
{ maxAttempts: 10, retryInterval: 500 }
);
}
//! 执行随机通关回放文件
await execStagePlayback(playbacks);
await sleep(3e3);
@@ -1132,8 +1141,8 @@ var execWeeklyTask = async () => {
//! 创建进度追踪器
const tracker = new ProgressTracker(attempts);
//! 迭代尝试
try {
for (let i = 0; i < attempts; i++) {
for (let i = 0; i < attempts; i++) {
try {
tracker.print(`开始本周第 ${store.weekly.attempts + 1} 次奇域挑战...`);
//! 删除关卡存档
await deleteStageSave();
@@ -1152,13 +1161,13 @@ var execWeeklyTask = async () => {
break;
}
}
} catch (err) {
//! 发生主机异常(如:任务取消异常等),无法再继续执行
if (isHostException(err)) throw err;
//! 发生脚本流程异常,尝试退出关卡(如果在关卡中)
await exitStage();
log.error("脚本执行出错: {error}", getErrorMessage(err));
}
} catch (err) {
//! 发生主机异常(如:任务取消异常等),无法再继续执行
if (isHostException(err)) throw err;
//! 发生脚本流程异常,尝试退出关卡(如果在关卡中)
await exitStage();
log.error("脚本执行出错: {error}", getErrorMessage(err));
}
await genshin.returnMainUi();
};

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 1,
"name": "千星奇域·每周经验刷取(回放通关版)",
"version": "0.1.6",
"version": "0.1.7",
"bgi_version": "0.53.0",
"description": "千星奇域·每周经验刷取(回放通关版)",
"authors": [

View File

@@ -77,6 +77,12 @@
"label": "忽略每日单个关卡通关上限",
"default": false
},
{
"type": "checkbox",
"name": "closeStageDialog",
"label": "执行通关回放前关闭游戏说明对话框",
"default": true
},
{
"type": "checkbox",
"name": "goToTeyvat",