diff --git a/repo/js/AutoHoeingOneDragon/README.md b/repo/js/AutoHoeingOneDragon/README.md index 06e5ece83..ff406338a 100644 --- a/repo/js/AutoHoeingOneDragon/README.md +++ b/repo/js/AutoHoeingOneDragon/README.md @@ -31,12 +31,13 @@ - 其余选项如果你不确定其作用建议保持默认状态,或询问群友等 3. 在配置组界面中右键js,选择 **修改js脚本自定义配置** ,参考后续介绍按需修改各个配置选项 + - 第一部分:路径组执行配置:该部分影响执行的具体细节 - **执行模式:** - - 默认选择 **运行锄地路线** ,选择该模式会按照后续设置选择并运行相应路线 - - 选项 **输出地图追踪文件** ,会将选择的路线读取并分组输出到js文件夹下pathingOut文件夹 - - 选项 **强制刷新所有运行记录** ,用于清除js记录的运行历史 - **选择执行第几个路径组:** 本js支持分组运行地图追踪,分组方式详见后续选项,需要分组运行时请确保精英目标数量,小怪目标数量,各个路径组的标签等信息【完全相同】,复制配置组时未知原因无法正确复制配置,请不要使用 - - 如果你需要分组执行,请先建立和组数对应的配置组,分别添加本js,路径组一要【排除】的标签填写需要完全禁用的标签,如蕈兽,路径组二要【选择】的标签填写需要分配到路径组二的路线的标签,如小怪,不同配置组的js中选择对应的配队和路径组编号,其他配置保持默认的情况下即可实现精英和小怪分队伍和配置组锄地,更多路径组数量以此类推,各组其他选项原则上应保持完全相同。(别再一个组填400-0,另外一个组填0-2000了) + - 如果你需要分组执行,请先建立和组数对应的配置组,分别添加本js,路径组一要【排除】的标签填写需要完全禁用的标签,如蕈兽,路径组二要【选择】的标签填写需要分配到路径组二的路线的标签,如小怪,不同配置组的js中选择对应的配队和路径组编号,其他配置保持默认的情况下即可实现精英和小怪分队伍和配置组锄地,更多路径组数量以此类推 - **本路径组使用配队名称:** 填写该路径组使用的配队名称,js会自动切换 - **拾取模式:** 需要注意,沙暴路线只在模板匹配模式下可用 - - 模板匹配拾取:推荐使用,速度最快,性能消耗最低 @@ -46,6 +47,7 @@ - **效率降序运行:** 当你时间不足以刷完所有怪物且不确定时,建议通过开启该项和配置下一项来实现在指定时间前尽可能多刷效率高的路线并按时终止 - **输入不运行的时间或时间段的小时数** 当你需要让js在特定的时间终止运行时,按描述填写,js会在距离目标时间小于五分钟时终止运行并等待到目标时间 - **泥头车模式:** 接近战斗地点(距离5-30)时,提前让指定序号的角色开e,建议以下角色开启:芙宁娜,爱可菲,雷电将军,不建议各种盾位或纳塔角色开启。 + - 第二部分:路线选择与分组配置:该部分将决定路线的选择与分配,js将尝试按照以下配置选择路线以达到目标数量的怪物,并分配到不同的路径组,在第一部分中选择不同的路径组以执行对应的路线 - **账户名称:** 本js支持多用户,不同账户的记录分开存储,当你需要使用多用户时,请在这里填写不同的文本来区分不同账号的记录,如果你只使用一个账号,请不要修改该选项 - **路径组x标签:** 本js使用不同的标签来禁用或分组路线,多个标签之间使用中文逗号分隔,目前支持的标签如下 - - 水免:表明路线含有水元素伤害免疫的怪物,使用以水元素伤害为主的队伍处理该路线时可能较为麻烦 @@ -56,6 +58,7 @@ - - 小怪 :表明路线只含小怪,战斗强度低,且无需携带万叶来拾取可能掉落的狗粮,可以适当携带等级较低或不上场的角色来获取经验收益 - - 分组逻辑:不含路径组1排除标签和任何其他组标签的路径会进入路径组1,剩余路径若含有路径组x的标签之一,则会进入路径组x - - 使用示例:路径组一填写蕈兽,禁用蕈兽路线,路径组二填写次数盾,水免,处理路径组一的配队难以处理的次数盾和水免怪物,路径组三填写小怪,队伍中放升级中角色获取经验,将本js添加到【多个配置组】中,根据路径组的具体情况配置每个配置组的设置 + - - 新增支持自定义标签,将会尝试将未知的标签通过文件路径,description匹配,含有对应关键词的路线即视为含有这些标签 - **路线效率计算权重:** 影响js评估路线价值,计算公式如下,权重越大越看重总收益 - $$ 怪均^k \times 秒均 $$ - **自动优化:** js将根据运行记录调整每条路线的预期运行时间,具体逻辑为,至多6条记录,去除一个最大值、一个最小值后,每条记录占据20%的权重,剩余权重由默认数据填充。如果你不想要这个功能,请禁用。 @@ -65,6 +68,7 @@ 4. **只建议在原神中设置1080p,60帧使用,其他分辨率或帧率出现任何问题都是正常现象** 5. **不建议使用12小时制时间(虽然也能跑)** +6. **注意,仅选择路径组一的配置组的第二部分路线与分组配置有效,选择路径组一的配置组的本js运行后将保存配置,供其他路径组读取,其他路径组的自定义配置中第二部分完全无效,该设定是为了确保各个配置组中同账户的路线分配完全相同** ### 二、**锄地收益** - 击杀精英怪和小怪通常会掉落对应的材料和一定量摩拉,同时为队伍中角色提供经验,精英怪还会概率掉落三四星的战狂、教官、流放者圣遗物 diff --git a/repo/js/AutoHoeingOneDragon/main.js b/repo/js/AutoHoeingOneDragon/main.js index 1dacbd0ba..78a2d2654 100644 --- a/repo/js/AutoHoeingOneDragon/main.js +++ b/repo/js/AutoHoeingOneDragon/main.js @@ -1,14 +1,12 @@ -//当前js版本1.14.0 +//当前js版本1.15.0 let timeMoveUp; let timeMoveDown; -let pickup_Mode = settings.pickup_Mode || "模板匹配拾取,拾取狗粮和怪物材料"; +const accountName = settings.accountName || "默认账户"; + +let pickup_Mode; let dumpers; -if (settings.activeDumperMode) { //处理泥头车信息 - dumpers = settings.activeDumperMode.split(',').map(Number).filter(num => num === 1 || num === 2 || num === 3 || num === 4); -} else { - dumpers = []; -} + let gameRegion; let targetItemPath = "assets/targetItems"; @@ -36,13 +34,7 @@ const mainUIRo = RecognitionObject.TemplateMatch(mainUITemplate, 0, 0, 150, 150) let targetItems; let doFurinaSwitch = false; -let findFInterval = (+settings.findFInterval || 100); -if (findFInterval < 16) { - findFInterval = 16; -} -if (findFInterval > 200) { - findFInterval = 200; -} +let findFInterval; let lastRoll = new Date(); let checkDelay = Math.round(findFInterval / 2); let rollingDelay = (+settings.rollingDelay || 32); @@ -53,19 +45,96 @@ let warnMessage = []; let blacklist = []; let blacklistSet = new Set(); let state; -const accountName = settings.accountName || "默认账户"; + let pathings; let localeWorks; -const priorityTags = (settings.priorityTags || "").split(",").map(tag => tag.trim()).filter(tag => tag.length > 0); -const excludeTags = (settings.excludeTags || "").split(",").map(tag => tag.trim()).filter(tag => tag.length > 0); +let priorityTags; +let excludeTags; let runningFailCount = 0; (async function () { - targetItems = await loadTargetItems(); + if (settings.groupIndex === "路径组一") { + const cfg = { + tagsForGroup1: settings.tagsForGroup1 || "", + tagsForGroup2: settings.tagsForGroup2 || "", + tagsForGroup3: settings.tagsForGroup3 || "", + tagsForGroup4: settings.tagsForGroup4 || "", + tagsForGroup5: settings.tagsForGroup5 || "", + tagsForGroup6: settings.tagsForGroup6 || "", + tagsForGroup7: settings.tagsForGroup7 || "", + tagsForGroup8: settings.tagsForGroup8 || "", + tagsForGroup9: settings.tagsForGroup9 || "", + tagsForGroup10: settings.tagsForGroup10 || "", + disableSelfOptimization: settings.disableSelfOptimization ?? false, + eEfficiencyIndex: settings.eEfficiencyIndex ?? 2.5, + mEfficiencyIndex: settings.mEfficiencyIndex ?? 0.5, + splitFactor: settings.splitFactor ?? 0, + targetEliteNum: settings.targetEliteNum ?? 400, + targetMonsterNum: settings.targetMonsterNum ?? 2000, + priorityTags: settings.priorityTags ?? "", + excludeTags: settings.excludeTags ?? "" + }; + const cfgStr = JSON.stringify(cfg, null, 2); + if (cfgStr.includes("莫酱") || cfgStr.includes("汐酱")) { + log.error("路线选择与分组配置中包含关键词(莫酱/汐酱),强制终止!"); + return; + } + + /* 校验通过,正常写文件 */ + const filePath = `settings/${accountName}.json`; + file.writeText(filePath, cfgStr, false); + } else { + let cfg; + try { + const raw = await file.readText(`settings/${accountName}.json`); + cfg = JSON.parse(raw); + } catch (error) { + log.error(`配置文件settings/${accountName}.json不存在,请先在路径组一的配置组运行一次`); + await sleep(10000); + return; + } + settings.tagsForGroup1 = cfg.tagsForGroup1 ?? ""; + settings.tagsForGroup2 = cfg.tagsForGroup2 ?? ""; + settings.tagsForGroup3 = cfg.tagsForGroup3 ?? ""; + settings.tagsForGroup4 = cfg.tagsForGroup4 ?? ""; + settings.tagsForGroup5 = cfg.tagsForGroup5 ?? ""; + settings.tagsForGroup6 = cfg.tagsForGroup6 ?? ""; + settings.tagsForGroup7 = cfg.tagsForGroup7 ?? ""; + settings.tagsForGroup8 = cfg.tagsForGroup8 ?? ""; + settings.tagsForGroup9 = cfg.tagsForGroup9 ?? ""; + settings.tagsForGroup10 = cfg.tagsForGroup10 ?? ""; + settings.disableSelfOptimization = cfg.disableSelfOptimization ?? false; + settings.eEfficiencyIndex = cfg.eEfficiencyIndex ?? 2.5; + settings.mEfficiencyIndex = cfg.mEfficiencyIndex ?? 0.5; + settings.splitFactor = cfg.splitFactor ?? 0; + settings.targetEliteNum = cfg.targetEliteNum ?? 400; + settings.targetMonsterNum = cfg.targetMonsterNum ?? 2000; + settings.priorityTags = cfg.priorityTags ?? ""; + settings.excludeTags = cfg.excludeTags ?? ""; + } + //自定义配置处理 const operationMode = settings.operationMode || "运行锄地路线"; + pickup_Mode = settings.pickup_Mode || "模板匹配拾取,拾取狗粮和怪物材料"; + targetItems = await loadTargetItems(); + if (settings.activeDumperMode) { //处理泥头车信息 + dumpers = settings.activeDumperMode.split(',').map(Number).filter(num => num === 1 || num === 2 || num === 3 || num === 4); + } else { + dumpers = []; + } + + let findFInterval = (+settings.findFInterval || 100); + if (findFInterval < 16) { + findFInterval = 16; + } + if (findFInterval > 200) { + findFInterval = 200; + } + + priorityTags = (settings.priorityTags || "").split(",").map(tag => tag.trim()).filter(tag => tag.length > 0); + excludeTags = (settings.excludeTags || "").split(",").map(tag => tag.trim()).filter(tag => tag.length > 0); localeWorks = !isNaN(Date.parse(new Date().toLocaleString())); if (!localeWorks) { @@ -143,27 +212,9 @@ let runningFailCount = 0; //分配到不同路径组 await assignGroups(pathings, groupTags); - /* - //分配结果输出 - pathings.forEach((pathing, index) => { - log.info(`路径 ${index + 1}:`); - log.info(` fullPath: ${pathing.fullPath}`); - log.info(` fileName: ${pathing.fileName}`); - log.info(` group: ${pathing.group}`); - log.info(` cdTime: ${pathing.cdTime}`); - log.info(` tags: ${pathing.tags.join(', ')}`); - log.info(` available: ${pathing.available}`); - log.info(` selected: ${pathing.selected}`); - log.info(` 预计用时: ${pathing.t} 秒`); - log.info(` 普通怪物数量: ${pathing.m}`); - log.info(` 精英怪物数量: ${pathing.e}`); - log.info(` 普通怪物摩拉值: ${pathing.mora_m}`); - log.info(` 精英怪物摩拉值: ${pathing.mora_e}`); - log.info(''); // 空行分隔每个路径的信息 - }); - */ + //根据操作模式选择不同的处理方式 - if (operationMode === "输出地图追踪文件") { + if (operationMode === "调试路线分配") { log.info("开始复制并输出地图追踪文件\n请前往js文件夹查看"); await copyPathingsByGroup(pathings); await updateRecords(pathings, accountName); @@ -209,7 +260,7 @@ let runningFailCount = 0; return; case avatars.includes('钟离'): - log.warn("当前队伍包含钟离,钟离不适合锄地,建议重新阅读 readme 相关部分"); + log.warn("当前队伍包含钟离,不适合锄地,建议重新阅读 readme 相关部分"); await sleep(5000); break; @@ -498,7 +549,7 @@ async function findBestRouteGroups(pathings, k1, k2, targetEliteNum, targetMonst /* ========== 3. 最小不可再减集合(贪心逆筛,不碰优先路线) ========== */ // 1. 只留非优先的已选路线,按性价比升序排 const selectedList = pathings - .filter(p => p.selected && !p.prioritized) + .filter(p => p.selected && !p.prioritized) .sort((a, b) => { const score = p => { const eliteGain = p.e === 0 ? 200 : (p.G1 - p.G2) / p.e; diff --git a/repo/js/AutoHoeingOneDragon/manifest.json b/repo/js/AutoHoeingOneDragon/manifest.json index 5e2122f8e..417a6e047 100644 --- a/repo/js/AutoHoeingOneDragon/manifest.json +++ b/repo/js/AutoHoeingOneDragon/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 1, "name": "锄地一条龙", - "version": "1.14.1", + "version": "1.15.0", "description": "一站式解决自动化锄地,支持只拾取狗粮,请仔细阅读README.md后使用", "authors": [ { @@ -18,6 +18,7 @@ "saved_files": [ "records/*.json", "blacklists/*.json", + "settings/*.json", "assets/targetItems/其他/预留/**/*.png" ] -} +} \ No newline at end of file diff --git a/repo/js/AutoHoeingOneDragon/pathing/1-莫酱/1-其他/2601地下水泽西南三飞萤.json b/repo/js/AutoHoeingOneDragon/pathing/1-莫酱/1-其他/2601地下水泽西南三飞萤.json index 1229a062a..b6aaee19f 100644 --- a/repo/js/AutoHoeingOneDragon/pathing/1-莫酱/1-其他/2601地下水泽西南三飞萤.json +++ b/repo/js/AutoHoeingOneDragon/pathing/1-莫酱/1-其他/2601地下水泽西南三飞萤.json @@ -104,7 +104,7 @@ "type": "target", "move_mode": "walk", "action": "combat_script", - "action_params": "wait(5.0)", + "action_params": "wait(0.1)", "locked": false }, { diff --git a/repo/js/AutoHoeingOneDragon/settings.json b/repo/js/AutoHoeingOneDragon/settings.json index 3c7f92f67..e2a08d297 100644 --- a/repo/js/AutoHoeingOneDragon/settings.json +++ b/repo/js/AutoHoeingOneDragon/settings.json @@ -5,7 +5,7 @@ "label": "第一部分:路径组执行配置\n根据每个配置组的具体需求填写\n#############################################\n\n执行模式", "options": [ "运行锄地路线", - "输出地图追踪文件", + "调试路线分配", "强制刷新所有运行记录" ], "default": "运行锄地路线" @@ -45,11 +45,6 @@ ], "default": "模板匹配拾取,拾取狗粮和怪物材料" }, - { - "name": "disableSelfOptimization", - "type": "checkbox", - "label": "勾选后禁用根据运行记录优化路线选择的功能\n完全使用路线原有信息" - }, { "name": "findFInterval", "type": "input-text", @@ -92,7 +87,7 @@ { "name": "accountName", "type": "input-text", - "label": "#############################################\n\n第二部分:路线选择与分组配置\n确保不同路径组中该部分配置【完全相同】\n#############################################\n\n账户名称\n用于多用户运行时区分不同账户的记录\n单用户请勿修改", + "label": "#############################################\n\n第二部分:路线选择与分组配置\n仅对于选择路径组一的配置组生效,其他配置组将读取同账户名路径组一的配置组的相关配置,其他路径组的以下配置无效\n#############################################\n\n账户名称\n用于多用户运行时区分不同账户的记录\n单用户请勿修改", "default": "默认账户" }, { @@ -116,6 +111,11 @@ "type": "input-text", "label": "路径组四要【选择】的标签" }, + { + "name": "disableSelfOptimization", + "type": "checkbox", + "label": "勾选后禁用根据运行记录优化路线选择的功能\n完全使用路线原有信息" + }, { "name": "eEfficiencyIndex", "type": "input-text",