@@ -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信息
9721001async 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}
0 commit comments