js:AAA狗粮批发1.0.0正式版 (#1648)

This commit is contained in:
mno
2025-08-19 21:36:39 +08:00
committed by GitHub
parent bcac4c60c5
commit a816a9fca8
8 changed files with 70 additions and 90 deletions

View File

@@ -1,24 +1,25 @@
测试版本暂时没空写readme发现bug请超市作者qq718135749
## 琪零、功能及部分原理说明
1. 根据时间自动选择卡时间和路线,方案具体参考下列说明:
- 两条普通路线全富点98交替执行
- 达到预期激活时间(比前一天晚)后先去激活以固定刷新时间,如果普通路线执行完成仍然未达到目标时间,则启用备用收尾路线(前一天使用备用时第二天可直接使用收益更高的优先收尾路线)
- 激活完成后继续完成剩余的普通路线
- 最后完成刚刚激活的收尾和额外路线
2. 支持多样化的分解狗粮配置,具体参考自定义配置和下面的说明
3. 支持断点续跑中断后一天之内重跑将会自动跳过已运行的路线执行应该执行的路线但是仍然不建议在激活路线期间约3分钟中断
4. 自动识别运行失败的路线并在日志中进行警告,建议尽快手动前往开图
可能存在各种bug仅建议愿意参与测试的用户使用使用时请超市作者并反馈遇到的bug
如果你只是想要获取狗粮,请使用自动狗粮加强版
## 一、使用方法及配置
## 芽一、使用方法及配置
1. 将脚本添加至调度器。
2. 右键点击脚本以修改 JS 自定义配置。
- **请输入狗粮队伍名称**改成自己捡狗粮的队伍名字。建议使用迪西雅或e启动奶妈作为行走位如果需要配置生存位建议与行走位相同。建议携带迪西雅耐肘王提供移速加成万叶路线中有配置万叶吸取狗粮可提高拾取率
- **请输入清怪队伍名称**:改成自己的战斗队,清理狗粮路线上的小怪,不填则跳过清怪路线,**需要自行匹配战斗策略。**
- **最短时间间隔**:比昨天延后(默认1分钟开始卡收尾点和额外点。
- **最短时间间隔**比昨天延后默认1分钟开始卡收尾点和额外点。
- **最大额外等待时间**98个点拾取完后可以选择干等N分钟来卡更多次的超限点
- **强制收尾路线交替执行**:默认不开,用于一些用户想收集其他的调查材料,比如茶叶等。替换掉(替补收尾路线)内的文件,可以一天收尾狗粮,一天收尾茶叶。
- **狗粮分解模式**:默认不分解,可选分解成(经验瓶/摩拉)
- **账户名称****单账号无需更改。** 多账号使用时建多个配置组,一个账号使用一个配置组,填入游戏账号名称(自己取名),就可以按各自名称记录运行信息。
3. 一定要正确设置狗粮队和清怪队的名称
4. 根据清怪队角色配置,调整战斗超时设置。
- **账户名称****单账号无需更改。** 多账号使用时建多个配置组,一个账号使用一个配置组,填入游戏账号名称(自己取名),就可以按各自名称分别记录运行信息。
- **芙宁娜** :狗粮队支持自动使用白芙作为生存位(汐佬逼的),当你狗粮队伍中含有芙宁娜时请勾选,将确保狗粮路线时芙宁娜为白芙状态,清怪和脚本结束时切回黑芙
## 二、调查点类型收益
@@ -70,56 +71,21 @@ https://www.kdocs.cn/wo/sl/v13uXscL
**额外**:不受满上限影响消失,又叫超限点
## 六、周循环方案对比
### 1. 富6A1B方案
- **执行方式**
- 连续6天跑富A路线富A与富A间隔≥24H+5min
- 第7天跑富B路线与富A间隔≥12H+5min
- **周总收益**
- 经验6×98,469 + 83,160 = 673,974 EXP
- 摩拉6×22,600 + 21,000 = 156,600
- **周总耗时**6×69 + 53 = 467分钟约7.78小时)
### 2. 富1A1B方案
- **执行方式**
- 每天交替跑富A和富B路线间隔≥12H+5min
- **周总收益**
- 经验3.5×(98,469+83,160) = 635,701 EXP
- 摩拉3.5×(22,600+21,000) = 152,600
- **周总耗时**3.5×(69+53) = 427分钟约7.11小时)
### 3. ABE 1A1B方案基准
- **执行方式**
- 每天交替跑ABE A线和B线点位不重叠无间隔要求
- **周总收益**
- 经验3.5×(77,742+77,868) = 544,677 EXP
- 摩拉3.5×(6,600+6,800) = 46,900
- **周总耗时**3.5×(41+43) = 294分钟约4.9小时)
### 4. 收益对比表
| 指标 | 富6A1B | 富1A1B | ABE1A1B | 富6A1B增长 | 富1A1B增长 |
| ------ | ------- | ------- | ------- | ---------------- | --------------- |
| 周经验 | 673,974 | 635,701 | 544,677 | +129,297 (23.7%) | +91,024 (16.7%) |
| 周摩拉 | 156,600 | 152,600 | 46,900 | +109,700 (233.9%)| +105,700 (225.4%)|
| 周耗时 | 7.78h | 7.11h | 4.9h | +2.88h | +2.21h |
## 七、队伍配置
## 六、队伍配置建议
- **根据自己CPU配置选择合适的移速**:电脑性能较差以至于收益远不如及格线时,降低队伍移速(使用较矮小的体型,不使用双风,四风原典,迪西雅天赋等)。
- **行走位:优先迪希雅;或芙宁娜等 E启动奶**
- **钟剑迪希雅**:耐肘王/白天6-18点移速+10%(路径内置调时间到白天,全程100%吃满天赋)
- **万叶建议携带路径内配有E吸狗粮策略(不带不影响运行)**
- **万叶建议携带路径内配有E吸狗粮策略(不带不影响运行)**,琴可作为备选项,不要同时携带琴和万叶
- **双风BUFF**:移速+10% 体力消耗-15%
## 更新日志
### 1.0.02025.08.19
1.正式版上线
2.优化分解狗粮与识别相关逻辑
3.勾选通知后同时在摩拉识别和经验识别的界面截图发送通知
### 0.0.92025.08.18
1.优化度假村若干路线
### 0.0.82025.08.18

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -19,6 +19,13 @@ const ConfirmButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("a
const DestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/DestoryButton.png"));
const MidDestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/DestoryButton.png"), 900, 600, 500, 300);
const CharacterMenuRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/CharacterMenu.png"), 60, 991, 38, 38);
const decomposeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/decompose.png"));
const quickChooseRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/quickChoose.png"));
const confirmRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/confirm.png"));
const doDecomposeRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/doDecompose.png"));
const doDecompose2Ro = RecognitionObject.TemplateMatch(file.ReadImageMatSync("assets/RecognitionObject/doDecompose2.png"));
const normalPathA = "assets/ArtifactsPath/普通A";
const normalPathB = "assets/ArtifactsPath/普通B";
const normalPathC = "assets/ArtifactsPath/普通C";
@@ -76,7 +83,7 @@ let failcount = 0;
moraDiff -= await mora();
//执行普通路线,直到预定激活开始时间
log.info("开始第一次执行普通路线");
log.info("开始执行普通路线");
await runNormalPath(true);
if (state.cancel) return;
@@ -86,7 +93,7 @@ let failcount = 0;
if (state.cancel) return;
//执行剩余普通路线
log.info("开始第二次执行普通路线");
log.info("开始执行剩余普通路线");
await runNormalPath(false);
if (state.cancel) return;
@@ -309,8 +316,7 @@ async function processArtifacts(times = 1) {
await sleep(1000);
await click(670, 45);
await sleep(500);
await recognizeTextAndClick("分解", { x: 635, y: 991, width: 81, height: 57 });
await findAndClick(decomposeRo);
await sleep(1000);
//识别已储存经验1570-880-1650-930
@@ -330,12 +336,12 @@ async function processArtifacts(times = 1) {
let firstNumber2 = 0;
if (settings.keep4Star) {
await recognizeTextAndClick("快速选择", { x: 248, y: 996, width: 121, height: 49 });
await findAndClick(quickChooseRo);
moveMouseTo(960, 540);
await sleep(1000);
await click(370, 1020); // 点击“确认选择”按钮
await sleep(1500);
await findAndClick(confirmRo);// 点击“确认选择”按钮
await sleep(1000);
decomposedNum = await recognizeTextInRegion(regionToCheck3);
@@ -356,7 +362,7 @@ async function processArtifacts(times = 1) {
await recognizeTextAndClick("分解", { x: 635, y: 991, width: 81, height: 57 });
await sleep(1000);
}
await recognizeTextAndClick("快速选择", { x: 248, y: 996, width: 121, height: 49 });
await findAndClick(quickChooseRo);
moveMouseTo(960, 540);
await sleep(1000);
@@ -364,7 +370,7 @@ async function processArtifacts(times = 1) {
await click(370, 370);//取消选择四星
await sleep(1000);
}
await click(370, 1020); // 点击“确认选择”按钮
await findAndClick(confirmRo);// 点击“确认选择”按钮
await sleep(1500);
let decomposedNum2 = await recognizeTextInRegion(regionToCheck3);
@@ -381,7 +387,7 @@ async function processArtifacts(times = 1) {
log.info("识别失败");
}
//识别当前总经验
let regionToCheck2 = { x: 1500, y: 900, width: 150, height: 100 };
let regionToCheck2 = { x: 1470, y: 880, width: 205, height: 70 };
let newNum = await recognizeTextInRegion(regionToCheck2);
let newValue = 0;
@@ -392,16 +398,20 @@ async function processArtifacts(times = 1) {
log.warn(`在指定区域未识别到有效数字: ${newValue}`);
}
if (settings.notify) {
notification.Send(`当前总经验: ${newValue}`);
}
if (settings.decomposeMode === "分解(经验瓶)") {
log.info(`用户选择了分解,执行分解`);
// 根据用户配置,分解狗粮
await sleep(1000);
await click(1620, 1020); // 点击分解按钮
await sleep(1000);
await sleep(500);
// 4. 识别"进行分解"按钮
await click(1340, 755); // 点击进行分解按钮
await findAndClick(doDecomposeRo); // 点击分解按钮
await sleep(500);
// 4. "进行分解"按钮
await findAndClick(doDecompose2Ro); // 点击进行分解按钮
await sleep(1000);
// 5. 关闭确认界面
@@ -428,31 +438,33 @@ async function processArtifacts(times = 1) {
return result;
}
async function destroyArtifacts(times = 1) {
async function findAndClick(target) {
async function findAndClick(target, maxAttempts = 3) {
let attempts = 0;
while (attempts < maxAttempts) {
gameRegion = captureGameRegion();
gameRegion.find(target).click();
let result = gameRegion.find(target);
gameRegion.dispose();
if (result.isExist) {
result.click();
break;
}
attempts++;
await sleep(250 * attempts);
}
await genshin.returnMainUi();
keyPress("B");
await sleep(1500);
const gameRegion = captureGameRegion();
let ArtifactsButton = gameRegion.find(ArtifactsButtonRo);
gameRegion.dispose();
if (ArtifactsButton.isExist()) {
log.info("识别到圣遗物按钮");
ArtifactsButton.click();
await sleep(1500);
}
}
async function destroyArtifacts(times = 1) {
await genshin.returnMainUi();
await sleep(250);
keyPress("B");
await sleep(250);
await findAndClick(ArtifactsButtonRo, 5);
try {
for (let i = 0; i < times; i++) {
await findAndClick(DeleteButtonRo);// 点击摧毁
await sleep(600);
await findAndClick(AutoAddButtonRo);// 点击自动添加
await sleep(600);
await sleep(300);
await sleep(900);
click(150, 150);
await sleep(300);
click(150, 220);
@@ -555,6 +567,9 @@ async function mora() {
}
await sleep(500);
tryTimes++;
if (settings.notify) {
notification.Send(`当前摩拉: ${Number(result)}`);
}
await genshin.returnMainUi();
}
return Number(result);
@@ -718,7 +733,7 @@ async function readCDInfo(accountName) {
if (Array.isArray(parsed) && parsed.every(item => typeof item === 'string')) {
CDInfo = parsed;
} else {
log.warn('文件内容不是字符串数组,使用空数组');
log.warn('文件内容异常,使用默认状态');
CDInfo = [];
}
} catch (e) {
@@ -732,7 +747,6 @@ async function readCDInfo(accountName) {
//更新cd信息
async function writeCDInfo(accountName) {
log.info("修改CDInfo文件");
if (state.cancel) return;
const CDInfoFilePath = `CDInfo/${accountName}.json`;
await file.writeText(CDInfoFilePath, JSON.stringify(CDInfo), false);
@@ -899,7 +913,7 @@ async function runPaths(folderFilePath, PartyName, doStop) {
failcount++;
skiprecord = true;
log.warn(`路线${Path.fileName},没有正常完成,请检查是否开图`);
await sleep(1000);
await sleep(5000);
}
} catch (error) {
log.error(`发生错误:${error.message}`);

View File

@@ -1,11 +1,11 @@
{
"manifest_version": 1,
"name": "AAA狗粮批发(测试版本)",
"version": "0.0.9",
"name": "AAA狗粮批发",
"version": "1.0.0",
"tags": [
"狗粮"
],
"description": "直接借助普通路线实现卡时间获取最高狗粮收益",
"description": "直接利用普通路线来给收尾和额外路线卡时间,花最少的时间拿最多的狗粮",
"saved_files": [
"records/*.txt"
],