diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs index 58480b4f..f3ec286f 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightConfig.cs @@ -25,6 +25,13 @@ public partial class AutoFightConfig : ObservableObject /// [ObservableProperty] private bool _fightFinishDetectEnabled = true; + /// + /// 根据技能CD优化出招人员 + /// 根据填入人或人和cd,来决定当此人元素战技cd未结束时,跳过此人出招,来优化战斗流程,可填入人名或人名数字(用逗号分隔), + /// 多种用分号分隔,例如:白术;钟离,12;,如果人名,则用内置cd检查,如果是人名和数字,则把数字当做出招cd(秒)。 + /// + [ObservableProperty] private string _actionSchedulerByCd = ""; + [Serializable] public partial class FightFinishDetectConfig : ObservableObject { diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs index 72003705..3e4ac777 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightParam.cs @@ -26,6 +26,7 @@ public class AutoFightParam : BaseTaskParam FightFinishDetectEnabled = autoFightConfig.FightFinishDetectEnabled; PickDropsAfterFightEnabled = autoFightConfig.PickDropsAfterFightEnabled; KazuhaPickupEnabled = autoFightConfig.KazuhaPickupEnabled; + ActionSchedulerByCd = autoFightConfig.ActionSchedulerByCd; FinishDetectConfig.FastCheckEnabled = autoFightConfig.FinishDetectConfig.FastCheckEnabled; FinishDetectConfig.FastCheckParams = autoFightConfig.FinishDetectConfig.FastCheckParams; @@ -47,6 +48,7 @@ public class AutoFightParam : BaseTaskParam public int Timeout { get; set; } = 120; public bool KazuhaPickupEnabled = true; + public string ActionSchedulerByCd = ""; } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs index 256c2a40..16ab96c9 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightTask.cs @@ -202,6 +202,7 @@ public class AutoFightTask : ISoloTask throw new Exception("识别队伍角色失败"); } + var actionSchedulerByCd = ParseStringToDictionary(_taskParam.ActionSchedulerByCd); var combatCommands = _combatScriptBag.FindCombatScript(combatScenes.Avatars); // 新的取消token @@ -221,7 +222,8 @@ public class AutoFightTask : ISoloTask return; }*/ var fightEndFlag = false; - string lastFighttName = ""; + string lastFightName = ""; + string skipFightName = ""; //统计切换人打架次数 var countFight = 0; // 战斗操作 @@ -242,6 +244,30 @@ public class AutoFightTask : ISoloTask break; } + //根据元素技能冷却事件优化出招流程,只有当人物切换后才会触发检查 + double skillCd; + if (lastFightName != command.Name && actionSchedulerByCd.TryGetValue(command.Name,out skillCd)) + { + var avatar = combatScenes.Avatars.FirstOrDefault(a => a.Name == command.Name); + if (skillCd < 0) + { + skillCd = FindMax([avatar.SkillCd,avatar.SkillHoldCd]); + } + var dif=(DateTime.UtcNow - avatar.LastSkillTime); + //当技能未冷却时,跳过此次出招 + if ((DateTime.UtcNow -avatar.LastSkillTime).TotalSeconds < skillCd) + { + if (skipFightName != command.Name) + { + Logger.LogInformation($"{command.Name}cd冷却为{skillCd}秒,剩余{skillCd-dif.TotalSeconds}秒,跳过此次行动"); + } + skipFightName = command.Name; + continue; + } + } + + + command.Execute(combatScenes); //统计战斗人次 if (i == combatCommands.Count - 1 || command.Name != combatCommands[i + 1].Name) @@ -249,7 +275,7 @@ public class AutoFightTask : ISoloTask countFight++; } - lastFighttName = command.Name; + lastFightName = command.Name; if (!fightEndFlag && _taskParam is { FightFinishDetectEnabled: true }) { //处于最后一个位置,或者当前执行人和下一个人名字不一样的情况,满足一定条件(开启快速检查,并且检查时间大于0或人名存在配置)检查战斗 @@ -341,7 +367,7 @@ public class AutoFightTask : ISoloTask { var time = DateTime.UtcNow - kazuha.LastSkillTime; //当万叶cd大于3时或战斗人次少于2时(通常无怪物情况下),此时不再触发万叶拾取, - if (!(countFight < 2 || lastFighttName == "枫原万叶" && time.TotalSeconds > 3)) + if (!(countFight < 2 || lastFightName == "枫原万叶" && time.TotalSeconds > 3)) { Logger.LogInformation("使用枫原万叶长E拾取掉落物"); await Delay(300, ct); @@ -470,6 +496,53 @@ public class AutoFightTask : ISoloTask (g >= 240 && g <= 255) && (b >= 240 && b <= 255); } + static double FindMax(double[] numbers) + { + if (numbers == null || numbers.Length == 0) + { + throw new ArgumentException("The array is empty or null."); + } + + double max = numbers[0]>10000 ? 0 : numbers[0]; + foreach (var num in numbers) + { + var cpnum = numbers[0]>10000 ? 0 : num; + max = Math.Max(max, num); + } + + return max; + } + private static Dictionary ParseStringToDictionary(string input,double defaultValue=-1) + { + var dictionary = new Dictionary(); + + if (string.IsNullOrEmpty(input)) + { + return dictionary; // 返回空字典 + } + + string[] pairs = input.Split(';', StringSplitOptions.RemoveEmptyEntries); + + foreach (var pair in pairs) + { + var parts = pair.Split(',', StringSplitOptions.TrimEntries); + + if (parts.Length > 0) + { + string name = parts[0]; + double value = defaultValue; + + if (parts.Length > 1 && double.TryParse(parts[1], out var parsedValue)) + { + value = parsedValue; + } + + dictionary[name] = value; + } + } + + return dictionary; + } private bool HasFightFlagByYolo(ImageRegion imageRegion) { diff --git a/BetterGenshinImpact/GameTask/LogParse/LogParse.cs b/BetterGenshinImpact/GameTask/LogParse/LogParse.cs index 8feb53e5..83ef540e 100644 --- a/BetterGenshinImpact/GameTask/LogParse/LogParse.cs +++ b/BetterGenshinImpact/GameTask/LogParse/LogParse.cs @@ -325,7 +325,8 @@ namespace LogParse (name: "最后小怪日期", value: ms => ms.LastSmallTime), (name: "精英", value: ms => ms.EliteGameStatistics.ToString()), (name: "精英详细", value: ms => ms.EliteDetails), (name: "最后精英日期", value: ms => ms.LastEliteTime), - (name: "总计锄地摩拉", value: ms => ms.TotalMoraKillingMonstersMora.ToString()) + (name: "总计锄地摩拉", value: ms => ms.TotalMoraKillingMonstersMora.ToString()), + (name: "突发事件获取摩拉", value: ms => ms.EmergencyBonus) ]; //锄地部分新曾字段 (string name, Func value)[] col2Configs=[..msColConfigs.ToList().Where(item=>item.name!="日期" && item.name!="最后小怪日期" && item.name!="最后精英日期"), @@ -386,7 +387,7 @@ namespace LogParse .OrderBy(group => group.Key) .Reverse().ToList(); - html.AppendLine($"

