mirror of
https://github.com/babalae/bettergi-scripts-list.git
synced 2026-03-25 04:59:52 +08:00
js:AAA狗粮批发1.0.0正式版 (#1648)
This commit is contained in:
@@ -1,24 +1,25 @@
|
||||
测试版本,暂时没空写readme,发现bug请超市作者qq:718135749
|
||||
## 琪零、功能及部分原理说明
|
||||
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.0(2025.08.19)
|
||||
1.正式版上线
|
||||
2.优化分解狗粮与识别相关逻辑
|
||||
3.勾选通知后同时在摩拉识别和经验识别的界面截图发送通知
|
||||
### 0.0.9(2025.08.18)
|
||||
1.优化度假村若干路线
|
||||
### 0.0.8(2025.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 |
@@ -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}`);
|
||||
|
||||
@@ -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"
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user