using BetterGenshinImpact.GameTask.AutoFight.Model; using BetterGenshinImpact.Helpers; using System; using System.Collections.Generic; using TimeSpan = System.TimeSpan; namespace BetterGenshinImpact.GameTask.AutoFight.Script; public class CombatCommand { public string Name { get; set; } public Method Method { get; set; } public List? Args { get; set; } public CombatCommand(string name, string command) { Name = name.Trim(); command = command.Trim(); var startIndex = command.IndexOf('('); if (startIndex > 0) { var endIndex = command.IndexOf(')'); var method = command[..startIndex]; method = method.Trim(); Method = Method.GetEnumByCode(method); var parameters = command.Substring(startIndex + 1, endIndex - startIndex - 1); Args = new List(parameters.Split(',', StringSplitOptions.TrimEntries)); // 校验参数 if (Method == Method.Walk) { AssertUtils.IsTrue(Args.Count == 2, "walk方法必须有两个入参,第一个参数是方向,第二个参数是行走时间。例:walk(s, 0.2)"); var s = double.Parse(Args[1]); AssertUtils.IsTrue(s > 0, "行走时间必须大于0"); } else if (Method == Method.W || Method == Method.A || Method == Method.S || Method == Method.D) { AssertUtils.IsTrue(Args.Count == 1, "w/a/s/d方法必须有一个入参,代表行走时间。例:d(0.5)"); } } else { Method = Method.GetEnumByCode(command); } } public void Execute(CombatScenes combatScenes) { var avatar = combatScenes.SelectAvatar(Name); if (avatar == null) { return; } avatar.Switch(); if (Method == Method.Skill) { var hold = Args != null && Args.Contains("hold"); avatar.UseSkill(hold); } else if (Method == Method.Burst) { avatar.UseBurst(); } else if (Method == Method.Attack) { if (Args is { Count: > 0 }) { var s = double.Parse(Args![0]); avatar.Attack((int)TimeSpan.FromSeconds(s).TotalMilliseconds); } else { avatar.Attack(); } } else if (Method == Method.Charge) { if (Args is { Count: > 0 }) { var s = double.Parse(Args![0]); avatar.Charge((int)TimeSpan.FromSeconds(s).TotalMilliseconds); } else { avatar.Charge(); } } else if (Method == Method.Walk) { var s = double.Parse(Args![1]); avatar.Walk(Args![0], (int)TimeSpan.FromSeconds(s).TotalMilliseconds); } else if (Method == Method.W) { var s = double.Parse(Args![0]); avatar.Walk("w", (int)TimeSpan.FromSeconds(s).TotalMilliseconds); } else if (Method == Method.A) { var s = double.Parse(Args![0]); avatar.Walk("a", (int)TimeSpan.FromSeconds(s).TotalMilliseconds); } else if (Method == Method.S) { var s = double.Parse(Args![0]); avatar.Walk("s", (int)TimeSpan.FromSeconds(s).TotalMilliseconds); } else if (Method == Method.D) { var s = double.Parse(Args![0]); avatar.Walk("d", (int)TimeSpan.FromSeconds(s).TotalMilliseconds); } else if (Method == Method.Wait) { var s = double.Parse(Args![0]); avatar.Wait((int)TimeSpan.FromSeconds(s).TotalMilliseconds); } else if (Method == Method.Aim) { throw new NotImplementedException(); } else if (Method == Method.Dash) { if (Args is { Count: > 0 }) { var s = double.Parse(Args![0]); avatar.Dash((int)TimeSpan.FromSeconds(s).TotalMilliseconds); } else { avatar.Dash(); } } else if (Method == Method.Jump) { avatar.Jump(); } else { throw new NotImplementedException(); } } }