Skip to content

Commit 66cd769

Browse files
authored
js:锄地一条龙&锄地路线测试 (#1377)
* js:锄地一条龙 新增“自动优化”,根据运行记录按一定权重修改路线的预期用时 * js:锄地路线测试 用于测试锄地路线的怪物信息,运行时间,并根据运行记录修改description字段,以适配js锄地一条龙
1 parent b79e21d commit 66cd769

File tree

304 files changed

+2771
-33
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

304 files changed

+2771
-33
lines changed

repo/js/AutoHoeingOneDragon/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
- **执行模式:**
3535
- - 默认选择 **运行锄地路线** ,选择该模式会按照后续设置选择并运行相应路线
3636
- - 选项 **输出地图追踪文件** ,会将选择的路线读取并分组输出到js文件夹下pathingOut文件夹
37-
- - 选项 **强制刷新所有路线cd** ,用于清除js记录的运行历史
37+
- - 选项 **强制刷新所有运行记录** ,用于清除js记录的运行历史
3838
- **选择执行第几个路径组:** 本js会分组运行地图追踪,分组方式详见后续选项,需要分组运行时请确保精英目标数量,小怪目标数量,各个路径组的标签等信息【完全相同】,复制配置组时未知原因无法正确复制配置,请不要使用
3939
- **本路径组使用配队名称:** 填写该路径组使用的配队名称,js会自动切换
4040
- **拾取模式:** 本js采用黑白名单结合的方式实现仅拾取部分物品(默认只拾取狗粮和晶蝶),如果你想要使用bgi默认的拾取以拾取绝大部分物品,请选择bgi拾取,如果不想拾取任何物品,请选择不拾取任何物品
@@ -52,6 +52,7 @@
5252
- **输入不运行的时间或时间段的小时数** 当你需要让js在特定的时间终止运行时,按描述填写,js会在距离目标时间小于五分钟时终止运行并等待到目标时间
5353
- **路线效率计算权重:** 影响js评估路线价值,计算公式如下,权重越大越看重总收益
5454
- $$ 怪均^k \times 秒均 $$
55+
- **自动优化:** js将根据运行记录调整每条路线的预期运行时间,具体逻辑为,至多6条记录,去除一个最大值、一个最小值后,每条记录占据20%的权重,剩余权重由默认数据填充。如果你不想要这个功能,请禁用。
5556
- **目标数量:** 选取路线目标达到的精英怪数量,默认为400,同理小怪数量默认为2000
5657
- **优先关键词:**含有关键词的路线会被视为拥有最高效率,例如填写600来让所有600怪物优先考虑,填写骗骗花来优先考虑骗骗花
5758
- **排除关键词:** 含有关键词的路线会被排除,例如填写纳塔来排除所有纳塔路线,同样使用中文逗号分隔

repo/js/AutoHoeingOneDragon/main.js

Lines changed: 59 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,16 @@ if (settings.activeDumperMode) { //处理泥头车信息
9595
if (operationMode === "输出地图追踪文件") {
9696
log.info("开始复制并输出地图追踪文件\n请前往js文件夹查看");
9797
await copyPathingsByGroup(pathings);
98+
await updateRecords(pathings, accountName);
9899
} else if (operationMode === "运行锄地路线") {
99100
await switchPartyIfNeeded(partyName)
100101
log.info("开始运行锄地路线");
102+
await updateRecords(pathings, accountName);
101103
await processPathingsByGroup(pathings, whitelistKeywords, blacklistKeywords, accountName);
102104
} else {
103-
log.info("强制刷新所有路线CD");
105+
log.info("强制刷新所有运行记录");
104106
await initializeCdTime(pathings, "");
105-
await updateCdTimeRecord(pathings, accountName);
107+
await updateRecords(pathings, accountName);
106108
}
107109
})();
108110

@@ -158,6 +160,32 @@ async function processPathings() {
158160

159161
// 初始化 pathing 对象的属性
160162
pathing.t = routeInfo.time; // 预计用时初始化为60秒,如果 description 中有值则覆盖
163+
if (!settings.disableSelfOptimization && pathing.records) {
164+
//如果用户没有禁用自动优化,则参考运行记录更改预期用时
165+
const history = pathing.records.filter(v => v > 0);
166+
if (history.length) {
167+
const max = Math.max(...history);
168+
const min = Math.min(...history);
169+
170+
let maxRemoved = false;
171+
let minRemoved = false;
172+
173+
// 就地修改 history:先去掉一个最大值,再去掉一个最小值
174+
for (let i = history.length - 1; i >= 0; i--) {
175+
const v = history[i];
176+
if (!maxRemoved && v === max) {
177+
history.splice(i, 1);
178+
maxRemoved = true;
179+
} else if (!minRemoved && v === min) {
180+
history.splice(i, 1);
181+
minRemoved = true;
182+
}
183+
if (maxRemoved && minRemoved) break;
184+
}
185+
}
186+
//每一个有效的record占用0.2权重,剩余权重为原时间
187+
pathing.t = pathing.t * (1 - history.length * 0.2) + history.reduce((a, b) => a + b, 0);
188+
}
161189
pathing.m = 0; // 普通怪物数量
162190
pathing.e = 0; // 精英怪物数量
163191
pathing.mora_m = 0; // 普通怪物摩拉值
@@ -950,6 +978,9 @@ async function processPathingsByGroup(pathings, whitelistKeywords, blacklistKeyw
950978
nextEightClock.setUTCHours(20 + 24, 0, 0, 0); // 设置为下一个 UTC 时间的 20:00
951979
}
952980

981+
const pathTime = new Date() - now;
982+
pathing.records = [...pathing.records, pathTime / 1000].slice(-6);
983+
953984
// 更新路径的 cdTime
954985
pathing.cdTime = nextEightClock.toLocaleString();
955986

@@ -962,64 +993,62 @@ async function processPathingsByGroup(pathings, whitelistKeywords, blacklistKeyw
962993
const remainingseconds = predictRemainingTime % 60;
963994
log.info(`当前进度:第 ${targetGroup} 组第 ${groupPathCount}/${totalPathsInGroup}${pathing.fileName}已完成,该组预计剩余: ${remaininghours}${remainingminutes}${remainingseconds.toFixed(0)} 秒`);
964995

965-
await updateCdTimeRecord(pathings, accountName);
996+
await updateRecords(pathings, accountName);
966997
}
967998
}
968999
}
9691000

