From feb09bb6bcfe2a97658b7d7808290c645f75224c Mon Sep 17 00:00:00 2001 From: huiyadanli Date: Sat, 21 Oct 2023 14:08:16 +0800 Subject: [PATCH] AutoGeniusInvokation: migrate code --- .../BetterGenshinImpact.csproj | 102 ++ .../Recognition/OpenCv/CommonExtension.cs | 24 + .../Recognition/OpenCv/MatchTemplateHelper.cs | 75 +- .../OpenCv/OldMatchTemplateHelper.cs | 304 ++-- .../Assets/1920x1080/dice/action_anemo.png | Bin 0 -> 1882 bytes .../Assets/1920x1080/dice/action_cryo.png | Bin 0 -> 1823 bytes .../Assets/1920x1080/dice/action_dendro.png | Bin 0 -> 1956 bytes .../Assets/1920x1080/dice/action_electro.png | Bin 0 -> 1862 bytes .../Assets/1920x1080/dice/action_geo.png | Bin 0 -> 1699 bytes .../Assets/1920x1080/dice/action_hydro.png | Bin 0 -> 2006 bytes .../Assets/1920x1080/dice/action_omni.png | Bin 0 -> 1812 bytes .../Assets/1920x1080/dice/action_pyro.png | Bin 0 -> 1690 bytes .../Assets/1920x1080/dice/roll_anemo.png | Bin 0 -> 5575 bytes .../Assets/1920x1080/dice/roll_cryo.png | Bin 0 -> 4737 bytes .../Assets/1920x1080/dice/roll_dendro.png | Bin 0 -> 6119 bytes .../Assets/1920x1080/dice/roll_electro.png | Bin 0 -> 5782 bytes .../Assets/1920x1080/dice/roll_geo.png | Bin 0 -> 5147 bytes .../Assets/1920x1080/dice/roll_hydro.png | Bin 0 -> 5487 bytes .../Assets/1920x1080/dice/roll_omni.png | Bin 0 -> 6348 bytes .../Assets/1920x1080/dice/roll_pyro.png | Bin 0 -> 4939 bytes .../Assets/1920x1080/other/元素调和.png | Bin 0 -> 2808 bytes .../Assets/1920x1080/other/元素骰子不足.png | Bin 0 -> 3643 bytes .../Assets/1920x1080/other/冻结.png | Bin 0 -> 2234 bytes .../Assets/1920x1080/other/出战角色.png | Bin 0 -> 2462 bytes .../Assets/1920x1080/other/回合结束.png | Bin 0 -> 1457 bytes .../Assets/1920x1080/other/回合结算阶段.png | Bin 0 -> 4600 bytes .../Assets/1920x1080/other/对方行动中.png | Bin 0 -> 1251 bytes .../Assets/1920x1080/other/满能量.png | Bin 0 -> 914 bytes .../Assets/1920x1080/other/确定.png | Bin 0 -> 1674 bytes .../Assets/1920x1080/other/确定_1600x900.png | Bin 0 -> 1296 bytes .../Assets/1920x1080/other/空能量.png | Bin 0 -> 835 bytes .../Assets/1920x1080/other/角色死亡.png | Bin 0 -> 5400 bytes .../Assets/1920x1080/other/角色状态_冻结.png | Bin 0 -> 875 bytes .../Assets/1920x1080/other/角色状态_冻结2.png | Bin 0 -> 2234 bytes .../Assets/1920x1080/other/角色状态_水泡.png | Bin 0 -> 550 bytes .../Assets/1920x1080/other/角色血量上方.png | Bin 0 -> 1044 bytes .../Assets/1920x1080/other/角色被打败.png | Bin 0 -> 7129 bytes .../Assets/1920x1080/other/退出挑战.png | Bin 0 -> 10207 bytes .../Assets/AutoGeniusInvokationAssets.cs | 154 ++ .../Exception/DuelEndException.cs | 8 + .../Exception/RetryException.cs | 12 + .../GeniusInvokationControl.cs | 1271 +++++++++++++++++ .../Model/ActionCommand.cs | 82 ++ .../AutoGeniusInvokation/Model/ActionEnum.cs | 45 + .../AutoGeniusInvokation/Model/Character.cs | 115 ++ .../Model/CharacterStatusEnum.cs | 8 + .../AutoGeniusInvokation/Model/Duel.cs | 382 +++++ .../Model/ElementalType.cs | 101 ++ .../Model/RollPhaseDice.cs | 42 + .../Model/RoundStrategy.cs | 28 + .../AutoGeniusInvokation/Model/Skill.cs | 23 + .../AutoGeniusInvokation/ScriptParser.cs | 171 +++ .../AutoGeniusInvokation/Utils/Retry.cs | 54 + .../GameTask/Model/RectArea.cs | 60 +- .../GameTask/Model/SystemInfo.cs | 2 +- .../Placeholder/PlaceholderTrigger.cs | 12 - BetterGenshinImpact/GameTask/SystemControl.cs | 12 +- .../Helpers/Extensions/ClickExtension.cs | 16 +- 58 files changed, 2892 insertions(+), 211 deletions(-) create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_anemo.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_cryo.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_dendro.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_electro.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_geo.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_hydro.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_omni.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_pyro.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_anemo.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_cryo.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_dendro.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_electro.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_geo.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_hydro.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_omni.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_pyro.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/元素调和.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/元素骰子不足.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/冻结.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/出战角色.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/回合结束.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/回合结算阶段.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/对方行动中.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/满能量.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/确定.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/确定_1600x900.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/空能量.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色死亡.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色状态_冻结.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色状态_冻结2.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色状态_水泡.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色血量上方.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色被打败.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/退出挑战.png create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Exception/DuelEndException.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Exception/RetryException.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/GeniusInvokationControl.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ActionCommand.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ActionEnum.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Character.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/CharacterStatusEnum.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Duel.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ElementalType.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/RollPhaseDice.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/RoundStrategy.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Skill.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/ScriptParser.cs create mode 100644 BetterGenshinImpact/GameTask/AutoGeniusInvokation/Utils/Retry.cs diff --git a/BetterGenshinImpact/BetterGenshinImpact.csproj b/BetterGenshinImpact/BetterGenshinImpact.csproj index 618fc02f..2647a869 100644 --- a/BetterGenshinImpact/BetterGenshinImpact.csproj +++ b/BetterGenshinImpact/BetterGenshinImpact.csproj @@ -71,6 +71,108 @@ Always + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + Always diff --git a/BetterGenshinImpact/Core/Recognition/OpenCv/CommonExtension.cs b/BetterGenshinImpact/Core/Recognition/OpenCv/CommonExtension.cs index 5645efc7..abc5e1f3 100644 --- a/BetterGenshinImpact/Core/Recognition/OpenCv/CommonExtension.cs +++ b/BetterGenshinImpact/Core/Recognition/OpenCv/CommonExtension.cs @@ -4,6 +4,9 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; +using OpenCvSharp; +using Vanara.PInvoke; +using Point = System.Drawing.Point; namespace BetterGenshinImpact.Core.Recognition.OpenCv { @@ -55,6 +58,27 @@ namespace BetterGenshinImpact.Core.Recognition.OpenCv } + public static OpenCvSharp.Point GetCenterPoint(this RECT rectangle) + { + if (rectangle.IsEmpty) + { + throw new ArgumentException("rectangle is empty"); + } + + return new OpenCvSharp.Point(rectangle.X + rectangle.Width / 2, rectangle.Y + rectangle.Height / 2); + } + + public static OpenCvSharp.Point GetCenterPoint(this Rect rectangle) + { + if (rectangle == Rect.Empty) + { + throw new ArgumentException("rectangle is empty"); + } + + return new OpenCvSharp.Point(rectangle.X + rectangle.Width / 2, rectangle.Y + rectangle.Height / 2); + } + + public static System.Windows.Media.Color ToWindowsColor(this Color color) { return System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B); diff --git a/BetterGenshinImpact/Core/Recognition/OpenCv/MatchTemplateHelper.cs b/BetterGenshinImpact/Core/Recognition/OpenCv/MatchTemplateHelper.cs index ce221497..8dfe81ff 100644 --- a/BetterGenshinImpact/Core/Recognition/OpenCv/MatchTemplateHelper.cs +++ b/BetterGenshinImpact/Core/Recognition/OpenCv/MatchTemplateHelper.cs @@ -1,13 +1,8 @@ -using OpenCvSharp; +using Microsoft.Extensions.Logging; +using OpenCvSharp; using System; using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; using Point = OpenCvSharp.Point; -using BetterGenshinImpact.GameTask.AutoSkip; namespace BetterGenshinImpact.Core.Recognition.OpenCv { @@ -17,12 +12,13 @@ namespace BetterGenshinImpact.Core.Recognition.OpenCv /// /// 模板匹配 + /// TODO 算法不一样的的时候找点的方法也不一样 /// - /// - /// - /// - /// - /// + /// 原图像 + /// 模板 + /// 匹配方式 + /// 遮罩 + /// 阈值 /// 左上角的标点 public static Point MatchTemplate(Mat srcMat, Mat dstMat, TemplateMatchModes matchMode, Mat? maskMat = null, double threshold = 0.8) { @@ -53,5 +49,60 @@ namespace BetterGenshinImpact.Core.Recognition.OpenCv return new Point(); } } + + /// + /// 模板匹配多个结果 + /// + /// + /// + /// + /// + /// + /// + public static List MatchTemplateMulti(Mat srcMat, Mat dstMat, TemplateMatchModes matchMode = TemplateMatchModes.CCoeffNormed, Mat? maskMat = null, double threshold = 0.8) + { + var points = new List(); + try + { + using var result = new Mat(); + if (maskMat == null) + { + Cv2.MatchTemplate(srcMat, dstMat, result, matchMode); + } + else + { + Cv2.MatchTemplate(srcMat, dstMat, result, matchMode, maskMat); + } + + while (true) + { + Cv2.MinMaxLoc(result, out _, out var maxValue, out _, out var maxLoc); + + if (maxValue >= threshold) + { + points.Add(new Point(maxLoc.X, maxLoc.Y)); + + //Fill in the res Mat so you don't find the same area again in the MinMaxLoc + Cv2.FloodFill(result, maxLoc, new Scalar(0), out _, new Scalar(0.1), new Scalar(1.0)); + } + else + { + break; + } + } + + return points; + } + catch (Exception ex) + { + _logger.LogError("{Ex}", ex); + return points; + } + } + + public static List MatchTemplateMulti(Mat srcMat, Mat dstMat, double threshold) + { + return MatchTemplateMulti(srcMat, dstMat, TemplateMatchModes.CCoeffNormed, null, threshold); + } } } \ No newline at end of file diff --git a/BetterGenshinImpact/Core/Recognition/OpenCv/OldMatchTemplateHelper.cs b/BetterGenshinImpact/Core/Recognition/OpenCv/OldMatchTemplateHelper.cs index a608410b..02b4ec5f 100644 --- a/BetterGenshinImpact/Core/Recognition/OpenCv/OldMatchTemplateHelper.cs +++ b/BetterGenshinImpact/Core/Recognition/OpenCv/OldMatchTemplateHelper.cs @@ -6,177 +6,177 @@ using System.Collections.Generic; using System.Drawing; using Point = OpenCvSharp.Point; -namespace BetterGenshinImpact.Core.Recognition.OpenCv +namespace BetterGenshinImpact.Core.Recognition.OpenCv; + +[Obsolete] +public class OldMatchTemplateHelper { - public class OldMatchTemplateHelper - { - private static readonly ILogger _logger = App.GetLogger(); + private static readonly ILogger _logger = App.GetLogger(); - public static double WidthScale = 1; - public static double HeightScale = 1; + public static double WidthScale = 1; + public static double HeightScale = 1; - public static Point FindSingleTarget(Bitmap imgSrc, Bitmap imgSub, double threshold = 0.8) - { - Mat? srcMat = null; - Mat? dstMat = null; - try - { - srcMat = imgSrc.ToMat(); - dstMat = imgSub.ToMat(); - return FindSingleTarget(srcMat, dstMat, threshold); - } - catch (Exception ex) - { - _logger.LogError(ex.ToString()); - return new Point(); - } - finally - { - srcMat?.Dispose(); - dstMat?.Dispose(); - } - } + //public static Point FindSingleTarget(Bitmap imgSrc, Bitmap imgSub, double threshold = 0.8) + //{ + // Mat? srcMat = null; + // Mat? dstMat = null; + // try + // { + // srcMat = imgSrc.ToMat(); + // dstMat = imgSub.ToMat(); + // return FindSingleTarget(srcMat, dstMat, threshold); + // } + // catch (Exception ex) + // { + // _logger.LogError(ex.ToString()); + // return new Point(); + // } + // finally + // { + // srcMat?.Dispose(); + // dstMat?.Dispose(); + // } + //} - public static Point FindSingleTarget(Mat srcMat, Mat dstMat, double threshold = 0.8) - { - Point p = new Point(); + //public static Point FindSingleTarget(Mat srcMat, Mat dstMat, double threshold = 0.8) + //{ + // Point p = new Point(); - OutputArray? outArray = null; - try - { - dstMat = ResizeHelper.Resize(dstMat, WidthScale); + // OutputArray? outArray = null; + // try + // { + // dstMat = ResizeHelper.Resize(dstMat, WidthScale); - outArray = OutputArray.Create(srcMat); - Cv2.MatchTemplate(srcMat, dstMat, outArray, TemplateMatchModes.CCoeffNormed); - double minValue, maxValue; - Point location, point; - Cv2.MinMaxLoc(InputArray.Create(outArray.GetMat()), out minValue, out maxValue, - out location, out point); + // outArray = OutputArray.Create(srcMat); + // Cv2.MatchTemplate(srcMat, dstMat, outArray, TemplateMatchModes.CCoeffNormed); + // double minValue, maxValue; + // Point location, point; + // Cv2.MinMaxLoc(InputArray.Create(outArray.GetMat()), out minValue, out maxValue, + // out location, out point); - if (maxValue >= threshold) - { - p = new Point(point.X + dstMat.Width / 2, point.Y + dstMat.Height / 2); - //if (VisionContext.Instance().Drawable) - //{ - //VisionContext.Instance().DrawContent.PutRect("", new System.Windows.Rect(point.X, point.Y, dstMat.Width, dstMat.Height)); - //VisionContext.Instance().DrawContent.TextList - // .Add(new Tuple(new System.Windows.Point(point.X, point.Y - 10), maxValue.ToString("0.00"))); - //} - } + // if (maxValue >= threshold) + // { + // p = new Point(point.X + dstMat.Width / 2, point.Y + dstMat.Height / 2); + // if (VisionContext.Instance().Drawable) + // { + // VisionContext.Instance().DrawContent.PutRect("", new System.Windows.Rect(point.X, point.Y, dstMat.Width, dstMat.Height)); + // VisionContext.Instance().DrawContent.TextList + // .Add(new Tuple(new System.Windows.Point(point.X, point.Y - 10), maxValue.ToString("0.00"))); + // } + // } - return p; - } - catch (Exception ex) - { - _logger.LogError(ex.ToString()); - return p; - } - finally - { - outArray?.Dispose(); - } - } + // return p; + // } + // catch (Exception ex) + // { + // _logger.LogError(ex.ToString()); + // return p; + // } + // finally + // { + // outArray?.Dispose(); + // } + //} - public static List FindMultiTarget(Mat srcMat, Mat dstMat, string title, out Mat resMat, - double threshold = 0.8, int findTargetCount = 8) - { - List pointList = new List(); - resMat = srcMat.Clone(); - try - { - dstMat = ResizeHelper.Resize(dstMat, WidthScale); + //public static List FindMultiTarget(Mat srcMat, Mat dstMat, string title, out Mat resMat, + // double threshold = 0.8, int findTargetCount = 8) + //{ + // List pointList = new List(); + // resMat = srcMat.Clone(); + // try + // { + // dstMat = ResizeHelper.Resize(dstMat, WidthScale); - Mat matchResult = new Mat(); - Cv2.MatchTemplate(srcMat, dstMat, matchResult, TemplateMatchModes.CCoeffNormed); + // Mat matchResult = new Mat(); + // Cv2.MatchTemplate(srcMat, dstMat, matchResult, TemplateMatchModes.CCoeffNormed); - double minValue = 0; - double maxValue = 0; - Point minLoc = new(); + // double minValue = 0; + // double maxValue = 0; + // Point minLoc = new(); - //寻找最几个最值的位置 - Mat mask = new Mat(matchResult.Height, matchResult.Width, MatType.CV_8UC1, Scalar.White); - Mat maskSub = new Mat(matchResult.Height, matchResult.Width, MatType.CV_8UC1, Scalar.Black); - var point = new OpenCvSharp.Point(0, 0); - for (int i = 0; i < findTargetCount; i++) - { - Cv2.MinMaxLoc(matchResult, out minValue, out maxValue, out minLoc, out point, mask); - Rect maskRect = new Rect(point.X - dstMat.Width / 2, point.Y - dstMat.Height / 2, dstMat.Width, - dstMat.Height); - maskSub.Rectangle(maskRect, Scalar.White, -1); - mask -= maskSub; - if (maxValue >= threshold) - { - pointList.Add(new Point(point.X + dstMat.Width / 2, point.Y + dstMat.Height / 2)); + // //寻找最几个最值的位置 + // Mat mask = new Mat(matchResult.Height, matchResult.Width, MatType.CV_8UC1, Scalar.White); + // Mat maskSub = new Mat(matchResult.Height, matchResult.Width, MatType.CV_8UC1, Scalar.Black); + // var point = new OpenCvSharp.Point(0, 0); + // for (int i = 0; i < findTargetCount; i++) + // { + // Cv2.MinMaxLoc(matchResult, out minValue, out maxValue, out minLoc, out point, mask); + // Rect maskRect = new Rect(point.X - dstMat.Width / 2, point.Y - dstMat.Height / 2, dstMat.Width, + // dstMat.Height); + // maskSub.Rectangle(maskRect, Scalar.White, -1); + // mask -= maskSub; + // if (maxValue >= threshold) + // { + // pointList.Add(new Point(point.X + dstMat.Width / 2, point.Y + dstMat.Height / 2)); - //if (VisionContext.Instance().Drawable) - //{ - // VisionContext.Instance().DrawContent.RectList - // .Add(new System.Windows.Rect(point.X, point.Y, dstMat.Width, dstMat.Height)); - // VisionContext.Instance().DrawContent.TextList - // .Add(new Tuple(new System.Windows.Point(point.X, point.Y - 10), maxValue.ToString("0.00"))); - //} - //if (IsDebug) - //{ - // VisionContext.Instance().Log - // ?.LogInformation(title + " " + maxValue.ToString("0.000") + " " + point); - // Cv2.Rectangle(resMat, point, - // new OpenCvSharp.Point(point.X + dstMat.Width, point.Y + dstMat.Height), - // Scalar.Red, 2); - // Cv2.PutText(resMat, title + " " + maxValue.ToString("0.00"), - // new OpenCvSharp.Point(point.X, point.Y - 10), - // HersheyFonts.HersheySimplex, 0.5, Scalar.Red); - //} - } - else - { - break; - } - } + // //if (VisionContext.Instance().Drawable) + // //{ + // // VisionContext.Instance().DrawContent.RectList + // // .Add(new System.Windows.Rect(point.X, point.Y, dstMat.Width, dstMat.Height)); + // // VisionContext.Instance().DrawContent.TextList + // // .Add(new Tuple(new System.Windows.Point(point.X, point.Y - 10), maxValue.ToString("0.00"))); + // //} + // //if (IsDebug) + // //{ + // // VisionContext.Instance().Log + // // ?.LogInformation(title + " " + maxValue.ToString("0.000") + " " + point); + // // Cv2.Rectangle(resMat, point, + // // new OpenCvSharp.Point(point.X + dstMat.Width, point.Y + dstMat.Height), + // // Scalar.Red, 2); + // // Cv2.PutText(resMat, title + " " + maxValue.ToString("0.00"), + // // new OpenCvSharp.Point(point.X, point.Y - 10), + // // HersheyFonts.HersheySimplex, 0.5, Scalar.Red); + // //} + // } + // else + // { + // break; + // } + // } - return pointList; - } - catch (Exception ex) - { - _logger.LogError(ex.ToString()); - return pointList; - } - finally - { - srcMat?.Dispose(); - dstMat?.Dispose(); - } - } + // return pointList; + // } + // catch (Exception ex) + // { + // _logger.LogError(ex.ToString()); + // return pointList; + // } + // finally + // { + // srcMat?.Dispose(); + // dstMat?.Dispose(); + // } + //} - public static Dictionary> FindMultiPicFromOneImage(Bitmap imgSrc, - Dictionary imgSubDictionary, double threshold = 0.8) - { - Dictionary> dictionary = new Dictionary>(); - Mat srcMat = imgSrc.ToMat(); - Mat resMat; + //public static Dictionary> FindMultiPicFromOneImage(Bitmap imgSrc, + // Dictionary imgSubDictionary, double threshold = 0.8) + //{ + // Dictionary> dictionary = new Dictionary>(); + // Mat srcMat = imgSrc.ToMat(); + // Mat resMat; - foreach (KeyValuePair kvp in imgSubDictionary) - { - dictionary.Add(kvp.Key, FindMultiTarget(srcMat, kvp.Value.ToMat(), kvp.Key, out resMat, threshold)); - srcMat = resMat.Clone(); - } + // foreach (KeyValuePair kvp in imgSubDictionary) + // { + // dictionary.Add(kvp.Key, FindMultiTarget(srcMat, kvp.Value.ToMat(), kvp.Key, out resMat, threshold)); + // srcMat = resMat.Clone(); + // } - return dictionary; - } + // return dictionary; + //} - public static Dictionary> FindMultiPicFromOneImage(Mat srcMat, - Dictionary imgSubDictionary, double threshold = 0.8) - { - Dictionary> dictionary = new Dictionary>(); - Mat resMat; - foreach (KeyValuePair kvp in imgSubDictionary) - { - dictionary.Add(kvp.Key, FindMultiTarget(srcMat, kvp.Value.ToMat(), kvp.Key, out resMat, threshold)); - srcMat = resMat.Clone(); - } + //public static Dictionary> FindMultiPicFromOneImage(Mat srcMat, + // Dictionary imgSubDictionary, double threshold = 0.8) + //{ + // Dictionary> dictionary = new Dictionary>(); + // Mat resMat; + // foreach (KeyValuePair kvp in imgSubDictionary) + // { + // dictionary.Add(kvp.Key, FindMultiTarget(srcMat, kvp.Value.ToMat(), kvp.Key, out resMat, threshold)); + // srcMat = resMat.Clone(); + // } - return dictionary; - } - } + // return dictionary; + //} } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_anemo.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_anemo.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e95226fd535d644206d1df53ba7324f5157d2b GIT binary patch literal 1882 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 literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_hydro.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_hydro.png new file mode 100644 index 0000000000000000000000000000000000000000..b44962dfd0d8c2e3eb23368520c6ac15510e2b74 GIT binary patch literal 2006 zcmV;{2Pyc8P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2Wv@0K~zXfHI?U6 zlxY^l`)}G>bw-iUgzm;67?9A!hNejkNCq(glB1G?2#Tnv1PL}E0!k7wG7jR-IO^^= zOU*d7wexLjtA2aH+7Gwhx9Y9;InO!woO=x={V&OAd`v>c4EFMAk}6%KRLziFJ&Ut; z5oi5VGMj&()&=d)U|<_k`#)l9e$L5~3EacZ;T~Fyhn}7h=P*W=;T=5rw6q6iZ{KCMLfoat0xK1}623W>&%qN#7(C;9 z@Urz1k~2oF^cnlCp1gzJw_n*5b$?G;{~Kxsx41O4C7@S?ND8l*dfdayRXWgmfuNi| zF*DcAASiJvB+6oQI+^Pnuuw7NJPzjtf~XSxg0o}C!k^sK8`+& z@!cxj($2~QGAo{5LPg*zHBnE zu*0k*b&1Wmn8wJJDOa{g>DyL+mI<%CPjJy7`;QiK;8=m!P7~YsKw$Sd9DW}6$Z`z6 zi31AN0Or&|{GE3(rQXIreS+BXHIC=rlcb#_mffRg?h|dJKTzEAKvKxQ32lTcbKw`p z39pzULhl~2)qH#6G(q`SWr#%*T9(w73Y{U>nNn|HO1r6#_esD0I~h0sjeq7O*7NgZ zG%YJvGlXOh;9;%CEVu0%;7~}3WGZ4`K)zTM6Iwn&MCGKI%;L6dj_67fT9-*|U*D6@ zXsg3uP8*R_!^*=uG6w&^dE;Lk$$20tuM=~ALLt^Ts+z!@*oH@BJ#Jy;xJ6W|s@Ny6 zzY1($&}sE$hM2|$yy6@1jH#8?*OaL>jByQnWw2z-V$PVxk}-*`{b&8~8dLf>-iiJA z*t@Wm-Xo&$7VgoFGE9qZJx5aaD=f}F+^jY1KX!)wCrSvdm?Tz{!6wPPV(Um$cpY70 z^nV~z=3~sK=5@FWlXDE;)Vuhm+{S3{m*(xb$24;|s)5ML2PAbpCsF0R`lHP724~-v zdfJbtE^sKKT0n~$w(3i4*SkkdovK!5$Xv!JV+mj9tU&JJEw>pRH}Ht>!y~Rs z%sO>}t2laIeXZ^n>gCUp`2$%)pGi@&gYt%@$N=`%4Pq}Y>XOYe!y_!|S2$#?!Y!&s zITDD`sgKTwcqLEbX&)l4V;g(dTLBEJf7eLtc}X$Jy)}5HJis$$29Km^JRGuU(m2lRUzCwgnA7CQ z)B%z-_~I@-!8@r3V?sN@IU@r4NcP?(rj-Gw1j&Z|Q3lED?}5hky3C?E6rY;2GYI?ma1ka)&jpMmefL zpE&0dgBbz8=k(+b=VpHAjGk64(a18Fdfdb}5dv~c7{!=+A5+#Gmh3r>Zb z>ja(Fvv3~&oC)<}3!juLVs)9oyio#kM+h$51)9>Pb#Zq33z^rqDVhC3T*Cs<+RnE6 zN7x!3@m=n1 zFWKe^EO;n3Go<$ZBs+iP_*oa;b}@4FYKlw{DCyE<@63UpD4N*OYFO7a*j;>2bs=ru zOY0g-%bFM~SgQo&U$}}za+z|(N)y47Gb?7(_~%Ut_#XbJMwPK4j-R=&RlTB|tdiQZ zr3}5p-twHFf-%C&=ZU_!yNfo6?|81@zr@<`l#^AfgjKE+sxo{N-HLDS3}*GkPs~gL zGG|X>${5qcxPxE%Ei73#@k#DizAke(TKgySj^^PVWoMA!v$FzvOmxE&P4x|8nqOdT od_ic<1}CdGI9|TaUxLr_KgS*pwy?)HyZ`_I07*qoM6N<$g8oz8H2?qr literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_omni.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/action_omni.png new file mode 100644 index 0000000000000000000000000000000000000000..e735dabbb3578d287b79bcfc911dd881b8b2bafd GIT binary patch literal 1812 zcmV+v2kZEWP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2B}FzK~zXf9hB!= zn^zLW_19+C*(5lLP45DM5CV*lK%ibgz4tDGM3F#Lw-94*9ItyLHpcej-wysT&wD?- z_net?&lyEMr=y&lq7SvrIzu_4C6?^{;EZv>h`uef<4dNV}#HpOcrMx8s(s?m1 zoyU}49OiI_y%c7ZA zB`0Tb3--Ql%w0oRyOr`C!`P)_xmS&GV4B6@SroN`j(Tz7`#a=AO3_^^JWN^M;px5| zo(aL*8V9KrS}_a0@lO6q8adza@+|Md)jx=(XBg{M=iO5*b!%Ac*J2QY*#Rwzu=Bcr zPt(X7sKlnIM%7fpDoQ?;fX8Km96T+u6E(9Fu@W5XC8+GU)693P(cBzEbw$uC1VPIWge*T2v0fv*@^8w%33f7; z@3Qcs46o}#;FR;OOti;&EyVNWD(}iEBI;XsMrWma4f>mEW^Rl#+cm*tkBZ3wHRDP( zilqA|682w+S*{UX{*kc0gP6WkWXTJOfWF%0ejx<^lk?*}{!Xm&wv-TKrFfc)aT@ip z)HTjb#|YCm#?T13dSHSHrO2e776RALLeN3V@hfrTbz+O1l&zy&v}|0qyaKwzNjd_L zw)u9u!GV2|7nzU{1-avMa^$gd9Q2SknoxHt(F{#7Jvz;lW`?(#1zNPf4RVt3ayJ*{q!uUWwxieSSuz+{F)c}wEj<)X{cO4?6EZg_d_#4c2-S#VuCN#1ea1D%Q3O%Ey;k6@SK_Gypb2{dHyQL@f(aROlYy` z4V>;JIc;Y+J;-3QFJpHI!KO*cS;zoK;*^%3U7LZ-v}{z>43+75zSI(2R8yQ+(}bs% zh#Q=IXsz?{_BJ2xZWFSu;aoIh)ET(bO!Dw3!=t0L5G>-b%QkJ9MT&M<O|0P?$H9)f&Y)%Oo^L;?j9mXW_h_cMY&xlReQ(QLE zyxmCfW+TNX$--7F#%4Cl$G;DF`Jl!7zuJ6zbs}s1Sdzal=UqNMEKu->O&cq>crTav zvngTPgNO3dpGQI{=c77b+hs1c(y}px+GObIjK_ zhe9HE&yP567TK&sQS5qMv^;CHd{Nq-7>E8OkMiq0$mRGWnc^T2Ahl#7s9$1jVVSUF zjqs|MNWjNdEy->@!*Q$1{&tyKDa+PIiAF6;qmpDx+^5(NiF3Sun*InoqG@wA%CLv@?jdJ&$bMSFBQA04j3lnW{Xv3W4{=FvCKaVBz>QjgW~0JZqs-2RoF#PIW;LPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1}{lOK~zXfJ(T%V zR97Cw-#;}qI)Sk7z0uGM`_e$ufP#uj)7U}-Dl{~UQ4=(lWh@O6L{ULeS(*lyxFj>9 zWk!=qWi(c$X3R{+aweuGpE(aw^TVk}ck@2qbI(2Z8tWYu-0iI7UZ|Sep&IV(uV<~Z zhPxpjkGg94sxQFvNCV%GwZm{VCp>8!bEPp>oJP!*!H7G9aZd(Ey_tMilF5m(EIz5o zz*z05B;HX)LQqq2X;r|r&RV|IkQcF?yc}qOb72^%;pq+sN8RZg;Nkx(ol$du;76p1 z(rk>Spn&`9SnjN5F<3=>pO1J~9c$9l!B)OG*u;;A_rT3T7$}4OQa&&pOVQt;QEAAX zNlY5kfWv|t%UwQJ3&!dcx7A}*YbUblau9o z*#sA*GOAo-ipB&-i&Hl=q`}7h(IB@6+KBJ>Zw$C2mv?&tJka0I4m889Ay^)h>v3Lm zxL9s1;7>aW8P~=|1s-yyZa9w?r7$Q(U8xLeh;i0u?Y^cB=;x6D9N)`# zv0VZW%k5!U9AVb);J@7-PI)tkIn#I@axtzPO-&SXUnk4M#jwWE-bCI{d%MR98sE^dO~go=bmw$G-c(&6< zpXCqq3fA|V4%ptqxLBFRg{my3^_(ipfNnR8`2>r>>JgY7;-`}ln2U11DF-61jb?mW zn$F8z7GCTu;FSA)`Yi%lw{AEebR=V3t;ykfT@G`#IegphfDe`LXf5<@H&1*q_ z>agklNaan)&T;cDQJ0M=T^JXuGPN;Y*6Z`&fJZTScoHnB`K?*RA>7uFn?OB|s79OH!E9 zZf#D)fsjB}8+9W%_gbL+0m3JWrC$+K0Spf)Z)4J>|RGF=C z!afIPTdw+Yp;vBuJObxxKsIweb5**G`n+6F?S9o}n(yBaWN|{-zSEEiGvhO!WD-6B zyR2L-OW|=#0UY!)TO)V9a<3Rn#}_IkJ!fkL9w=q5p@7+X?TLBg9V+3xj7*oMDkcjb zsTsyucM_8lVY@cY!!=(v%l-nsYPD{<6?jT7oh#2|MsfTjSj1()uLydxN&gco=Wd&w zXYE?4hJ2z^dCaK;GE<(yLUksKs@(Hdi`=^TdxwK7%J!1kmfm6#I=-I@d_ft{YWb%A zVs?J8gc|{^aHw3W;ELa(`^3szz^?naHj7(wxu`?3QlHDJU(1Wg>42N38uXc3b4is% zyKT0D9=B>$$h_I0el=*Yl$Svlmj%7n?9eLg+>nfiIskVXvWeG80-Ns4!?IYX7yHbH zIGI=8=gQKVt}tC^@$C+|H1qE+W+7nVX0x5e?S;hKidfpNzng3rPnz<0;XfUeK+ub&1D&#!8>D+9`RbRf`Sy|rZB+=?*wY7+q7AH#qfuA+! z@i>sn9|e9S@IAlcP%JlUv$>+|r{r`}y(DA<9R~Ahem31-S2I?cZ6xG!P4M;YPU3PK zZ?s@Mm*eL;<4*+tQqTu-yrx)g33^SArzPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D64+H0@9AIEJVsf;tdEr!Z`yy!lx=gS z9DsEgu)FdVu)kP=N8VKM>1CSS@s*-)?Ns(MXfd2q##i`{AKIwXGKnK?? zRapIUg|@HJl>6Hh)b+I{RL|9f%6YO^7R!EcmOS_5YTT|&x$l~(QNJc@)P@-v^+Te@ zd=sz#T;ZpGe{Z7PMwf@k{mU46eHSn9pHeNb_O01+>~PAjB2WJNVB)9&yIc_$zgGP3 zm5S>5yFy{sfUp=m2~fa=@tLsta<1hHJ-q_Z4kX z_=hH(Sfqf%C2|~|Ew2N4^4jN=7r@7CP1ooRN&253;sBnYzd-DNtehaXv0p@K+;<7c zAVuE4&Xf(X_MJI$?9NqSX_pEnJ$fT7{{&#qP04`Gu)x|4vj+?0f9y?#5EGBjh26hv^4%Spc5km@?;XQ3U4v7=8tf_HqH{tMofgAUIO4fihXcIi4Tt`?p~E5 zuYRYX`h{{FDV5K$QaP%Nc4vl0{eqrCGKfH6Qn0wmGyiU`0(@P0)5TK-9DDK0=5fMMqWbm4P_ zbB*fx0)SsA!o>N{UGJG-Gn3D+r4EkCIozeZ*WJoxP3K4_S!~dh%NrGYcOUGwlF>$G z3^yxc;A?pt$dE@BfMMCqpB_E|IRw&S;;#It+~=*z96GC_=X~Mu2~Fz#M%fhGoR=*A z`n>Xqvf+NEJgCA2K2*#l!1b(if%`K69KpRwSfaU_2)Dq0p~-#UD3iL#e|155x}btr z=KDJV2QfP4W-dqC-sp2o_|spse$3Sk3Oun;{ZCb?fr^-1~gON8O?g#3*bKGt4BE_9ZDvH2{e&x06KM^ zO`z-7?YPKEg|@5$@M1+=*(iI>9Jx)uyIrZn^_I?jYnEeKn^mZOzR+zgIOl~6bjELo zl?Xd&Pij>*a#^LYykPjUvYs|8YT!#v>Hk`heE_op;AAWE($`$MZ-M<586DNE;Y%uF z{aLU2H1qixrI5j7d_MDKGn#hEBp1+mFrDz=5H|P$n_jPskrsvYu9Mpg8bcw#GDaF* zEte@QnT1OPgWNX~D2C~hp?>8*smDnwl=Seh1$zF-EtS5$hqKU37+|8W{?i5Wk_&7k zU=8r7fp3*?ZyzAe19m_qd^er?h#x$tbQ(ts8x&2^#xiqc zvx#ZUGHwYsH!E+rTSa^!^YIx)8=LC*lreHYpf9O(xX)T>HrE9s*Od3PLvgoo52`um zMT6xSb9757_p23s?Vp-*b^X5p8+N0R+qBy|HS6U?*k#kt+m!aWR?}|$ij_5J*2sAk zBauQRQb6R5KptQd2lpzv_ghWByIbimvD1-@%pFy7n+o0eXwf;+PU^ey;8soLK_P8l zD3&%oi=7pt*||ekEbW$!T+uuj%6rjF%62Q}#%^YUBg(?7lbO6?u5Hw$0hmT2F;~6^ z>~^I+KdrP!Cz;Il(Dm|J4nc zy#Zs5ioeg1iNcHO|4vbtzq8n#eDxbeUS6+BS7Dh-k0q0tG^AN0{bXeTTZ8SPUgg7l z4p~cnv`;CIDit%ZkxXq-0u3t*m&(R5vR-wlaJWrV@9dP@#M29u{`)b_d)rzjshked}rSs}y@}y^@$^(w;K2ko8=V z@zjTo#j>cM9v{MCCYthS2%^SMJMy|uk1*)gL=8GqW7I_B9!e2*>&+X-~R@PY4@`sB3oUR|Wk zwkYl)j({X`$=vLbt11~Lkl$=#&JgQUKZSI?e5;|bLBh$}Ie^Wf6ULfJ?s%EpCe+O5 zFu6b>?aLKU<(eYPrx*-q;||8)O%zcW#kx%NYxdAp6=L#P07_v9&wAFTyq8^y;(X?W zDdV*!-A=%zQ#1)wcPgHnW(FE8G3!aAijZL0$X#4$0AftxnMQI6usDSU7={@GvR<|* z0jHSM{jma1EtH$zv3UwO^|pf0a!AWN3h)0CR@t!yjIQ>w2i9?lmwhV5)>0qVD0Q$} z3AguXDn4nNMl>hijK?joaZb^ zjdt>^D`aoLib4u8m*RH9b`kgEZ)~?_?7;fBHNNgGrnO^pi8~_~J(j?pw{eoTxijYhnin+aB(nTcg0{cQm18xyGMaD*uxU z0lb*QaVdZgmsqD%pV~6{7{CpS87uEpo&phql z#oAq~c+M(~?=aWZ@^4&a+50iTzfJXD1$eC{^#8!2)ePvDm5O$K z`#w_i!#(Jc0@Fi^_O8;f#-IzI$iMRg`E{^%`%2aaWa~2dQAdu(rSdtmME28*WIy?q zY&CBJxRjGeF~|JMBH4}_S-^7LeEC4Xqkf6}8{a_|f0LgDx?KKk@5v8y_iN`U-U;CD zcN9uvnEs$r$qY{MPfjTO=5|FhD1VE7+LTy&=>4$Q*f98o&n&<#Tkl?8l(I1|9PO zJ8AGmJHC9;uD;z5f=w62ozf>&XvP>sqP>Oq2L+2bI z12>UEox+$)9G#p(u5VE!hs;2V&J?!=7D606#}H%yI~tbA1_o~f7EE5%4DU$St8$jy zy!IE!cDNXp0S(JG3p84$Dh<=V4Y1q@%Pl5dhUpbn1f%as*EsLt&8F>UJ?}yW{mP_K z%)p-`Zc%W9l}uhOoK6N+`1&$~3>}L`k^1PAB5!=p=E)dq`u+(P8QMAK+pt-0dV_cE zo3L9d&m(g=ITy?0U;%*l<#A>zg7OkT&w=Sum_{@I5A-`0(yD7J5M`&(CVo&Am$HbQ1rpjx1Cu5zuBM`EHZdOl}eGVtM9 zcI?$=bc;N_YhV^Uo`+}4<4_SteE@sz$&=UqLg+5BXtz~kaj@)Tq`_Ir2Rm`pFLeQK z`Xic`Bb9QjZngXx764!qb4IU9U){2bEt5`}`hv3=4WNWV%jR^E^SVz-Y$Ak%t|?%b zX5V#zwF(SojSMJ!pOY@#dSM1$n1UySdK@T}$KE`-dF*n^o1?w~ZDSX9c4I$kST2(< z4BP7#0{m_Hv8bc|Z`ciiL;`rA#dzCtd7Y(8GD6N|4#+3v)37f`%NlH|T(RhPChVp% zJcZxb$mdtc!KNJ$U?gDl>SA@F1=g!}zPy+jTwqIJw^*LknaAFIxmP#=ydy^*yPdKf zC;&8iwm>5dgl^}Hc4iGD4;R}@{lY zvaw7F9NW{`L>x0mK-+3Q$M=m3K!6PkwV%cb@PBWf;Y}y={ukKU7GMt}SBlMjPp;f| z<;ZQ^wk)~t$hLl8@Y?T^hwUIXSA{pjw1XYn0BvJ28=y_v{tq||8K&A+!rU_1nic`9 z24{Gv8Bd!OeDxQY?NkzDYdAB6qlvViSq#WU@@5^ws-;($_2xNtnwR&V%;LF53bv{u z7uel7*8j@8jop%A0XFD8D*z4k-Uns@y4aG3?I?CvZ8{BwXtC|mw!<=Yz*E(BK=_j0 zfQB-(Ue1}V-mH912XPT zjg3RLW5GCPTPA>iNs|XGdjQydC-N|$(X{8j0)Vr_Lx8RVG{Aisl1xW*G5*KH*nnZm zjurW$N8eLr3gtYPgEX9sj!7Kf!!F~&^%T=-!=`CYhEdow4Z#9B2bZF_VAXUp3+P^0 zh1qe)b?iR?(UU;9W!I8<3{WG9`MOFj=IFc^(2N z&vb_@!>YUaVFnV%ZqL?ez>eLXp;4RDw$SEECPmJ7H;&N!Yo&H&x*0y~b3kJ*|DndW!9G`+DYMQ(3=pCAL;{OB=i zV~R#?O4YcnFufzoV%wdRxL4!>ya3?XAB%e)nnmi2*33fze*|Ya<^ti(-;QHgBJcT9 z{r2ND0P`E13DWLiQqK2H*D|ShrQgNqSo16cmgkP$ZhrR4gjK-)lCC#U!Kh8i`d@UD V*G{wk$k_k@002ovPDHLkV1iJy`&Iw| literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_cryo.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_cryo.png new file mode 100644 index 0000000000000000000000000000000000000000..92ef3ec95daf681c790ff2421b61a8b4b4737de5 GIT binary patch literal 4737 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 P00000NkvXXu0mjf3OPJN literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_dendro.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_dendro.png new file mode 100644 index 0000000000000000000000000000000000000000..3a1a82b507c710aaca3682beb5621f072184ea67 GIT binary patch literal 6119 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 literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_electro.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_electro.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ca2d57866fda336e9b4a9e8567875fb84b7de7 GIT binary patch literal 5782 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 UHEk%cO8@`>07*qoM6N<$g2&H#rT_o{ literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_geo.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_geo.png new file mode 100644 index 0000000000000000000000000000000000000000..52de0a99de256fcb410770a77d60fafc699c4a47 GIT binary patch literal 5147 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 JPDHLkV1n`v@7MqU literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_hydro.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/dice/roll_hydro.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5d0641dec49493d6b84b403e45bd5881bb4a35 GIT binary patch literal 5487 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 KMNUMnLSTYe6Fcw# literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/元素骰子不足.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/元素骰子不足.png new file mode 100644 index 0000000000000000000000000000000000000000..763160b8fae66b212a321b1dddf05b7db0705796 GIT binary patch literal 3643 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 N002ovPDHLkV1ilc)+7J` literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/冻结.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/冻结.png new file mode 100644 index 0000000000000000000000000000000000000000..00e0e67e85c73ce97c30c9b68cf0434850867be7 GIT binary patch literal 2234 zcmV;r2u1gaP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2v12wK~zXfRaR+N zQ`r{GAAD=IPi+vHWlTbtLMB4yIgo*bQL&%c4{d3Z01}2qn$du0Yby#i${+$s80>#g zug*~PmJY0IS}|wUV#aC2jLm@AjyB9#HAsY=7`q$7qv0rq zCLbfRJcsbs3q0Iffoynu0K-28@Z^3Fqj!TC>#-vdvSPJeixYPjzSuqZV76ePNr7FH z85fa0qf#oe^ZaBK%MgZ|fUy7Kq?7(vP#w zF#c?)!J*5Fi=F{o_6*|4=E6sf9_Qg+DYkS|_7$EyF9{;BsvY5RM39A}US<9rM0lz7$@vOQ6%eP8! z>hSTy0{8@Q3lHtQ?z_Wq4Ing#*12-}>+2vhOZ~2`~wfz~-wZ7FfECoi*LODPF{Vs+zC+kr27GY)koUK^!)ej6B)z`v3Cg#Z@PM@4D+ zaOCvh8NWZNX+T1+Lad_&vPW%g7;SFGM4cQnB^B6e*5k0li7zH6Yw5zV)tdt*sQBPz zFC}Gs>$``)`-kwi1jrC8pNR%cyZltlhZCn4U+r#|q#pCNwU}yBBB5!-n4uZ6U({;E z6%F{4fV&zKmdk4Kd&wOv6_(-o%@S<>P=pM-S^x_PzxC$oDS-)w10tBfAn(a?w@QJ{ z>xI}Typ2?G8CFZm@xGy%-!cvrj@lAqvWzN z0?*Z{@Wt$vfYY83wrZNNR8WSEf^v3tXRf(eW5M|H{}|^0h1}mI=Whp^cBF3H!ust} ze6=`nA^Id3#je4Kq_Pfi0i2-3$vX1>4I$svIk|H+ zzGOWmhWS;x&Uf}XoAO;zIku}6oC?vPJvepyu}lS~@RY11ZXuv0<8wVX82{=vQ zj6Xsr@*(TbkCW8Z{kV(@bKrW_WMr2E&a04byh|pS^#>)ElJO8c?F-_N>_4}gsBjfz z`(}2aGsG?=sHaGLxy0Q1izhZCNj z2NfeGfzsnMY_t#hcF5)x2K?3T!GY16W9}B(_U_+we?6g$Pw2z61b}uOFFW% z1#sdBlBFN(MKqC8ITo*%VMnf(nk|zDmuxf-E>@`oB9Z)k#uvgXdcg9(3$R>RjE`zP z(qt>1e-D9{rJu3!=A~HV}idT(0o}97AhOCNXDzzig9f5NPF{l56>r% z6-oSKJ)@-C9L;62UAlD}3&o{a(h=d*W_ni@cghracZ5Z<}%_(*rz*646#a_15dGfr0%3G8tX zUa2aiYRS(9ScZz^5)AM_!Eflb*jDSXpx}0>ZAQYPL)>k~uig$?=G=X( zi%9;2jfozl9(5r#WW`IHhI0EQ;1eem5bVXu``3*sEVtEQrMZfwF%yV@LKQ|@tgZk) zG5JN864OQ%#x+eyn8?=AjxnDFqkaoy8%vLon!AVf=^kuM@qjiF#>PVrJ~`d&@-7_P z8En3N)>Vv~0N?9yU{%k3w^fB>p$OGD=EibhbkH<%|2eUD;tz2qceEgGY(w0pN6cf! zSip%G&)Txre>_EM{sB_6{W!g#306!A5&g08_ojwP` zF?`Q+^$SBQuc;D~J)-Nagjz7=)8|0lMvVEbJk5GA9earX0sP#?DGnbp(*OVf07*qo IM6N<$f=m86N&o-= literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/出战角色.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/出战角色.png new file mode 100644 index 0000000000000000000000000000000000000000..fc49ffe0c3bb7da27e7c45e33c9af2989ce6cc02 GIT binary patch literal 2462 zcmV;P31Rk$P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2{TDVK~!i%<(l_b zRYwrV^M9pj)I?(}Afg~B0*Z(Qu^|Rgv0=f26^$hldn||r6-5z5Y+#Qj8dFU2S8U#A zlew9@Z{OoSP0qoSAHK)uo!Qwkv(uLM{`l#E`9Ini`sRyUY@9Ubg#`EXxM9Upe_wOIy4Dm(9iDL&% zR?cKItE}AAZ{KDf+`Z=Idt013e%Op1H_6PMx6th0xBHFPD@a*UrL*Rnegj8Y6cx|% z@_RV3_pMg*$)_0setpqxjvi_-Plw6ODlqT& z8)4UUY?f z;2SU4S-;&37(6;83mH*>f_*Z5IC5ye-HSU9M$sFVEnDH03E~u`C#hOo9ioBW6t#Nw znt=Y%fV4QehE@~{oin#01a1ooz~u?wjcd*3>HQ9S^V2gY+HV-e#d9aUbAaZvCoGT1 zz!*2z)p>#C3m;%ziQ=b=j@a5pW=sgi5~FHsYrQBfn;)77SDeh1_ZdZjeuHAMPhr)n z8q4>^$ee&j-0_dkZkt;jm&{i?ci2SZ`Jo%>f{23Q^0;+2c1&EeSQaL@R6Zh~u(UG0}bhX*PbEinhb*=Jpp2H$cf zgn7BuC`$ABQto?QS8S}4xRjYyXxI1pWltP02Elqc8+eBd%eEQft7muOcs2TrqOdBm zG69=!z0_oyP8~HFWAg((GBsQZ7D)^oGAzqlK69;Ivo?@@wdIUek`C(N^WoWcoQq*; zxpBP6cKKM3-UIWDpExx*c#xN0Viw2Fj#%n~^TW*vFSi}z(L8I{t_#fp`i!EOSJSp{ z+iEQn#psQ>U>pjeuETvWmK5H-9Rif0;qvhRWORLNueYAF2MwR*AG?w_FL15SNTbfUW=uIb&hUi*RkGikhGg`7_nHe{}DBvN^xrq@m zOX%EcmrjDC$IBdoq>93tbovOih4n^Xx^#I+wu@wn>b!m-ri6NXP#n1M;by4v@#!2C zw+=T*93yp?@y{Q1T9hwX6pV#e&jC=f(1F`Q=(&A0MAwQU26eSxv{~rXn2`z(@sc>I zQ8s%)K*tlg^y=yr0X>qUXn9PZIX5AO#Qe4h{A}phIQq=ed1m34i_PBMyKJm+<&#+z z6_;8_^$u{8@*UKyT5Yo}>Zo(4zYX}XV37rn7{=r&r8X1PbAgJAs$eW`rLuBK2>FH6 z13H*rUKyg#p7YNE12I@lk_vV#=2ZfS3k!WBje51}H%hK}*^Z_v+@k7Inf5_5wUBiJsp(qY< z!}<*t1anOj^p;Ejx&X9M0KYYjKAnu`5O7TbvN@sY&HnuTU8^9WHJ&(PCge{I{?B?z zAoM%}?fRIHL(Khu@l}6-8a5 zY5MxR?t|`w(8OiZLZYbEd@g3hI40deanlLVD==$Z~z?&u$Z;L*!DBJ)w2<}8^z}Gc# zf$P#q2C?H7Zfw+jcM@>bi4nZkl0Z=Cx>+4=0X}_r91sQi zFF)L~Jls4s42>rQx-D9UhE^17#~8Q?)RAuQl9pGZccWL&@7S0|$$){%m{dVb4>)}N?xaC;ll1iU%jDS{d_44#3C^4UrTr}~4((EQdk+$4Wy7Uc<@8-!u_>M;~X!h+G^I(;!N5s*pwkO~;% cpW}h~6D2X+8LEB?aR2}S07*qoM6N<$f^Vg*N&o-= literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/回合结束.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/回合结束.png new file mode 100644 index 0000000000000000000000000000000000000000..1017cbd9874026dd9fae200b9de845a2e29ea4a4 GIT binary patch literal 1457 zcmV;i1y1^jP)P001Hg1^@s6s#J0f00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1x86kK~zXfrC0e= zl~ow_&qzZ72~dz#kXQ}GnaXNfom?uLHZ4KKLS++V$ALt)kW~?6yDXB0Hd!_`&4h#t z7>SY%kb;nZ!rSwl%ej1)yD&~aJoo#)v%JrF*Yn;LQ>Lv#OdIe|_aYwjEDz&)Ld(&z z6-irafE?fHF2~+>wIFMUo8-T{R!Tp7Mhf?MNEXMIAZM4mZ>>&9%C)k4ioFM7L80WaI6X?kbluLyn@@>IJso3W& zDX+Rn>k&U0ZHh6IXlLE5kCvout7NDqQXayYGYgpQHRDmAE%cnmv?*SZ(I0nPVwD^Q zh9Y?Ya4`AhRq9km0(-*kfomr_;-mp4Dn_8(Z;M+bApyYwMo7gzFB=W!mVqX^-xe!H z@2!=Zgmp55y#(bd621`UQZ~rp*IZ<(Gfw_)kCm}AF*4q~S>f(EJeOi&?hn|03R;Xd zMoZe8t7Ra6qdK64L=*7zw-)?z_E9y7bRy7`N-$5 zJdH$yU;`SG*2~S>NNN7UR}LXEe<=&I2?h&^9?%OWJ7T2=$(Ff&jkKir%4kEBm@@p4 zWM-m+FCo-n|Doz|<&UGUyU5j&P<6oh3yX4`k`U8~7H*_}nv#8FtSMSraN?wGE2RUb zyipUOiYGCQ_u1|(@-GOSk{AhydEilRyo$0?*u5*wUoN9;@cp-nXQg7Vr&K|UdkE#Z zK4^gTnnV*hB;f)sCLZ^jpI3@Qr2G?4=}hyJv+z$(roZIvc9StglwRwIgm@wn`iZ9M z%L@4aB${Z>U@mI$>!~nBGEx^Qrx4oOT=P!M<&cC=?fBw7s73p|mE-9PlKhGHVUTl< zj=xUFBeLv~SouT~aRKX4H%ya(q-2haH^(Re*Q&zBl3M2@|x>j+;W%0{4h z7PJ{aWzYmxBm@g$9V+V}OrY8uJHi}+Rd^8Elp$$(k!b?TwcPRdT4Pmp{jMlPek|E! zSCBK%%-q|V9$;xCv}{YaqFW-WJOM)5w;jEh0*a%4Z$mP6;G22WjdHJmcdq~Ie5_n8 z4YRaFluP-F#Ms=`CHY`upla&a#9hn{R*eDete@W?%KDF+=LvrQ0PQ(fjvz2LcZy_b zo60uRS$pabFqc)Eil?PbRSh?~b53XyE2uHsX4>A`rE?@vnpplifJpyk(4dAT2+e%t zgZ_J9L^jrFs67kglv4!fUoHwYYch!+5)mBG;0c}-#{C*ormgZH9s(k+Z5X5s00000 LNkvXXu0mjfrN*gD literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/回合结算阶段.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/回合结算阶段.png new file mode 100644 index 0000000000000000000000000000000000000000..707c8201c08eae773fcdc693fffbb856b5703292 GIT binary patch literal 4600 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 UH`@X!Qvd(}07*qoM6N<$g8UX7fdBvi literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/确定_1600x900.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/确定_1600x900.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa6128d38dec759d5ee74aae98b15bf4aeae900 GIT binary patch literal 1296 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 Bgunm* literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色状态_冻结2.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色状态_冻结2.png new file mode 100644 index 0000000000000000000000000000000000000000..00e0e67e85c73ce97c30c9b68cf0434850867be7 GIT binary patch literal 2234 zcmV;r2u1gaP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2v12wK~zXfRaR+N zQ`r{GAAD=IPi+vHWlTbtLMB4yIgo*bQL&%c4{d3Z01}2qn$du0Yby#i${+$s80>#g zug*~PmJY0IS}|wUV#aC2jLm@AjyB9#HAsY=7`q$7qv0rq zCLbfRJcsbs3q0Iffoynu0K-28@Z^3Fqj!TC>#-vdvSPJeixYPjzSuqZV76ePNr7FH z85fa0qf#oe^ZaBK%MgZ|fUy7Kq?7(vP#w zF#c?)!J*5Fi=F{o_6*|4=E6sf9_Qg+DYkS|_7$EyF9{;BsvY5RM39A}US<9rM0lz7$@vOQ6%eP8! z>hSTy0{8@Q3lHtQ?z_Wq4Ing#*12-}>+2vhOZ~2`~wfz~-wZ7FfECoi*LODPF{Vs+zC+kr27GY)koUK^!)ej6B)z`v3Cg#Z@PM@4D+ zaOCvh8NWZNX+T1+Lad_&vPW%g7;SFGM4cQnB^B6e*5k0li7zH6Yw5zV)tdt*sQBPz zFC}Gs>$``)`-kwi1jrC8pNR%cyZltlhZCn4U+r#|q#pCNwU}yBBB5!-n4uZ6U({;E z6%F{4fV&zKmdk4Kd&wOv6_(-o%@S<>P=pM-S^x_PzxC$oDS-)w10tBfAn(a?w@QJ{ z>xI}Typ2?G8CFZm@xGy%-!cvrj@lAqvWzN z0?*Z{@Wt$vfYY83wrZNNR8WSEf^v3tXRf(eW5M|H{}|^0h1}mI=Whp^cBF3H!ust} ze6=`nA^Id3#je4Kq_Pfi0i2-3$vX1>4I$svIk|H+ zzGOWmhWS;x&Uf}XoAO;zIku}6oC?vPJvepyu}lS~@RY11ZXuv0<8wVX82{=vQ zj6Xsr@*(TbkCW8Z{kV(@bKrW_WMr2E&a04byh|pS^#>)ElJO8c?F-_N>_4}gsBjfz z`(}2aGsG?=sHaGLxy0Q1izhZCNj z2NfeGfzsnMY_t#hcF5)x2K?3T!GY16W9}B(_U_+we?6g$Pw2z61b}uOFFW% z1#sdBlBFN(MKqC8ITo*%VMnf(nk|zDmuxf-E>@`oB9Z)k#uvgXdcg9(3$R>RjE`zP z(qt>1e-D9{rJu3!=A~HV}idT(0o}97AhOCNXDzzig9f5NPF{l56>r% z6-oSKJ)@-C9L;62UAlD}3&o{a(h=d*W_ni@cghracZ5Z<}%_(*rz*646#a_15dGfr0%3G8tX zUa2aiYRS(9ScZz^5)AM_!Eflb*jDSXpx}0>ZAQYPL)>k~uig$?=G=X( zi%9;2jfozl9(5r#WW`IHhI0EQ;1eem5bVXu``3*sEVtEQrMZfwF%yV@LKQ|@tgZk) zG5JN864OQ%#x+eyn8?=AjxnDFqkaoy8%vLon!AVf=^kuM@qjiF#>PVrJ~`d&@-7_P z8En3N)>Vv~0N?9yU{%k3w^fB>p$OGD=EibhbkH<%|2eUD;tz2qceEgGY(w0pN6cf! zSip%G&)Txre>_EM{sB_6{W!g#306!A5&g08_ojwP` zF?`Q+^$SBQuc;D~J)-Nagjz7=)8|0lMvVEbJk5GA9earX0sP#?DGnbp(*OVf07*qo IM6N<$f=m86N&o-= literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色状态_水泡.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色状态_水泡.png new file mode 100644 index 0000000000000000000000000000000000000000..bfaed8ac49efd925a4c0341577f0ca36c1fd5b3c GIT binary patch literal 550 zcmV+>0@?kEP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0lP^=K~yMHJ&|uu z+E5t9`@I}kD}!l8=j4x0w`627{)b{k}@Wqg118Uev!(wpKa;=Ep;OyLX z?#0RJP4DkH&+}a6BAvk1{4~0`j~JGY;a4kotW_~Ot>K9ppIOvt;Lqo0c(Q8f?`+_E zG7jZ(F$Q}ri=k11Um<9kgv}7<#Q-EE!51Hy6?9T>q12ajxJLzu@(CWwW%y<_fMsfs z%=1|Kd6@kCRTi<(-&}|Cn=QyxabhsJj7PTZv&j9{CY*E%oi}m((r3}jW+3uk{*U49 z??D+9^1-Y_!VgTBt>5N8p{Y)yrBRd7e~O?plYltPV{BRQ4hXxYB0PgI(Ezh{7S9Od59LHE!ZDIH`B=<#_DUUeKZ3bJG%b znJ%~9O3tFLzJfikL&$gM4g~*8Nl5TscR7Q`j26N#>29$AduajRrXske+AQ#AZxW81SdXaE2J07*qoM6N<$g6C`gQUCw| literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色血量上方.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/角色血量上方.png new file mode 100644 index 0000000000000000000000000000000000000000..92873cfa815103b799b90884b925e7ba44fc5626 GIT binary patch literal 1044 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 P00000NkvXXu0mjf$?(S& literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/退出挑战.png b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/1920x1080/other/退出挑战.png new file mode 100644 index 0000000000000000000000000000000000000000..b049f9620a5462b7691ba8fce585bf1e2923967a GIT binary patch literal 10207 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 Z_`k>C#iMa!*<=6!002ovPDHLkV1mVpu|WU; literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs new file mode 100644 index 00000000..30676c5b --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs @@ -0,0 +1,154 @@ +using BetterGenshinImpact.Core.Config; +using OpenCvSharp; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BetterGenshinImpact.Core.Recognition; + +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Assets +{ + public class AutoGeniusInvokationAssets + { + public RecognitionObject ConfirmButtonRo; + public RecognitionObject RoundEndButtonRo; + public RecognitionObject ElementalTuningConfirmButtonRo; + public RecognitionObject ExitDuelButtonRo; + + public RecognitionObject InOpponentActionRo; + public RecognitionObject EndPhaseRo; + public RecognitionObject ElementalDiceLackWarningRo; + public RecognitionObject CharacterTakenOutRo; + public Mat CharacterDefeatedMat; + public RecognitionObject InCharacterPickRo; + + // 角色区域 + public RecognitionObject CharacterHpUpperRo; + public Mat CharacterStatusFreezeMat; + public Mat CharacterStatusDizzinessMat; + public Mat CharacterEnergyOnMat; + + public Dictionary RollPhaseDiceMats; + public Dictionary ActionPhaseDiceMats; + + public AutoGeniusInvokationAssets() + { + var info = TaskContext.Instance().SystemInfo; + ConfirmButtonRo = new RecognitionObject + { + Name = "ConfirmButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\确定.png"), + DrawOnWindow = true + }.InitTemplate(); + RoundEndButtonRo = new RecognitionObject + { + Name = "RoundEndButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\回合结束.png"), + RegionOfInterest = new Rect(0, 0, info.CaptureAreaRect.Width / 5, info.CaptureAreaRect.Height), + DrawOnWindow = true + }.InitTemplate(); + ElementalTuningConfirmButtonRo = new RecognitionObject + { + Name = "ElementalTuningConfirmButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\元素调和.png"), + DrawOnWindow = true + }.InitTemplate(); + ExitDuelButtonRo = new RecognitionObject + { + Name = "ExitDuelButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\退出挑战.png"), + RegionOfInterest = new Rect(0, info.CaptureAreaRect.Height / 2, info.CaptureAreaRect.Width / 2, info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 2), + DrawOnWindow = true + }.InitTemplate(); + InOpponentActionRo = new RecognitionObject + { + Name = "InOpponentAction", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\对方行动中.png"), + RegionOfInterest = new Rect(0, 0, info.CaptureAreaRect.Width / 5, info.CaptureAreaRect.Height), + DrawOnWindow = true + }.InitTemplate(); + EndPhaseRo = new RecognitionObject + { + Name = "EndPhase", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\回合结算阶段.png"), + RegionOfInterest = new Rect(0, 0, info.CaptureAreaRect.Width / 5, info.CaptureAreaRect.Height), + DrawOnWindow = true + }.InitTemplate(); + ElementalDiceLackWarningRo = new RecognitionObject + { + Name = "ElementalDiceLackWarning", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\元素骰子不足.png"), + RegionOfInterest = new Rect(info.CaptureAreaRect.Width - info.CaptureAreaRect.Width / 2, 0, + info.CaptureAreaRect.Width / 2, info.CaptureAreaRect.Height), + DrawOnWindow = true + }.InitTemplate(); + CharacterTakenOutRo = new RecognitionObject + { + Name = "CharacterTakenOut", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\角色死亡.png"), + DrawOnWindow = true + }.InitTemplate(); + + + CharacterDefeatedMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\角色被打败.png"); + + InCharacterPickRo = new RecognitionObject + { + Name = "InCharacterPick", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\出战角色.png"), + RegionOfInterest = new Rect(info.CaptureAreaRect.Width / 2, info.CaptureAreaRect.Height / 2, + info.CaptureAreaRect.Width - info.CaptureAreaRect.Width / 2, + info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 2), + DrawOnWindow = true + }.InitTemplate(); + CharacterHpUpperRo = new RecognitionObject + { + Name = "CharacterHpUpper", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\角色血量上方.png"), + DrawOnWindow = true + }.InitTemplate(); + + + CharacterStatusFreezeMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\角色状态_冻结.png"); + CharacterStatusDizzinessMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\角色状态_水泡.png"); + CharacterEnergyOnMat = GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"other\满能量.png"); + + // 投掷期间的骰子 + RollPhaseDiceMats = new Dictionary() + { + { "anemo", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\roll_anemo.png") }, + { "geo", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\roll_geo.png.png") }, + { "electro", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\roll_electro.png.png") }, + { "dendro", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\roll_dendro.png.png") }, + { "hydro", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\roll_hydro.png.png") }, + { "pyro", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\roll_pyro.png.png") }, + { "cryo", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\roll_cryo.png.png") }, + { "omni", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\roll_omni.png.png") }, + }; + + // 主界面骰子 + ActionPhaseDiceMats = new Dictionary() + { + { "anemo", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\action_anemo.png.png") }, + { "geo", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\action_geo.png.png") }, + { "electro", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\action_electro.png.png") }, + { "dendro", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\action_dendro.png.png") }, + { "hydro", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\action_hydro.png.png") }, + { "pyro", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\action_pyro.png.png") }, + { "cryo", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\action_cryo.png.png") }, + { "omni", GameTaskManager.LoadAssertImage("AutoGeniusInvokation", @"dice\action_omni.png.png") }, + }; + } + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Exception/DuelEndException.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Exception/DuelEndException.cs new file mode 100644 index 00000000..67357681 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Exception/DuelEndException.cs @@ -0,0 +1,8 @@ +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception; + +public class DuelEndException: System.Exception +{ + public DuelEndException(string message) : base(message) + { + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Exception/RetryException.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Exception/RetryException.cs new file mode 100644 index 00000000..79435647 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Exception/RetryException.cs @@ -0,0 +1,12 @@ +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception; + +public class RetryException : System.Exception +{ + public RetryException() : base() + { + } + + public RetryException(string message) : base(message) + { + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/GeniusInvokationControl.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/GeniusInvokationControl.cs new file mode 100644 index 00000000..5b9a5296 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/GeniusInvokationControl.cs @@ -0,0 +1,1271 @@ +using BetterGenshinImpact.Core.Recognition.OpenCv; +using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Assets; +using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception; +using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model; +using BetterGenshinImpact.GameTask.Model; +using BetterGenshinImpact.Helpers.Extensions; +using Fischless.GameCapture; +using GeniusInvokationAutoToy.Utils; +using Microsoft.Extensions.Logging; +using OpenCvSharp; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Point = OpenCvSharp.Point; + +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation; + +/// +/// 用于操控游戏 +/// +public class GeniusInvokationControl +{ + private readonly ILogger _logger = App.GetLogger(); + + // 定义一个静态变量来保存类的实例 + private static GeniusInvokationControl? _uniqueInstance; + + // 定义一个标识确保线程同步 + private static readonly object _locker = new object(); + + // 定义私有构造函数,使外界不能创建该类实例 + private GeniusInvokationControl() + { + } + + /// + /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点 + /// + /// + public static GeniusInvokationControl GetInstance() + { + if (_uniqueInstance == null) + { + lock (_locker) + { + _uniqueInstance ??= new GeniusInvokationControl(); + } + } + + return _uniqueInstance; + } + + public static bool OutputImageWhenError = true; + + + public CancellationTokenSource? cts; + + //public ImageCapture capture = new ImageCapture(); + //public YuanShenWindow window = new YuanShenWindow(); + //public Rectangle windowRect; + + private AutoGeniusInvokationAssets _assets = new(); + + private IGameCapture? _capture; + + public void Init(CancellationTokenSource cts1) + { + cts = cts1; + //if (!window.FindYSHandle()) + //{ + // throw new Exception("未找到原神进程,请先启动原神!"); + //} + } + + //public void FocusGameWindow() + //{ + // //window.Focus(); + //} + + //public string GetActiveProcessName() + //{ + // try + // { + // IntPtr hwnd = Native.GetForegroundWindow(); + // uint pid; + // GetWindowThreadProcessId(hwnd, out pid); + // Process p = Process.GetProcessById((int)pid); + // return p.ProcessName; + // } + // catch + // { + // return null; + // } + //} + + //public void IsGameFocus() + //{ + // windowRect = GetWindowRealRect(window); + // capture.Start(windowRect.X, windowRect.Y, windowRect.Width, windowRect.Height); + // if (windowRect.Width < 800) + // { + // throw new RetryException("原神窗口宽度小于800,请确认游戏已经获取到焦点!"); + // } + //} + + + // public Rectangle GetWindowRealRect(YuanShenWindow yuanShenWindow) + // { + // Rectangle rc = yuanShenWindow.GetSize(); + // int x = (int)Math.Ceiling(rc.Location.X * PrimaryScreen.ScaleX); + // int y = (int)Math.Ceiling(rc.Location.Y * PrimaryScreen.ScaleY); + // int w = (int)Math.Ceiling(rc.Width * PrimaryScreen.ScaleX); + // int h = (int)Math.Ceiling(rc.Height * PrimaryScreen.ScaleY); + // MyLogger.Debug($"原神窗口大小:{rc.Width} x {rc.Height}"); + // MyLogger.Debug($"原神窗口大小(计算DPI缩放后):{rc.Width * PrimaryScreen.ScaleX} x {rc.Height * PrimaryScreen.ScaleY}"); + // + // System.Drawing.Size size = new System.Drawing.Size(1920, 1080); + // if (w >= 1920 && w < 2000 && h >= 1080 && h < 1150) + // { + // size = new System.Drawing.Size(1920, 1080); + // ImageRecognition.WidthScale = 1; + // //ImageRecognition.HeightScale = 1; + // } + // else if (w >= 1600 && w < 2000 && h >= 900 && h < 950) + // { + // size = new System.Drawing.Size(1600, 900); + // ImageRecognition.WidthScale = 1600 * 1.0 / 1920; + // //ImageRecognition.HeightScale = 900 * 1.0 / 1080; + // } + // else + // { + // ImageRecognition.WidthScale = w * 1.0 / 1929; // 1929是计算了边缘 + // //ImageRecognition.HeightScale = h * 1.0 / 1109; // 1109是计算了窗口标题栏 + // } + // + // MyLogger.Debug($"匹配图片缩放比率:{ImageRecognition.WidthScale}"); + // return new Rectangle(x, y, w, h); + // } + + public void Sleep(int millisecondsTimeout) + { + CheckTask(); + Thread.Sleep(millisecondsTimeout); + } + + public Mat Capture() + { + CheckTask(); + //return capture.Capture(); + return null; + } + + public RectArea CaptureRectArea() + { + CheckTask(); + var bitmap = _capture.Capture(); + if (bitmap == null) + { + _logger.LogWarning("截图失败!"); + throw new RetryException("截图失败"); + } + + var systemInfo = TaskContext.Instance().SystemInfo; + return new RectArea(bitmap, systemInfo.CaptureAreaRect.X, systemInfo.CaptureAreaRect.Y, systemInfo.DesktopRectArea); + ; + } + + public void CheckTask() + { + Retry.Do(() => + { + if (cts != null && cts.IsCancellationRequested) + { + return; + } + + string name = "GetActiveProcessName()"; + if (!string.IsNullOrEmpty(name) && name != "YuanShen" && name != "GenshinImpact") + { + _logger.LogWarning("当前获取焦点的窗口进程名:{},不是原神窗口,暂停", name); + throw new RetryException("当前获取焦点的窗口不是原神窗口"); + } + }, TimeSpan.FromSeconds(1), 100); + + + if (cts != null && cts.IsCancellationRequested) + { + throw new TaskCanceledException("任务取消"); + } + } + + public void CommonDuelPrepare() + { + // 1. 选择初始手牌 + Sleep(1000); + _logger.LogInformation("开始选择初始手牌"); + while (!ClickConfirm()) + { + // 循环等待选择卡牌画面 + Sleep(1000); + } + + _logger.LogInformation("点击确认"); + + // 2. 选择出战角色 + // 此处选择第2个角色 雷神 + _logger.LogInformation("等待3s对局准备..."); + Sleep(3000); + + // 是否是再角色出战选择界面 + Retry.Do(IsInCharacterPickRetryThrowable, TimeSpan.FromSeconds(0.8), 20); + _logger.LogInformation("识别到已经在角色出战界面,等待1.5s"); + Sleep(1500); + } + + /// + /// 获取我方三个角色卡牌区域 + /// + /// + public List GetCharacterRects() + { + Mat srcMat = Capture(); + int halfHeight = srcMat.Height / 2; + Mat bottomMat = new Mat(srcMat, new Rect(0, halfHeight, srcMat.Width, srcMat.Height - halfHeight)); + + var lowPurple = new Scalar(235, 245, 198); + var highPurple = new Scalar(255, 255, 236); + Mat gray = OpenCvCommonHelper.Threshold(bottomMat, lowPurple, highPurple); + + // 水平投影到y轴 正常只有一个连续区域 + int[] h = ArithmeticHelper.HorizontalProjection(gray); + + // y轴 从上到下确认连续区域 + int y1 = 0, y2 = 0; + int start = 0; + bool inLine = false; + for (int i = 0; i < h.Length; i++) + { + if (h[i] > h.Average() * 10) + { + // 直方图 + Cv2.Line(bottomMat, 0, i, h[i], i, Scalar.Yellow); + + if (!inLine) + { + //由空白进入字符区域了,记录标记 + inLine = true; + start = i; + } + } + else if (inLine) + { + //由连续区域进入空白区域了 + inLine = false; + + + if (y1 == 0) + { + y1 = start; + if (OutputImageWhenError) + { + Cv2.Line(bottomMat, 0, y1, bottomMat.Width, y1, Scalar.Red); + } + } + else if (y2 == 0 && i - y1 > 20) + { + y2 = i; + if (OutputImageWhenError) + { + Cv2.Line(bottomMat, 0, y2, bottomMat.Width, y2, Scalar.Red); + } + + break; + } + } + } + + if (y1 == 0 || y2 == 0) + { + _logger.LogWarning("未识别到角色卡牌区域(Y轴)"); + if (OutputImageWhenError) + { + Cv2.ImWrite("logs\\character_card_error.jpg", bottomMat); + } + + throw new RetryException("未获取到角色区域"); + } + + //if (y1 < windowRect.Height / 2 || y2 < windowRect.Height / 2) + //{ + // MyLogger.Warn("识别的角色卡牌区域(Y轴)错误:y1:{} y2:{}", y1, y2); + // if (OutputImageWhenError) + // { + // Cv2.ImWrite("logs\\character_card_error.jpg", bottomMat); + // } + + // throw new RetryException("未获取到角色区域"); + //} + + + // 垂直投影 + int[] v = ArithmeticHelper.VerticalProjection(gray); + + + inLine = false; + start = 0; + List colLines = new List(); + //开始根据投影值识别分割点 + for (int i = 0; i < v.Length; ++i) + { + if (v[i] > h.Average() * 10) + { + if (OutputImageWhenError) + { + Cv2.Line(bottomMat, i, 0, i, v[i], Scalar.Yellow); + } + + if (!inLine) + { + //由空白进入字符区域了,记录标记 + inLine = true; + start = i; + } + } + else if (i - start > 30 && inLine) + { + //由连续区域进入空白区域了 + inLine = false; + if (OutputImageWhenError) + { + Cv2.Line(bottomMat, start, 0, start, bottomMat.Height, Scalar.Red); + } + + colLines.Add(start); + } + } + + if (colLines.Count != 6) + { + _logger.LogWarning("未识别到角色卡牌区域(X轴存在{Count}个识别点)", colLines.Count); + if (OutputImageWhenError) + { + Cv2.ImWrite("logs\\character_card_error.jpg", bottomMat); + } + + throw new RetryException("未获取到角色区域"); + } + + var rects = new List(); + for (int i = 0; i < colLines.Count - 1; i++) + { + if (i % 2 == 0) + { + var r = new Rect(colLines[i], halfHeight + y1, colLines[i + 1] - colLines[i], + y2 - y1); + rects.Add(r); + } + } + + if (rects == null || rects.Count != 3) + { + throw new RetryException("未获取到角色区域"); + } + + //Cv2.ImWrite("logs\\character_card_success.jpg", bottomMat); + return rects; + } + + ///// + ///// 选择角色牌(首次) + ///// + ///// 从左到右第几个角色,从1开始计数 + ///// + //public void ChooseCharacterFirst(int characterIndex) + //{ + // // 首次执行获取角色区域 + // if (MyCharacterRects == null || MyCharacterRects.Count == 0) + // { + // MyCharacterRects = GetCharacterRects(); + // if (MyCharacterRects == null || MyCharacterRects.Count != 3) + // { + // throw new RetryException("未获取到角色区域"); + // } + // } + + + // // 双击选择角色出战 + // DoubleClick(MakeOffset(MyCharacterRects[characterIndex - 1].GetCenterPoint())); + //} + + + ///// + ///// 切换角色牌(历次) + ///// + ///// 从左到右第几个角色,从1开始计数 + ///// + //public bool SwitchCharacterLater(int characterIndex) + //{ + // if (MyCharacterRects == null || MyCharacterRects.Count != 3) + // { + // return false; + // } + + // Point p = MakeOffset(MyCharacterRects[characterIndex - 1].GetCenterPoint()); + // // 选择角色 + // Click(p); + // // // 双击切人 + // // Sleep(1500); + // // Click(p); + + // // 点击切人按钮 + // ActionPhasePressSwitchButton(); + // return true; + //} + + ///// + ///// 角色死亡的时候双击角色牌重新出战 + ///// + ///// 从左到右第几个角色,从1开始计数 + ///// + //public bool SwitchCharacterWhenTakenOut(int characterIndex) + //{ + // if (MyCharacterRects == null || MyCharacterRects.Count != 3) + // { + // return false; + // } + + // Point p = MakeOffset(MyCharacterRects[characterIndex - 1].GetCenterPoint()); + // // 选择角色 + // Click(p); + // // 双击切人 + // Sleep(500); + // Click(p); + // Sleep(300); + // return true; + //} + + + public bool Click(Point p) + { + return false; + } + + public bool Click(int x, int y) + { + return false; + } + + /// + /// 点击捕获区域的相对位置 + /// + /// + /// + /// + public void ClickCaptureArea(int x, int y) + { + var rect = TaskContext.Instance().SystemInfo.CaptureAreaRect; + ClickExtension.Click(rect.X + x, rect.Y + y); + } + + /// + /// 点击游戏屏幕中心点 + /// + public void ClickGameWindowCenter() + { + var p = TaskContext.Instance().SystemInfo.CaptureAreaRect.GetCenterPoint(); + p.Click(); + } + + public static Dictionary> FindMultiPicFromOneImage(Mat srcMat, + Dictionary imgSubDictionary, double threshold = 0.8) + { + var dictionary = new Dictionary>(); + + + foreach (var kvp in imgSubDictionary) + { + dictionary.Add(kvp.Key, MatchTemplateHelper.MatchTemplateMulti(srcMat, kvp.Value, threshold)); + // 最好把结果给遮掩掉,避免识别率不高的时候重复识别 + } + + return dictionary; + } + + /// + /// 重投骰子 + /// + /// 保留的元素类型 + public bool RollPhaseReRoll(params ElementalType[] holdElementalTypes) + { + var gameSnapshot = Capture(); + var dictionary = FindMultiPicFromOneImage(gameSnapshot, _assets.RollPhaseDiceMats); + + var count = dictionary.Sum(kvp => kvp.Value.Count); + + + if (count != 8) + { + _logger.LogDebug("投骰子界面识别到了{Count}个骰子,等待重试", count); + return false; + } + else + { + _logger.LogInformation("投骰子界面识别到了{Count}个骰子", count); + } + + foreach (var kvp in dictionary) + { + // 跳过保留的元素类型 + if (holdElementalTypes.Contains(kvp.Key.ToElementalType())) + { + continue; + } + + // 选中重投 + foreach (var point in kvp.Value) + { + ClickCaptureArea(point.X + _assets.RollPhaseDiceMats[kvp.Key].Width / 2, point.Y + _assets.RollPhaseDiceMats[kvp.Key].Height / 2); + Sleep(100); + } + } + + return true; + } + + /// + /// 选择手牌/重投骰子 确认 + /// + public bool ClickConfirm() + { + var foundRectArea = CaptureRectArea().Find(_assets.ConfirmButtonRo); + if (!foundRectArea.IsEmpty()) + { + foundRectArea.ClickCenter(); + return true; + } + + return false; + } + + public void ReRollDice(params ElementalType[] holdElementalTypes) + { + // 3.重投骰子 + _logger.LogInformation("等待5s投骰动画..."); + + var msg = holdElementalTypes.Aggregate(" ", (current, elementalType) => current + (elementalType.ToChinese() + " ")); + + _logger.LogInformation("保留{Msg}骰子", msg); + Sleep(5000); + var retryCount = 0; + // 保留 x、万能 骰子 + while (!RollPhaseReRoll(holdElementalTypes)) + { + retryCount++; + + if (IsDuelEnd()) + { + throw new DuelEndException("对战已结束,停止自动打牌!"); + } + + //MyLogger.Debug("识别骰子数量不正确,第{}次重试中...", retryCount); + Sleep(500); + if (retryCount > 35) + { + throw new System.Exception("识别骰子数量不正确,重试超时,停止自动打牌!"); + } + } + + ClickConfirm(); + _logger.LogInformation("选择需要重投的骰子后点击确认完毕"); + + Sleep(1000); + // 鼠标移动到中心 + ClickGameWindowCenter(); + + _logger.LogInformation("等待10s对方重投"); + Sleep(10000); + } + + public Point MakeOffset(Point p) + { + var rect = TaskContext.Instance().SystemInfo.CaptureAreaRect; + return new Point(rect.X + p.X, rect.Y + p.Y); + } + + /// + /// 计算当前有那些骰子 + /// + /// + public Dictionary ActionPhaseDice() + { + var srcMat = Capture(); + // 切割图片后再识别 加快速度 位置没啥用,所以切割后比较方便 + var dictionary = FindMultiPicFromOneImage(CutRight(srcMat, srcMat.Width / 5), _assets.ActionPhaseDiceMats); + + var msg = ""; + var result = new Dictionary(); + foreach (var kvp in dictionary) + { + result.Add(kvp.Key, kvp.Value.Count); + msg += $"{kvp.Key.ToElementalType().ToChinese()} {kvp.Value.Count}| "; + } + + _logger.LogInformation("当前骰子状态:{Res}", result); + return result; + } + + + /// + /// 烧牌 + /// + public void ActionPhaseElementalTuning() + { + var rect = TaskContext.Instance().SystemInfo.CaptureAreaRect; + var m = ClickExtension.Move(rect.X + rect.Width / 2d, rect.Y + rect.Height - 50).LeftButtonClick(); + Sleep(1500); + m.LeftButtonDown(); + Sleep(100); + m = ClickExtension.Move(rect.X + rect.Width - 50, rect.Y + rect.Height / 2d); + Sleep(100); + m.LeftButtonUp(); + } + + /// + /// 烧牌确认(元素调和按钮) + /// + public bool ActionPhaseElementalTuningConfirm() + { + var foundRectArea = CaptureRectArea().Find(_assets.ElementalTuningConfirmButtonRo); + if (!foundRectArea.IsEmpty()) + { + foundRectArea.ClickCenter(); + return true; + } + + return false; + } + + /// + /// 点击切人按钮 + /// + /// + public void ActionPhasePressSwitchButton() + { + var info = TaskContext.Instance().SystemInfo; + var x = info.CaptureAreaRect.X + info.CaptureAreaRect.Width - 100 * info.AssetScale; + var y = info.CaptureAreaRect.Y + info.CaptureAreaRect.Height - 120 * info.AssetScale; + + ClickExtension.Move(x, y).LeftButtonClick(); + Sleep(800); // 等待动画彻底弹出 + + ClickExtension.Move(x, y).LeftButtonClick(); + } + + + /// + /// 使用技能 + /// + /// 技能编号,从右往左数,从1开始 + /// 元素骰子是否充足 + public bool ActionPhaseUseSkill(int skillIndex) + { + // 技能坐标写死 (w - 100 * n, h - 120) + var info = TaskContext.Instance().SystemInfo; + var x = info.CaptureAreaRect.X + info.CaptureAreaRect.Width - 100 * info.AssetScale * skillIndex; + var y = info.CaptureAreaRect.Y + info.CaptureAreaRect.Height - 120 * info.AssetScale; + ClickExtension.Move(x, y).LeftButtonClick(); + Sleep(1000); // 等待动画彻底弹出 + + CaptureRectArea().Find(_assets.ElementalDiceLackWarningRo, foundRectArea => + { + // 多点几次保证点击到 + _logger.LogInformation("使用技能{SkillIndex}", skillIndex); + foundRectArea.ClickCenter(); + Sleep(200); + foundRectArea.ClickCenter(); + }); + + return true; + } + + /// + /// 使用技能(元素骰子不够的情况下,自动烧牌) + /// + /// 技能编号,从右往左数,从1开始 + /// 技能消耗骰子数 + /// 消耗骰子元素类型 + /// 对局对象 + /// 手牌或者元素骰子是否充足 + public bool ActionPhaseAutoUseSkill(int skillIndex, int diceCost, ElementalType elementalType, Duel duel) + { + var dice9RetryCount = 0; + var retryCount = 0; + var diceStatus = ActionPhaseDice(); + while (true) + { + int dCount = diceStatus.Sum(x => x.Value); + if (dCount != duel.CurrentDiceCount) + { + if (retryCount > 20) + { + throw new System.Exception("骰子数量与预期不符,重试次数过多,可能出现了未知错误!"); + } + + if (dCount == 9 && duel.CurrentDiceCount == 8 && diceStatus[ElementalType.Omni.ToLowerString()] > 0) + { + dice9RetryCount++; + if (dice9RetryCount > 5) + { + // 支援区存在 鲸井小弟 情况下骰子数量增加导致识别出错的问题 #1 + // 5次重试后仍然是9个骰子并且至少有一个万能骰子,出现多识别的情况是很稀少的,此时可以基本认为 支援区存在 鲸井小弟 + // TODO : 但是这个方法并不是100%准确,后续需要添加支援区判断 + _logger.LogInformation("期望的骰子数量8,应为开局期望,重试多次后累计实际识别9个骰子的情况为5次"); + duel.CurrentDiceCount = 9; // 修正当前骰子数量 + break; + } + } + + + _logger.LogInformation("当前骰子数量{Count}与期望的骰子数量{Expect}不相等,重试", dCount, duel.CurrentDiceCount); + diceStatus = ActionPhaseDice(); + retryCount++; + Sleep(1000); + } + else + { + break; + } + } + + + int needSpecifyElementDiceCount = diceCost - diceStatus[ElementalType.Omni.ToLowerString()] - diceStatus[elementalType.ToLowerString()]; + if (needSpecifyElementDiceCount > 0) + { + if (duel.CurrentCardCount < needSpecifyElementDiceCount) + { + _logger.LogInformation("当前手牌数{Current}小于需要烧牌数量{Expect},无法释放技能", duel.CurrentCardCount, needSpecifyElementDiceCount); + return false; + } + + _logger.LogInformation("当前需要的元素骰子数量不足{Cost}个,还缺{Lack}个,当前手牌数{Current},烧牌", diceCost, needSpecifyElementDiceCount, duel.CurrentCardCount); + + for (var i = 0; i < needSpecifyElementDiceCount; i++) + { + duel.CurrentCardCount--; + _logger.LogInformation("- {Count} 烧牌", i + 1); + ActionPhaseElementalTuning(); + Sleep(100); + ActionPhaseElementalTuningConfirm(); + Sleep(1000); // 烧牌动画 + ClickGameWindowCenter(); // 复位 + Sleep(500); + // 最后一张牌的回正速度较慢,多等一会 + if (duel.CurrentCardCount <= 1) + { + ClickGameWindowCenter(); // 复位 + Sleep(1000); + } + } + } + + return ActionPhaseUseSkill(skillIndex); + } + + + /// + /// 回合结束 + /// + public void RoundEnd() + { + CaptureRectArea().Find(_assets.RoundEndButtonRo, foundRectArea => + { + foundRectArea.ClickCenter(); + Sleep(1000); // 有弹出动画 + foundRectArea.ClickCenter(); + Sleep(300); + }); + + ClickGameWindowCenter(); // 复位 + } + + /// + /// 是否是再角色出战选择界面 + /// 可重试方法 + /// + public void IsInCharacterPickRetryThrowable() + { + if (!IsInCharacterPick()) + { + throw new RetryException("当前不在角色出战选择界面"); + } + } + + /// + /// 是否是再角色出战选择界面 + /// + /// + public bool IsInCharacterPick() + { + return !CaptureRectArea().Find(_assets.InCharacterPickRo).IsEmpty(); + } + + /// + /// 是否是我的回合 + /// + /// + public bool IsInMyAction() + { + return !CaptureRectArea().Find(_assets.RoundEndButtonRo).IsEmpty(); + } + + /// + /// 是否是对方的回合 + /// + /// + public bool IsInOpponentAction() + { + return !CaptureRectArea().Find(_assets.InOpponentActionRo).IsEmpty(); + } + + /// + /// 是否是回合结算阶段 + /// + /// + public bool IsEndPhase() + { + return !CaptureRectArea().Find(_assets.EndPhaseRo).IsEmpty(); + } + + + /// + /// 出战角色是否被打倒 + /// + /// + public bool IsActiveCharacterTakenOut() + { + return !CaptureRectArea().Find(_assets.CharacterTakenOutRo).IsEmpty(); + } + + /// + /// 哪些出战角色被打倒了 + /// + /// true 是已经被打倒 + public bool[] WhatCharacterDefeated(List rects) + { + if (rects == null || rects.Count != 3) + { + throw new System.Exception("未能获取到我方角色卡位置"); + } + + var pList = MatchTemplateHelper.MatchTemplateMulti(Capture(), _assets.CharacterDefeatedMat, 0.8); + + var res = new bool[3]; + foreach (var p in pList) + { + for (var i = 0; i < rects.Count; i++) + { + if (IsOverlap(rects[i], new Rect(p.X, p.Y, _assets.CharacterDefeatedMat.Width, _assets.CharacterDefeatedMat.Height))) + { + res[i] = true; + } + } + } + + + return res; + } + + /// + /// 判断矩形是否重叠 + /// + /// + /// + /// + public bool IsOverlap(Rect rc1, Rect rc2) + { + if (rc1.X + rc1.Width > rc2.X && + rc2.X + rc2.Width > rc1.X && + rc1.Y + rc1.Height > rc2.Y && + rc2.Y + rc2.Height > rc1.Y + ) + { + return true; + } + else + { + return false; + } + } + + /// + /// 是否对局完全结束 + /// + /// + public bool IsDuelEnd() + { + return !CaptureRectArea().Find(_assets.ExitDuelButtonRo).IsEmpty(); + } + + + public Mat CutRight(Mat srcMat, int saveRightWidth) + { + srcMat = new Mat(srcMat, new Rect(srcMat.Width - saveRightWidth, 0, saveRightWidth, srcMat.Height)); + return srcMat; + } + + /// + /// 等待我的回合 + /// 我方角色可能在此期间阵亡 + /// + public void WaitForMyTurn(Duel duel, int waitTime = 0) + { + if (waitTime > 0) + { + _logger.LogInformation("等待对方行动{Time}s", waitTime / 1000); + Sleep(waitTime); + } + + // 判断对方行动是否已经结束 + var retryCount = 0; + var inMyActionCount = 0; + while (true) + { + if (IsInMyAction()) + { + if (IsActiveCharacterTakenOut()) + { + DoWhenCharacterDefeated(duel); + } + else + { + // 多延迟2s // 保证被击败提示已经完成显示 + inMyActionCount++; + if (inMyActionCount == 3) + { + break; + } + } + } + else if (IsDuelEnd()) + { + throw new DuelEndException("对战已结束,停止自动打牌!"); + } + + retryCount++; + if (retryCount >= 60) + { + throw new System.Exception("等待对方行动超时,停止自动打牌!"); + } + + _logger.LogInformation("对方仍在行动中,继续等待(次数{})...", retryCount); + Sleep(1000); + } + } + + /// + /// 等待对方回合 和 回合结束阶段 + /// 我方角色可能在此期间阵亡 + /// + public void WaitOpponentAction(Duel duel) + { + var rd = new Random(); + Sleep(3000 + rd.Next(1, 1000)); + // 判断对方行动是否已经结束 + var retryCount = 0; + while (true) + { + if (IsInOpponentAction()) + { + _logger.LogInformation("对方仍在行动中,继续等待(次数{})...", retryCount); + } + else if (IsEndPhase()) + { + _logger.LogInformation("正在回合结束阶段,继续等待(次数{})...", retryCount); + } + else if (IsInMyAction()) + { + if (IsActiveCharacterTakenOut()) + { + DoWhenCharacterDefeated(duel); + } + } + else if (IsDuelEnd()) + { + throw new DuelEndException("对战已结束,停止自动打牌!"); + } + else + { + // 至少走三次判断才能确定对方行动结束 + if (retryCount > 2) + { + break; + } + else + { + _logger.LogError("等待对方回合 和 回合结束阶段 时程序未识别到有效内容(次数{})...", retryCount); + } + } + + retryCount++; + if (retryCount >= 30) + { + throw new System.Exception("等待对方行动超时,停止自动打牌!"); + } + + + Sleep(1000 + rd.Next(1, 500)); + } + } + + /// + /// 角色被打败后要切换角色 + /// + /// + /// + public void DoWhenCharacterDefeated(Duel duel) + { + _logger.LogInformation("当前出战角色被打败,需要选择新的出战角色"); + var defeatedArray = WhatCharacterDefeated(duel.CharacterCardRects); + + for (var i = defeatedArray.Length - 1; i >= 0; i--) + { + duel.Characters[i + 1].IsDefeated = defeatedArray[i]; + } + + var orderList = duel.GetCharacterSwitchOrder(); + if (orderList.Count == 0) + { + throw new DuelEndException("后续行动策略中,已经没有可切换且存活的角色了,结束自动打牌(建议添加更多行动)"); + } + + foreach (var j in orderList) + { + if (!duel.Characters[j].IsDefeated) + { + duel.Characters[j].SwitchWhenTakenOut(); + break; + } + } + + ClickGameWindowCenter(); + Sleep(2000); // 切人动画 + } + + + ///// + ///// 哪个角色处于出战状态 + ///// + ///// + //public Character WhichCharacterActive(Duel duel) + //{ + // if (duel.CharacterCardRects == null || duel.CharacterCardRects.Count != 3) + // { + // throw new System.Exception("未能获取到我方角色卡位置"); + // } + + // Mat srcMat = Capture(); + + // // 切割下半部分 + // int halfHeight = srcMat.Height / 2; + // Mat bottomMat = new Mat(srcMat, new Rect(0, halfHeight, srcMat.Width, srcMat.Height - halfHeight)); + // Mat resMat; + // List pList = ImageRecognition.FindMultiTarget(bottomMat, + // ImageResCollections.CharacterHpUpperBitmap.ToMat(), "HpUpper", out resMat, 0.7); + + // if (pList.Count != duel.GetCharacterAliveNum()) + // { + // if (OutputImageWhenError) + // { + // var outMat = srcMat.Clone(); + // foreach (var point in pList) + // { + // Cv2.Rectangle(outMat, + // new Rect(point.X, point.Y + halfHeight, ImageResCollections.CharacterHpUpperBitmap.Width, + // ImageResCollections.CharacterHpUpperBitmap.Height), Scalar.Red, 2); + // } + + // Cv2.ImWrite("logs\\active_character_error.jpg", outMat); + // } + + // throw new RetryException($"角色Hp区块识别有误,识别到区块数量{pList.Count} != 当前存活角色数{duel.GetCharacterAliveNum()}"); + // } + + // int cnt = 0; + // for (var i = 1; i < duel.Characters.Length; i++) + // { + // var cardRect = duel.Characters[i].Area; + // // 2倍高度 保证能够矩形相交 + // var rect1 = new Rectangle(cardRect.X, cardRect.Y - cardRect.Height, cardRect.Width, + // cardRect.Height + cardRect.Height); + + // foreach (var point in pList) + // { + // var rect2 = new Rectangle(point.X, halfHeight + point.Y, + // ImageResCollections.CharacterHpUpperBitmap.Width, + // ImageResCollections.CharacterHpUpperBitmap.Height); + // if (IsOverlap(rect1, rect2)) + // { + // duel.Characters[i].HpUpperArea = rect2; + // // 出战角色判断 + // if (halfHeight + point.Y < cardRect.Y) + // { + // cnt++; + // duel.CurrentCharacter = duel.Characters[i]; + // } + + // break; + // } + // } + // } + + // if (cnt != 1) + // { + // if (OutputImageWhenError) + // { + // var outMat = srcMat.Clone(); + // foreach (var point in pList) + // { + // Cv2.Rectangle(outMat, + // new Rect(point.X, point.Y + halfHeight, ImageResCollections.CharacterHpUpperBitmap.Width, + // ImageResCollections.CharacterHpUpperBitmap.Height), Scalar.Red, 2); + // } + + // foreach (var rc in duel.CharacterCardRects) + // { + // Cv2.Rectangle(outMat, + // rc.ToCvRect(), Scalar.Green, 2); + // } + + // Cv2.ImWrite("logs\\active_character_error.jpg", outMat); + // } + + // throw new RetryException($"识别到{cnt}个出战角色"); + // } + + // AppendCharacterStatus(duel.CurrentCharacter, srcMat); + // return duel.CurrentCharacter; + //} + + public void AppendCharacterStatus(Character character, Mat srcMat) + { + // 截取出战角色区域扩展 + var characterMat = new Mat(srcMat, new Rect(character.Area.X, + character.Area.Y, + character.Area.Width + 40, + character.Area.Height + 10)); + // 识别角色异常状态 + var pCharacterStatusFreeze = MatchTemplateHelper.MatchTemplate(characterMat, _assets.CharacterStatusFreezeMat, TemplateMatchModes.CCoeffNormed); + if (pCharacterStatusFreeze != new Point()) + { + character.StatusList.Add(CharacterStatusEnum.Frozen); + } + var pCharacterStatusDizziness = MatchTemplateHelper.MatchTemplate(characterMat, _assets.CharacterStatusDizzinessMat, TemplateMatchModes.CCoeffNormed); + if (pCharacterStatusDizziness != new Point()) + { + character.StatusList.Add(CharacterStatusEnum.Frozen); + } + + // 识别角色能量 + var energyPointList = MatchTemplateHelper.MatchTemplateMulti(characterMat.Clone(),_assets.CharacterEnergyOnMat, 0.8); + character.EnergyByRecognition = energyPointList.Count; + + _logger.LogInformation("当前出战{Character}", character); + } + + public Character WhichCharacterActiveWithRetry(Duel duel) + { + // 检查角色是否被击败 // 这里又检查一次是因为最后一个角色存活的情况下,会自动出战 + var defeatedArray = WhatCharacterDefeated(duel.CharacterCardRects); + for (var i = defeatedArray.Length - 1; i >= 0; i--) + { + duel.Characters[i + 1].IsDefeated = defeatedArray[i]; + } + + return Retry.Do(() => WhichCharacterActiveByHpWord(duel), TimeSpan.FromSeconds(0.3), 2); + } + + public Character WhichCharacterActiveByHpWord(Duel duel) + { + if (duel.CharacterCardRects == null || duel.CharacterCardRects.Count != 3) + { + throw new System.Exception("未能获取到我方角色卡位置"); + } + + var srcMat = Capture(); + + int halfHeight = srcMat.Height / 2; + Mat bottomMat = new Mat(srcMat, new Rect(0, halfHeight, srcMat.Width, srcMat.Height - halfHeight)); + + var lowPurple = new Scalar(239, 239, 239); + var highPurple = new Scalar(242, 242, 250); + Mat gray = OpenCvCommonHelper.Threshold(bottomMat, lowPurple, highPurple); + + var kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(15, 10), new OpenCvSharp.Point(-1, -1)); + Cv2.Dilate(gray, gray, kernel); //膨胀 + + + OpenCvSharp.Point[][] contours; + HierarchyIndex[] hierarchy; + Cv2.FindContours(gray, out contours, out hierarchy, RetrievalModes.External, + ContourApproximationModes.ApproxSimple, null); + + if (contours.Length > 0) + { + // .Where(w => w.Width > 1 && w.Height >= 5) + var rects = contours.Select(Cv2.BoundingRect).ToList(); + + + // 按照Y轴高度排序 + rects = rects.OrderBy(r => r.Y).ToList(); + + // 第一个和角色卡重叠的矩形 + foreach (var rect in rects) + { + for (var i = 0; i < duel.CharacterCardRects.Count; i++) + { + // 延长高度,确保能够相交 + var rect1 = new Rect(rect.X, halfHeight + rect.Y, rect.Width + 20, + rect.Height + 20); + if (IsOverlap(rect1, duel.CharacterCardRects[i]) && + halfHeight + rect.Y < duel.CharacterCardRects[i].Y) + { + // 首个相交矩形就是出战角色 + duel.CurrentCharacter = duel.Characters[i + 1]; + AppendCharacterStatus(duel.CurrentCharacter, srcMat); + + Cv2.Rectangle(srcMat, rect1, Scalar.Yellow); + Cv2.Rectangle(srcMat, duel.CharacterCardRects[i], Scalar.Blue, 2); + OutputImage(duel, rects, bottomMat, halfHeight, "logs\\active_character2_success.jpg"); + return duel.CurrentCharacter; + } + } + } + + OutputImage(duel, rects, bottomMat, halfHeight, "logs\\active_character2_no_overlap_error.jpg"); + } + else + { + if (OutputImageWhenError) + { + Cv2.ImWrite("logs\\active_character2_no_rects_error.jpg", gray); + } + } + + throw new RetryException($"未识别到个出战角色"); + } + + private static void OutputImage(Duel duel, List rects, Mat bottomMat, int halfHeight, string fileName) + { + if (OutputImageWhenError) + { + foreach (var rect2 in rects) + { + Cv2.Rectangle(bottomMat, new OpenCvSharp.Point(rect2.X, rect2.Y), + new OpenCvSharp.Point(rect2.X + rect2.Width, rect2.Y + rect2.Height), Scalar.Red, 1); + } + + foreach (var rc in duel.CharacterCardRects) + { + Cv2.Rectangle(bottomMat, + new Rect(rc.X, rc.Y - halfHeight, rc.Width, rc.Height), Scalar.Green, 1); + } + + + Cv2.ImWrite(fileName, bottomMat); + } + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ActionCommand.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ActionCommand.cs new file mode 100644 index 00000000..b5b59016 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ActionCommand.cs @@ -0,0 +1,82 @@ +using System; + +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model +{ + public class ActionCommand + { + /// + /// 角色 + /// + public Character Character { get; set; } + + public ActionEnum Action { get; set; } + + /// + /// 目标编号(技能编号,从右往左) + /// + public int TargetIndex { get; set; } + + public override string ToString() + { + if (Action == ActionEnum.UseSkill) + { + return $"【{Character.Name}】使用【技能{TargetIndex}】"; + } + else if (Action == ActionEnum.SwitchLater) + { + return $"【{Character.Name}】切换至【角色{TargetIndex}】"; + } + else + { + return base.ToString(); + } + } + + + public int GetSpecificElementDiceUseCount() + { + if (Action == ActionEnum.UseSkill) + { + return Character.Skills[TargetIndex].SpecificElementCost; + } + else + { + throw new ArgumentException("未知行动"); + } + } + + public int GetAllDiceUseCount() + { + if (Action == ActionEnum.UseSkill) + { + return Character.Skills[TargetIndex].AllCost; + } + else + { + throw new ArgumentException("未知行动"); + } + } + + public ElementalType GetDiceUseElementType() + { + if (Action == ActionEnum.UseSkill) + { + return Character.Element; + } + else + { + throw new ArgumentException("未知行动"); + } + } + + public bool SwitchLater() + { + return Character.SwitchLater(); + } + + public bool UseSkill(Duel duel) + { + return Character.UseSkill(TargetIndex, duel); + } + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ActionEnum.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ActionEnum.cs new file mode 100644 index 00000000..565e8a8c --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ActionEnum.cs @@ -0,0 +1,45 @@ +using System; + +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model +{ + public enum ActionEnum + { + ChooseFirst, SwitchLater, UseSkill + } + + public static class ActionEnumExtension + { + public static ActionEnum ChineseToActionEnum(this string type) + { + type = type.ToLower(); + switch (type) + { + case "出战": + //return ActionEnum.ChooseFirst; + throw new ArgumentOutOfRangeException(nameof(type), type, null); + case "切换": + //return ActionEnum.SwitchLater; + throw new ArgumentOutOfRangeException(nameof(type), type, null); + case "使用": + return ActionEnum.UseSkill; + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } + + public static string ToChinese(this ActionEnum type) + { + switch (type) + { + case ActionEnum.ChooseFirst: + return "出战"; + case ActionEnum.SwitchLater: + return "切换"; + case ActionEnum.UseSkill: + return "使用"; + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } + } +} diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Character.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Character.cs new file mode 100644 index 00000000..6e990099 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Character.cs @@ -0,0 +1,115 @@ +using BetterGenshinImpact.Core.Recognition.OpenCv; +using BetterGenshinImpact.Helpers.Extensions; +using OpenCvSharp; +using System.Collections.Generic; +using System.Text; +using Microsoft.Extensions.Logging; + +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model +{ + public class Character + { + private readonly ILogger _logger = App.GetLogger(); + + /// + /// 1-3 所在数组下标一致 + /// + public int Index { get; set; } + + public string Name { get; set; } + public ElementalType Element { get; set; } + public Skill[] Skills { get; set; } + + + /// + /// 是否被打败 + /// + public bool IsDefeated { get; set; } + + /// + /// 充能点 + /// + public int Energy { get; set; } + + + /// + /// 充能点来自于图像识别 + /// + public int EnergyByRecognition { get; set; } + + /// + /// 角色身上的负面状态 + /// + public List StatusList { get; set; } = new List(); + + /// + /// 角色区域 + /// + public Rect Area { get; set; } + + /// + /// 血量上方区域,用于判断是否出战 + /// + public Rect HpUpperArea { get; set; } + + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append($"角色{Index},"); + sb.Append($"充能={EnergyByRecognition},"); + if (StatusList?.Count > 0) + { + sb.Append($"状态:{string.Join(",", StatusList)}"); + } + + return sb.ToString(); + } + + public void ChooseFirst() + { + ClickExtension.Move(GeniusInvokationControl.GetInstance().MakeOffset(Area.GetCenterPoint())).LeftButtonDoubleClick(); + } + + public bool SwitchLater() + { + var p = GeniusInvokationControl.GetInstance().MakeOffset(Area.GetCenterPoint()); + // 选择角色 + ClickExtension.Move(p).LeftButtonClick(); + + // 点击切人按钮 + GeniusInvokationControl.GetInstance().ActionPhasePressSwitchButton(); + return true; + } + + /// + /// 角色被打败的时候双击角色牌重新出战 + /// + /// + public void SwitchWhenTakenOut() + { + _logger.LogInformation("有角色被打败,当前选择{Name}出战", Name); + var p = GeniusInvokationControl.GetInstance().MakeOffset(Area.GetCenterPoint()); + // 选择角色 + ClickExtension.Move(p).LeftButtonClick(); + // 双击切人 + GeniusInvokationControl.GetInstance().Sleep(500); + ClickExtension.Move(p).LeftButtonClick(); + GeniusInvokationControl.GetInstance().Sleep(300); + } + + public bool UseSkill(int skillIndex, Duel duel) + { + bool res = GeniusInvokationControl.GetInstance() + .ActionPhaseAutoUseSkill(skillIndex, Skills[skillIndex].SpecificElementCost, Skills[skillIndex].Type, duel); + if (res) + { + return true; + } + else + { + _logger.LogWarning("没有足够的手牌或元素骰子释放技能"); + return false; + } + } + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/CharacterStatusEnum.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/CharacterStatusEnum.cs new file mode 100644 index 00000000..f193d3f4 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/CharacterStatusEnum.cs @@ -0,0 +1,8 @@ +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model +{ + public enum CharacterStatusEnum + { + Frozen, + Dizziness + } +} diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Duel.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Duel.cs new file mode 100644 index 00000000..0edbd106 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Duel.cs @@ -0,0 +1,382 @@ +using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception; +using GeniusInvokationAutoToy.Utils; +using Microsoft.Extensions.Logging; +using OpenCvSharp; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model; + +public class Duel +{ + private readonly ILogger _logger = App.GetLogger(); + + public Character CurrentCharacter { get; set; } + public Character[] Characters { get; set; } = new Character[4]; + + /// + /// 行动指令队列 + /// + public List ActionCommandQueue { get; set; } = new List(); + + /// + /// 当前回合数 + /// + public int RoundNum { get; set; } = 1; + + /// + /// 角色牌位置 + /// + public List CharacterCardRects { get; set; } + + /// + /// 手牌数量 + /// + public int CurrentCardCount { get; set; } = 0; + + /// + /// 骰子数量 + /// + public int CurrentDiceCount { get; set; } = 0; + + + public CancellationTokenSource Cts { get; set; } + + + public async Task CustomStrategyRunAsync(CancellationTokenSource cts1) + { + await Task.Run(() => { CustomStrategyRun(cts1); }); + } + + public void CustomStrategyRun(CancellationTokenSource cts1) + { + Cts = cts1; + try + { + _logger.LogInformation("========================================"); + _logger.LogInformation("→ {Text}", "全自动七圣召唤,启动!"); + + GeniusInvokationControl.GetInstance().Init(Cts); + SystemControl.ActivateWindow(); + + // 对局准备 选择初始手牌 + GeniusInvokationControl.GetInstance().CommonDuelPrepare(); + + + // 获取角色区域 + CharacterCardRects = Retry.Do(() => GeniusInvokationControl.GetInstance().GetCharacterRects(), + TimeSpan.FromSeconds(1.5), 20); + if (CharacterCardRects == null || CharacterCardRects.Count != 3) + { + throw new DuelEndException("未成功获取到角色区域"); + } + + for (var i = 1; i < 4; i++) + { + Characters[i].Area = CharacterCardRects[i - 1]; + } + + // 出战角色 + CurrentCharacter = ActionCommandQueue[0].Character; + CurrentCharacter.ChooseFirst(); + + // 开始执行回合 + while (true) + { + _logger.LogInformation("--------------第{RoundNum}回合--------------", RoundNum); + ClearCharacterStatus(); // 清空单回合的异常状态 + if (RoundNum == 1) + { + CurrentCardCount = 5; + } + else + { + CurrentCardCount += 2; + } + + CurrentDiceCount = 8; + + // 预计算本回合内的所有可能的元素 + var elementSet = PredictionDiceType(); + + // 0 投骰子 + GeniusInvokationControl.GetInstance().ReRollDice(elementSet.ToArray()); + + // 等待到我的回合 // 投骰子动画时间是不确定的 // 可能是对方先手 + GeniusInvokationControl.GetInstance().WaitForMyTurn(this, 1000); + + // 开始执行行动 + while (true) + { + // 没骰子了就结束行动 + _logger.LogInformation("行动开始,当前骰子数[{CurrentDiceCount}],当前手牌数[{CurrentCardCount}]", CurrentDiceCount, CurrentCardCount); + if (CurrentDiceCount <= 0) + { + _logger.LogInformation("骰子已经用完"); + GeniusInvokationControl.GetInstance().Sleep(2000); + break; + } + + // 每次行动前都要检查当前角色 + CurrentCharacter = GeniusInvokationControl.GetInstance().WhichCharacterActiveWithRetry(this); + + var alreadyExecutedActionIndex = new List(); + var alreadyExecutedActionCommand = new List(); + var i = 0; + for (i = 0; i < ActionCommandQueue.Count; i++) + { + var actionCommand = ActionCommandQueue[i]; + // 指令中的角色未被打败、角色有异常状态 跳过指令 + if (actionCommand.Character.IsDefeated || actionCommand.Character.StatusList?.Count > 0) + { + continue; + } + + // 当前出战角色身上存在异常状态的情况下不执行本角色的指令 + if (CurrentCharacter.StatusList?.Count > 0 && + actionCommand.Character.Index == CurrentCharacter.Index) + { + continue; + } + + + // 1. 判断切人 + if (CurrentCharacter.Index != actionCommand.Character.Index) + { + if (CurrentDiceCount >= 1) + { + actionCommand.SwitchLater(); + CurrentDiceCount--; + alreadyExecutedActionIndex.Add(-actionCommand.Character.Index); // 标记为已执行 + var switchAction = new ActionCommand + { + Character = CurrentCharacter, + Action = ActionEnum.SwitchLater, + TargetIndex = actionCommand.Character.Index + }; + alreadyExecutedActionCommand.Add(switchAction); + _logger.LogInformation("→指令执行完成:{Action}", switchAction); + break; + } + else + { + _logger.LogInformation("骰子不足以进行下一步:切换角色 {CharacterIndex}", actionCommand.Character.Index); + break; + } + } + + // 2. 判断使用技能 + if (actionCommand.GetAllDiceUseCount() > CurrentDiceCount) + { + _logger.LogInformation("骰子不足以进行下一步:{Action}", actionCommand); + break; + } + else + { + bool useSkillRes = actionCommand.UseSkill(this); + if (useSkillRes) + { + CurrentDiceCount -= actionCommand.GetAllDiceUseCount(); + alreadyExecutedActionIndex.Add(i); + alreadyExecutedActionCommand.Add(actionCommand); + _logger.LogInformation("→指令执行完成:{Action}", actionCommand); + } + else + { + _logger.LogWarning("→指令执行失败(可能是手牌不够):{Action}", actionCommand); + GeniusInvokationControl.GetInstance().Sleep(1000); + GeniusInvokationControl.GetInstance().ClickGameWindowCenter(); + } + + break; + } + } + + + + if (alreadyExecutedActionIndex.Count != 0) + { + foreach (var index in alreadyExecutedActionIndex) + { + if (index >= 0) + { + ActionCommandQueue.RemoveAt(index); + } + } + + alreadyExecutedActionIndex.Clear(); + // 等待对方行动完成 (开大的时候等待时间久一点) + var sleepTime = ComputeWaitForMyTurnTime(alreadyExecutedActionCommand); + GeniusInvokationControl.GetInstance().WaitForMyTurn(this, sleepTime); + alreadyExecutedActionCommand.Clear(); + } + else + { + // 如果没有任何指令可以执行 则跳出循环 + // TODO 也有可能是角色死亡/所有角色被冻结导致没有指令可以执行 + //if (i >= ActionCommandQueue.Count) + //{ + // throw new DuelEndException("策略中所有指令已经执行完毕,结束自动打牌"); + //} + GeniusInvokationControl.GetInstance().Sleep(2000); + break; + } + + if (ActionCommandQueue.Count == 0) + { + throw new DuelEndException("策略中所有指令已经执行完毕,结束自动打牌"); + } + } + + // 回合结束 + GeniusInvokationControl.GetInstance().Sleep(1000); + _logger.LogInformation("我方点击回合结束"); + GeniusInvokationControl.GetInstance().RoundEnd(); + + // 等待对方行动+回合结算 + GeniusInvokationControl.GetInstance().WaitOpponentAction(this); + RoundNum++; + } + } + catch (TaskCanceledException ex) + { + _logger.LogInformation(ex.Message); + } + catch (DuelEndException ex) + { + _logger.LogInformation(ex.Message); + _logger.LogInformation("← {Text}", "退出全自动七圣召唤"); + } + catch (System.Exception ex) + { + _logger.LogError(ex.ToString()); + } + finally + { + _logger.LogInformation("========================================"); + } + } + + private HashSet PredictionDiceType() + { + var actionUseDiceSum = 0; + var elementSet = new HashSet + { + ElementalType.Omni + }; + for (var i = 0; i < ActionCommandQueue.Count; i++) + { + var actionCommand = ActionCommandQueue[i]; + + // 角色未被打败的情况下才能执行 + if (actionCommand.Character.IsDefeated) + { + continue; + } + + // 通过骰子数量判断是否可以执行 + + // 1. 判断切人 + if (i > 0 && actionCommand.Character.Index != ActionCommandQueue[i - 1].Character.Index) + { + actionUseDiceSum++; + if (actionUseDiceSum > CurrentDiceCount) + { + break; + } + else + { + elementSet.Add(actionCommand.GetDiceUseElementType()); + //executeActionIndex.Add(-actionCommand.Character.Index); + } + } + + // 2. 判断使用技能 + actionUseDiceSum += actionCommand.GetAllDiceUseCount(); + if (actionUseDiceSum > CurrentDiceCount) + { + break; + } + else + { + elementSet.Add(actionCommand.GetDiceUseElementType()); + //executeActionIndex.Add(i); + } + } + + return elementSet; + } + + public void ClearCharacterStatus() + { + foreach (var character in Characters) + { + character?.StatusList?.Clear(); + } + } + + /// + /// 根据前面执行的命令计算等待时间 + /// 大招等待15秒 + /// 快速切换等待3秒 + /// + /// + /// + private int ComputeWaitForMyTurnTime(List alreadyExecutedActionCommand) + { + foreach (var command in alreadyExecutedActionCommand) + { + if (command.Action == ActionEnum.UseSkill && command.TargetIndex == 1) + { + return 15000; + } + + // 莫娜切换等待3秒 + if (command.Character.Name == "莫娜" && command.Action == ActionEnum.SwitchLater) + { + return 3000; + } + } + + return 10000; + } + + /// + /// 获取角色切换顺序 + /// + /// + public List GetCharacterSwitchOrder() + { + List orderList = new List(); + for (var i = 0; i < ActionCommandQueue.Count; i++) + { + if (!orderList.Contains(ActionCommandQueue[i].Character.Index)) + { + orderList.Add(ActionCommandQueue[i].Character.Index); + } + } + + return orderList; + } + + /// + /// 获取角色存活数量 + /// + /// + public int GetCharacterAliveNum() + { + int num = 0; + foreach (var character in Characters) + { + if (character != null && !character.IsDefeated) + { + num++; + } + } + + return num; + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ElementalType.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ElementalType.cs new file mode 100644 index 00000000..1e72d0ee --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/ElementalType.cs @@ -0,0 +1,101 @@ +using System; + +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model +{ + public enum ElementalType + { + Omni, + Cryo, + Hydro, + Pyro, + Electro, + Dendro, + Anemo, + Geo + } + + public static class ElementalTypeExtension + { + public static ElementalType ToElementalType(this string type) + { + type = type.ToLower(); + switch (type) + { + case "omni": + return ElementalType.Omni; + case "cryo": + return ElementalType.Cryo; + case "hydro": + return ElementalType.Hydro; + case "pyro": + return ElementalType.Pyro; + case "electro": + return ElementalType.Electro; + case "dendro": + return ElementalType.Dendro; + case "anemo": + return ElementalType.Anemo; + case "geo": + return ElementalType.Geo; + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } + + public static ElementalType ChineseToElementalType(this string type) + { + type = type.ToLower(); + switch (type) + { + case "全": + return ElementalType.Omni; + case "冰": + return ElementalType.Cryo; + case "水": + return ElementalType.Hydro; + case "火": + return ElementalType.Pyro; + case "雷": + return ElementalType.Electro; + case "草": + return ElementalType.Dendro; + case "风": + return ElementalType.Anemo; + case "岩": + return ElementalType.Geo; + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } + + public static string ToChinese(this ElementalType type) + { + switch (type) + { + case ElementalType.Omni: + return "全"; + case ElementalType.Cryo: + return "冰"; + case ElementalType.Hydro: + return "水"; + case ElementalType.Pyro: + return "火"; + case ElementalType.Electro: + return "雷"; + case ElementalType.Dendro: + return "草"; + case ElementalType.Anemo: + return "风"; + case ElementalType.Geo: + return "岩"; + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } + + public static string ToLowerString(this ElementalType type) + { + return type.ToString().ToLower(); + } + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/RollPhaseDice.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/RollPhaseDice.cs new file mode 100644 index 00000000..984f825d --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/RollPhaseDice.cs @@ -0,0 +1,42 @@ +using System; +using System.Drawing; + +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model +{ + /// + /// 投掷期间骰子 + /// + [Obsolete] + public class RollPhaseDice + { + /// + /// 元素类型 + /// + public ElementalType Type { get; set; } + + /// + /// 中心点位置 + /// + public Point CenterPosition { get; set; } + + public RollPhaseDice(ElementalType type, Point centerPosition) + { + Type = type; + CenterPosition = centerPosition; + } + + public RollPhaseDice() + { + } + + public override string ToString() + { + return $"Type:{Type},CenterPosition:{CenterPosition}"; + } + + public void Click() + { + //MouseUtils.Click(CenterPosition.X, CenterPosition.Y); + } + } +} diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/RoundStrategy.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/RoundStrategy.cs new file mode 100644 index 00000000..24c4ed44 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/RoundStrategy.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; + +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model; + +[Obsolete] +public class RoundStrategy +{ + public List RawCommandList { get; set; } = new List(); + + public List ActionCommands { get; set; } = new List(); + + public List MaybeNeedElement(Duel duel) + { + List result = new List(); + + for (int i = 0; i < ActionCommands.Count; i++) + { + if (ActionCommands[i].Action == ActionEnum.SwitchLater + && i != ActionCommands.Count-1 + && ActionCommands[i+1].Action == ActionEnum.UseSkill) + { + result.Add(duel.Characters[ActionCommands[i].TargetIndex].Element); + } + } + return result; + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Skill.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Skill.cs new file mode 100644 index 00000000..811c83da --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Model/Skill.cs @@ -0,0 +1,23 @@ +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model; + +public class Skill +{ + /// + /// 1-4 和数组下标一致,游戏中是从右往左开始数的! + /// + public short Index { get; set; } + public ElementalType Type { get; set; } + /// + /// 消耗指定元素骰子数量 + /// + public int SpecificElementCost { get; set; } + + /// + /// 消耗杂色骰子数量 + /// + public int AnyElementCost { get; set; } = 0; + /// + /// 消耗指定元素骰子数量 + 消耗杂色骰子数量 = 消耗总骰子数量 + /// + public int AllCost { get; set; } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/ScriptParser.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/ScriptParser.cs new file mode 100644 index 00000000..93414741 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/ScriptParser.cs @@ -0,0 +1,171 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model; +using Microsoft.Extensions.Logging; + +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation; + +public class ScriptParser +{ + private static readonly ILogger MyLogger = App.GetLogger(); + public static Duel Parse(string script) + { + var lines = script.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + var result = new List(); + foreach (var line in lines) + { + string l = line.Trim(); + result.Add(l); + } + + return Parse(result); + } + + public static Duel Parse(List lines) + { + Duel duel = new Duel(); + string stage = ""; + + int i = 0; + try + { + for (i = 0; i < lines.Count; i++) + { + var line = lines[i]; + if (line.Contains(":")) + { + stage = line; + continue; + } + + if (line == "---" || line.StartsWith("//") || string.IsNullOrEmpty(line)) + { + continue; + } + + if (stage == "角色定义:") + { + var character = ParseCharacter(line); + duel.Characters[character.Index] = character; + } + else if (stage == "策略定义:") + { + MyAssert(duel.Characters[3] != null, "角色未定义"); + + string[] actionParts = line.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); + MyAssert(actionParts.Length == 3, "策略中的行动命令解析错误"); + MyAssert(actionParts[1] == "使用", "策略中的行动命令解析错误"); + + var actionCommand = new ActionCommand(); + var action = actionParts[1].ChineseToActionEnum(); + actionCommand.Action = action; + + int j = 1; + for (j = 1; j <= 3; j++) + { + var character = duel.Characters[j]; + if (character != null && character.Name == actionParts[0]) + { + actionCommand.Character = character; + break; + } + } + + MyAssert(j <= 3, "策略中的行动命令解析错误:角色名称无法从角色定义中匹配到"); + + int skillNum = int.Parse(Regex.Replace(actionParts[2], @"[^0-9]+", "")); + MyAssert(skillNum < 5, "策略中的行动命令解析错误:技能编号错误"); + actionCommand.TargetIndex = skillNum; + duel.ActionCommandQueue.Add(actionCommand); + } + else + { + throw new System.Exception($"未知的定义字段:{stage}"); + } + } + + MyAssert(duel.Characters[3] != null, "角色未定义,请确认策略文本格式是否为UTF-8"); + } + catch (System.Exception ex) + { + MyLogger.LogError($"解析脚本错误,行号:{i + 1},错误信息:{ex}"); + MessageBox.Show($"解析脚本错误,行号:{i + 1},错误信息:{ex}", "策略解析失败", MessageBoxButtons.OK, MessageBoxIcon.Error); + return null; + } + + return duel; + } + + /// + /// 解析示例 + /// 角色1=刻晴|雷{技能3消耗=1雷骰子+2任意,技能2消耗=3雷骰子,技能1消耗=4雷骰子} + /// 角色2=雷神|雷{技能3消耗=1雷骰子+2任意,技能2消耗=3雷骰子,技能1消耗=4雷骰子} + /// 角色3=甘雨|冰{技能4消耗=1冰骰子+2任意,技能3消耗=1冰骰子,技能2消耗=5冰骰子,技能1消耗=3冰骰子} + /// + /// + /// + public static Character ParseCharacter(string line) + { + var character = new Character(); + + var characterAndSkill = line.Split('{'); + + var parts = characterAndSkill[0].Split('='); + character.Index = int.Parse(Regex.Replace(parts[0], @"[^0-9]+", "")); + MyAssert(character.Index >= 1 && character.Index <= 3, "角色序号必须在1-3之间"); + var nameAndElement = parts[1].Split('|'); + character.Name = nameAndElement[0]; + character.Element = nameAndElement[1].Substring(0, 1).ChineseToElementalType(); + + // 技能 + string skillStr = characterAndSkill[1].Replace("}", ""); + var skillParts = skillStr.Split(','); + var skills = new Skill[skillParts.Length + 1]; + for (int i = 0; i < skillParts.Length; i++) + { + var skill = ParseSkill(skillParts[i]); + skills[skill.Index] = skill; + } + + character.Skills = skills.ToArray(); + return character; + } + + /// + /// 技能3消耗=1雷骰子+2任意 + /// 技能2消耗=3雷骰子 + /// 技能1消耗=4雷骰子 + /// + /// + /// + public static Skill ParseSkill(string oneSkillStr) + { + var skill = new Skill(); + var parts = oneSkillStr.Split('='); + skill.Index = short.Parse(Regex.Replace(parts[0], @"[^0-9]+", "")); + MyAssert(skill.Index >= 1 && skill.Index <= 5, "技能序号必须在1-5之间"); + var costStr = parts[1]; + var costParts = costStr.Split('+'); + skill.SpecificElementCost = int.Parse(costParts[0].Substring(0, 1)); + skill.Type = costParts[0].Substring(1, 1).ChineseToElementalType(); + // 杂色骰子在+号右边 + if (costParts.Length > 1) + { + skill.AnyElementCost = int.Parse(costParts[1].Substring(0, 1)); + } + + skill.AllCost = skill.SpecificElementCost + skill.AnyElementCost; + return skill; + } + + private static void MyAssert(bool b, string msg) + { + if (!b) + { + throw new System.Exception(msg); + } + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Utils/Retry.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Utils/Retry.cs new file mode 100644 index 00000000..e29084af --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Utils/Retry.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace GeniusInvokationAutoToy.Utils +{ + /// + /// https://stackoverflow.com/questions/1563191/cleanest-way-to-write-retry-logic + /// + public static class Retry + { + public static void Do( + Action action, + TimeSpan retryInterval, + int maxAttemptCount = 3) + { + Do(() => + { + action(); + return null; + }, retryInterval, maxAttemptCount); + } + + public static T Do( + Func action, + TimeSpan retryInterval, + int maxAttemptCount = 3) + { + var exceptions = new List(); + + for (int attempted = 0; attempted < maxAttemptCount; attempted++) + { + try + { + if (attempted > 0) + { + Thread.Sleep(retryInterval); + } + + return action(); + } + catch (Exception ex) + { + exceptions.Add(ex); + } + } + + throw new AggregateException(exceptions); + } + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/Model/RectArea.cs b/BetterGenshinImpact/GameTask/Model/RectArea.cs index 204d239a..489c0607 100644 --- a/BetterGenshinImpact/GameTask/Model/RectArea.cs +++ b/BetterGenshinImpact/GameTask/Model/RectArea.cs @@ -193,22 +193,22 @@ public class RectArea : IDisposable return _srcBitmap != null || _srcMat != null; } - /// - /// 在本区域内查找目标图像 - /// - /// - /// - [Obsolete] - public RectArea Find(Mat targetImageMat) - { - if (!HasImage()) - { - throw new Exception("当前对象内没有图像内容,无法完成 Find 操作"); - } + ///// + ///// 在本区域内查找目标图像 + ///// + ///// + ///// + //[Obsolete] + //public RectArea Find(Mat targetImageMat) + //{ + // if (!HasImage()) + // { + // throw new Exception("当前对象内没有图像内容,无法完成 Find 操作"); + // } - var p = OldMatchTemplateHelper.FindSingleTarget(SrcGreyMat, targetImageMat); - return p is { X: > 0, Y: > 0 } ? new RectArea(targetImageMat, p.X - targetImageMat.Width / 2, p.Y - targetImageMat.Height / 2, this) : new RectArea(); - } + // var p = OldMatchTemplateHelper.FindSingleTarget(SrcGreyMat, targetImageMat); + // return p is { X: > 0, Y: > 0 } ? new RectArea(targetImageMat, p.X - targetImageMat.Width / 2, p.Y - targetImageMat.Height / 2, this) : new RectArea(); + //} /// /// 在本区域内查找识别对象 @@ -343,22 +343,22 @@ public class RectArea : IDisposable return ra; } - /// - /// 找到图像并点击中心 - /// - /// - /// - [Obsolete] - public RectArea ClickCenter(Mat targetImageMat) - { - var ra = Find(targetImageMat); - if (!ra.IsEmpty()) - { - ra.ClickCenter(); - } + ///// + ///// 找到图像并点击中心 + ///// + ///// + ///// + //[Obsolete] + //public RectArea ClickCenter(Mat targetImageMat) + //{ + // var ra = Find(targetImageMat); + // if (!ra.IsEmpty()) + // { + // ra.ClickCenter(); + // } - return ra; - } + // return ra; + //} /// /// 当前对象点击中心 diff --git a/BetterGenshinImpact/GameTask/Model/SystemInfo.cs b/BetterGenshinImpact/GameTask/Model/SystemInfo.cs index 87be90bd..73d0c5d6 100644 --- a/BetterGenshinImpact/GameTask/Model/SystemInfo.cs +++ b/BetterGenshinImpact/GameTask/Model/SystemInfo.cs @@ -27,7 +27,7 @@ namespace BetterGenshinImpact.GameTask.Model /// 捕获窗口区域 现在已经和实际游戏画面一致 /// CaptureAreaRect = GameScreenSize or GameWindowRect /// - public RECT CaptureAreaRect { get; } + public RECT CaptureAreaRect { get; set; } public Process GameProcess { get; } diff --git a/BetterGenshinImpact/GameTask/Placeholder/PlaceholderTrigger.cs b/BetterGenshinImpact/GameTask/Placeholder/PlaceholderTrigger.cs index 92b5abd5..44224197 100644 --- a/BetterGenshinImpact/GameTask/Placeholder/PlaceholderTrigger.cs +++ b/BetterGenshinImpact/GameTask/Placeholder/PlaceholderTrigger.cs @@ -14,21 +14,9 @@ public class TestTrigger : ITaskTrigger public int Priority => 9999; public bool IsExclusive { get; private set; } - private readonly RecognitionObject _optionButtonRo; - - private readonly AutoFishingAssets _autoFishingAssets; - public TestTrigger() { var info = TaskContext.Instance().SystemInfo; - _optionButtonRo = new RecognitionObject - { - Name = "OptionButton", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssertImage("AutoSkip", "option.png"), - DrawOnWindow = true - }.InitTemplate(); - _autoFishingAssets = new AutoFishingAssets(); } public void Init() diff --git a/BetterGenshinImpact/GameTask/SystemControl.cs b/BetterGenshinImpact/GameTask/SystemControl.cs index aeb53171..a9cf3ce0 100644 --- a/BetterGenshinImpact/GameTask/SystemControl.cs +++ b/BetterGenshinImpact/GameTask/SystemControl.cs @@ -12,8 +12,7 @@ public class SystemControl return FindHandleByProcessName("YuanShen", "GenshinImpact", "Genshin Impact Cloud Game"); } - [Obsolete] - public static bool IsGenshinImpactActiveOld() + public static bool IsGenshinImpactActiveByProcess() { var name = GetActiveProcessName(); return name is "YuanShen" or "GenshinImpact" or "Genshin Impact Cloud Game"; @@ -119,6 +118,15 @@ public class SystemControl User32.SetForegroundWindow(hWnd); } + public static void ActivateWindow() + { + if (!TaskContext.Instance().IsInitialized) + { + throw new Exception("请先启动BetterGI"); + } + ActivateWindow(TaskContext.Instance().GameHandle); + } + public static bool IsFullScreenMode(IntPtr hWnd) { if (hWnd == IntPtr.Zero) diff --git a/BetterGenshinImpact/Helpers/Extensions/ClickExtension.cs b/BetterGenshinImpact/Helpers/Extensions/ClickExtension.cs index 3fa1cc83..c43d2782 100644 --- a/BetterGenshinImpact/Helpers/Extensions/ClickExtension.cs +++ b/BetterGenshinImpact/Helpers/Extensions/ClickExtension.cs @@ -1,5 +1,6 @@ using BetterGenshinImpact.Core.Simulator; using OpenCvSharp; +using WindowsInput; namespace BetterGenshinImpact.Helpers.Extensions; @@ -17,9 +18,20 @@ public static class ClickExtension (rect.Y + rect.Height * 1d / 2) * 65535 / PrimaryScreen.WorkingArea.Height).LeftButtonClick(); } - public static void Click(int x, int y) + public static IMouseSimulator Click(int x, int y) { - Simulation.SendInput.Mouse.MoveMouseTo(x * 65535 * 1d / PrimaryScreen.WorkingArea.Width, + return Simulation.SendInput.Mouse.MoveMouseTo(x * 65535 * 1d / PrimaryScreen.WorkingArea.Width, y * 65535 * 1d / PrimaryScreen.WorkingArea.Height).LeftButtonClick(); } + + public static IMouseSimulator Move(double x, double y) + { + return Simulation.SendInput.Mouse.MoveMouseTo(x * 65535 * 1d / PrimaryScreen.WorkingArea.Width, + y * 65535 * 1d / PrimaryScreen.WorkingArea.Height).LeftButtonClick(); + } + + public static IMouseSimulator Move(Point p) + { + return Move(p.X, p.Y); + } } \ No newline at end of file