按日锄地摩拉统计

"); + html.AppendLine($"

按日摩拉收益统计

"); html.AppendLine(""); html.AppendLine(" "); diff --git a/BetterGenshinImpact/GameTask/LogParse/MoraStatistics.cs b/BetterGenshinImpact/GameTask/LogParse/MoraStatistics.cs index 50ca2b3e..ae62e5ea 100644 --- a/BetterGenshinImpact/GameTask/LogParse/MoraStatistics.cs +++ b/BetterGenshinImpact/GameTask/LogParse/MoraStatistics.cs @@ -25,6 +25,16 @@ namespace LogParse public List SmallMonsterActionItems => this.MonsterActionItems.Except(EliteMonsterActionItems).ToList(); + public string EmergencyBonus + { + get + { + var ls = this.ActionItems.Where(item => item.ActionId == 28).ToList(); + var count = ls.Count(); + return ls.Sum(item=>item.Num)+((count==0 || count>=10)?"":$"({count}/10)"); + } + } + public string LastEliteTime => EliteMonsterActionItems.MaxBy(item => item?.Time)?.Time ?? null; public string LastSmallTime => SmallMonsterActionItems.MaxBy(item => item?.Time)?.Time ?? null; diff --git a/BetterGenshinImpact/GameTask/LogParse/TravelsDiaryDetailManager.cs b/BetterGenshinImpact/GameTask/LogParse/TravelsDiaryDetailManager.cs index a8db8801..721192f5 100644 --- a/BetterGenshinImpact/GameTask/LogParse/TravelsDiaryDetailManager.cs +++ b/BetterGenshinImpact/GameTask/LogParse/TravelsDiaryDetailManager.cs @@ -50,8 +50,8 @@ public class TravelsDiaryDetailManager var _temp = JsonSerializer.Deserialize>(File.ReadAllText(tddfile)); if (_temp != null) { - //只统计杀怪的 - actionItems.AddRange(_temp.Data.List.Where(item => item.ActionId == 37)); + //统计杀怪或突发事件奖励 + actionItems.AddRange(_temp.Data.List.Where(item => item.ActionId == 37 || item.ActionId == 28)); } } } diff --git a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml index 1a4c4bc6..24815d17 100644 --- a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml +++ b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml @@ -428,7 +428,34 @@ - + + + + + + + + + + + + + diff --git a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml index 6975a47c..970e8715 100644 --- a/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml +++ b/BetterGenshinImpact/View/Pages/View/ScriptGroupConfigView.xaml @@ -370,6 +370,34 @@ + + + + + + + + + + + + +