970-
971-
//加载cd信息
9721001
async function initializeCdTime(pathings, accountName) {
9731002
try {
974-
// 构造文件路径
9751003
const filePath = `records/${accountName}.json`;
976-
977-
// 尝试读取文件内容
9781004
const fileContent = await file.readText(filePath);
979-
980-
// 解析 JSON 数据
9811005
const cdTimeData = JSON.parse(fileContent);
9821006

983-
// 遍历 pathings 数组
9841007
pathings.forEach(pathing => {
985-
// 找到对应的 cdTime 数据
986-
const cdTimeEntry = cdTimeData.find(entry => entry.fileName === pathing.fileName);
1008+
const entry = cdTimeData.find(e => e.fileName === pathing.fileName);
9871009

988-
// 如果找到对应的项,则更新 cdTime
989-
if (cdTimeEntry) {
990-
pathing.cdTime = new Date(cdTimeEntry.cdTime).toLocaleString();
991-
} else {
992-
// 如果没有找到对应的项,则使用默认值 new Date(0)
993-
pathing.cdTime = new Date(0).toLocaleString();
994-
}
1010+
// 读取 cdTime
1011+
pathing.cdTime = entry
1012+
? new Date(entry.cdTime).toLocaleString()
1013+
: new Date(0).toLocaleString();
1014+
1015+
// 确保当前 records 是数组
1016+
const current = Array.isArray(pathing.records) ? pathing.records : new Array(6).fill(-1);
1017+
1018+
// 读取文件中的 records(若缺失则为空数组)
1019+
const loaded = (entry && Array.isArray(entry.records)) ? entry.records : [];
1020+
1021+
// 合并:文件中的 records(倒序最新在前)→ 追加到当前数组末尾
1022+
// 再整体倒序恢复正确顺序,截取最新 5 项
1023+
pathing.records = [...current, ...loaded.reverse()].slice(-5);
9951024
});
9961025
} catch (error) {
1026+
// 文件不存在或解析错误,初始化为 6 个 -1
9971027
pathings.forEach(pathing => {
9981028
pathing.cdTime = new Date(0).toLocaleString();
1029+
pathing.records = new Array(6).fill(-1);
9991030
});
10001031
}
10011032
}
10021033

1003-
async function updateCdTimeRecord(pathings, accountName) {
1034+
async function updateRecords(pathings, accountName) {
10041035
try {
1005-
// 构造文件路径
10061036
const filePath = `records/${accountName}.json`;
10071037

1008-
// 构造要写入文件的 JSON 数据
10091038
const cdTimeData = pathings.map(pathing => ({
10101039
fileName: pathing.fileName,
1011-
//description: pathing.description,
1012-
//精英数量: pathing.e,
1013-
//小怪数量: pathing.m,
10141040
标签: pathing.tags,
1015-
cdTime: pathing.cdTime
1041+
预计用时: pathing.t,
1042+
cdTime: pathing.cdTime,
1043+
// 倒序:最新 → 最旧,再过滤 > 0 并保留两位小数
1044+
records: [...pathing.records] // 复制一份避免副作用
1045+
.reverse() // 倒序
1046+
.filter(v => v > 0) // 过滤大于 0
1047+
.map(v => Number(v.toFixed(2))) // 保留两位小数
10161048
}));
10171049

1018-
// 将更新后的内容写回文件
10191050
await file.writeText(filePath, JSON.stringify(cdTimeData, null, 2), false);
1020-
10211051
} catch (error) {
1022-
// 捕获并记录错误
10231052
log.error(`更新 cdTime 时出错: ${error.message}`);
10241053
}
10251054
}

repo/js/AutoHoeingOneDragon/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"manifest_version": 1,
33
"name": "锄地一条龙",
4-
"version": "1.1.11",
4+
"version": "1.2.0",
55
"description": "一站式解决自动化锄地,支持只拾取狗粮,请阅读README.md后使用",
66
"authors": [
77
{

repo/js/AutoHoeingOneDragon/settings.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"options": [
77
"运行锄地路线",
88
"输出地图追踪文件",
9-
"强制刷新所有路线cd"
9+
"强制刷新所有运行记录"
1010
],
1111
"default": "运行锄地路线"
1212
},
@@ -81,6 +81,11 @@
8181
"label": "路线效率计算权重,填0以上的数字\n越大越倾向于花费较多时间提高总收益",
8282
"default": "0.5"
8383
},
84+
{
85+
"name": "disableSelfOptimization",
86+
"type": "checkbox",
87+
"label": "勾选后禁用根据运行记录优化路线选择的功能\n完全使用路线原有信息"
88+
},
8489
{
8590
"name": "targetEliteNum",
8691
"type": "input-text",
847 Bytes
Loading
6.71 KB
Loading
89.4 KB
Loading

0 commit comments

Comments
 (0)