From bdc99e9e06f68af382227db64b21d8e1fc888bbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=89=E9=B8=AD=E8=9B=8B?= Date: Thu, 4 Apr 2024 14:38:04 +0800 Subject: [PATCH] all assets to singleton --- .../GameTask/AutoDomain/AutoDomainTask.cs | 22 +- .../AutoFight/Assets/AutoFightAssets.cs | 57 ++-- .../GameTask/AutoFight/AutoFightContext.cs | 29 +- .../GameTask/AutoFight/Model/Avatar.cs | 64 ++-- .../GameTask/AutoFight/Model/CombatScenes.cs | 8 +- .../AutoFishing/Assets/AutoFishingAssets.cs | 155 +++++----- .../AutoFishing/AutoFishingTrigger.cs | 2 +- .../Assets/AutoGeniusInvokationAssets.cs | 286 +++++++++--------- .../AutoSkip/Assets/AutoSkipAssets.cs | 24 +- .../AutoWood/Assets/AutoWoodAssets.cs | 9 +- .../GameTask/AutoWood/AutoWoodTask.cs | 3 +- .../Assets/QuickSereniteaPotAssets.cs | 5 +- .../QuickSereniteaPotTask.cs | 2 +- .../Assets/QuickTeleportAssets.cs | 60 ++-- 14 files changed, 345 insertions(+), 381 deletions(-) diff --git a/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs b/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs index 4ea0add9..7f3a0933 100644 --- a/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs +++ b/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs @@ -44,7 +44,7 @@ public class AutoDomainTask public AutoDomainTask(AutoDomainParam taskParam) { _taskParam = taskParam; - _simulator = AutoFightContext.Instance().Simulator; + _simulator = AutoFightContext.Instance.Simulator; var captureArea = TaskContext.Instance().SystemInfo.CaptureAreaRect; var assetScale = TaskContext.Instance().SystemInfo.AssetScale; @@ -181,7 +181,7 @@ public class AutoDomainTask private void EnterDomain() { - var fightAssets = AutoFightContext.Instance().FightAssets; + var fightAssets = AutoFightContext.Instance.FightAssets; var fRectArea = GetContentFromDispatcher().CaptureRectArea.Find(AutoPickAssets.Instance.FRo); if (!fRectArea.IsEmpty()) @@ -217,7 +217,7 @@ public class AutoDomainTask while (retryTimes < 120) { retryTimes++; - var cactRectArea = GetContentFromDispatcher().CaptureRectArea.Find(AutoFightContext.Instance().FightAssets.ClickAnyCloseTipRa); + var cactRectArea = GetContentFromDispatcher().CaptureRectArea.Find(AutoFightContext.Instance.FightAssets.ClickAnyCloseTipRa); if (!cactRectArea.IsEmpty()) { Sleep(1000, _taskParam.Cts); @@ -366,7 +366,7 @@ public class AutoDomainTask { var content = GetContentFromDispatcher(); - var endTipsRect = content.CaptureRectArea.Crop(AutoFightContext.Instance().FightAssets.EndTipsUpperRect); + var endTipsRect = content.CaptureRectArea.Crop(AutoFightContext.Instance.FightAssets.EndTipsUpperRect); var text = OcrFactory.Paddle.Ocr(endTipsRect.SrcGreyMat); if (text.Contains("挑战") || text.Contains("达成")) { @@ -374,7 +374,7 @@ public class AutoDomainTask return true; } - endTipsRect = content.CaptureRectArea.Crop(AutoFightContext.Instance().FightAssets.EndTipsRect); + endTipsRect = content.CaptureRectArea.Crop(AutoFightContext.Instance.FightAssets.EndTipsRect); text = OcrFactory.Paddle.Ocr(endTipsRect.SrcGreyMat); if (text.Contains("自动") || text.Contains("退出")) { @@ -661,7 +661,7 @@ public class AutoDomainTask break; } - var useCondensedResinRa = GetContentFromDispatcher().CaptureRectArea.Find(AutoFightContext.Instance().FightAssets.UseCondensedResinRa); + var useCondensedResinRa = GetContentFromDispatcher().CaptureRectArea.Find(AutoFightContext.Instance.FightAssets.UseCondensedResinRa); if (!useCondensedResinRa.IsEmpty()) { useCondensedResinRa.ClickCenter(); @@ -687,13 +687,13 @@ public class AutoDomainTask // 优先点击继续 var content = GetContentFromDispatcher(); - var confirmRectArea = content.CaptureRectArea.Find(AutoFightContext.Instance().FightAssets.ConfirmRa); + var confirmRectArea = content.CaptureRectArea.Find(AutoFightContext.Instance.FightAssets.ConfirmRa); if (!confirmRectArea.IsEmpty()) { if (isLastTurn) { // 最后一回合 退出 - var exitRectArea = content.CaptureRectArea.Find(AutoFightContext.Instance().FightAssets.ExitRa); + var exitRectArea = content.CaptureRectArea.Find(AutoFightContext.Instance.FightAssets.ExitRa); if (!exitRectArea.IsEmpty()) { exitRectArea.ClickCenter(); @@ -711,7 +711,7 @@ public class AutoDomainTask if (condensedResinCount == 0 && fragileResinCount < 20) { // 没有体力了退出 - var exitRectArea = content.CaptureRectArea.Find(AutoFightContext.Instance().FightAssets.ExitRa); + var exitRectArea = content.CaptureRectArea.Find(AutoFightContext.Instance.FightAssets.ExitRa); if (!exitRectArea.IsEmpty()) { exitRectArea.ClickCenter(); @@ -742,7 +742,7 @@ public class AutoDomainTask var content = GetContentFromDispatcher(); // 浓缩树脂 - var condensedResinCountRa = content.CaptureRectArea.Find(AutoFightContext.Instance().FightAssets.CondensedResinCountRa); + var condensedResinCountRa = content.CaptureRectArea.Find(AutoFightContext.Instance.FightAssets.CondensedResinCountRa); if (!condensedResinCountRa.IsEmpty()) { // 图像右侧就是浓缩树脂数量 @@ -753,7 +753,7 @@ public class AutoDomainTask } // 脆弱树脂 - var fragileResinCountRa = content.CaptureRectArea.Find(AutoFightContext.Instance().FightAssets.FragileResinCountRa); + var fragileResinCountRa = content.CaptureRectArea.Find(AutoFightContext.Instance.FightAssets.FragileResinCountRa); if (!fragileResinCountRa.IsEmpty()) { // 图像右侧就是脆弱树脂数量 diff --git a/BetterGenshinImpact/GameTask/AutoFight/Assets/AutoFightAssets.cs b/BetterGenshinImpact/GameTask/AutoFight/Assets/AutoFightAssets.cs index 28e806e2..77326d04 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/Assets/AutoFightAssets.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/Assets/AutoFightAssets.cs @@ -1,10 +1,11 @@ using System.Collections.Generic; using BetterGenshinImpact.Core.Recognition; +using BetterGenshinImpact.GameTask.Model; using OpenCvSharp; namespace BetterGenshinImpact.GameTask.AutoFight.Assets; -public class AutoFightAssets +public class AutoFightAssets : BaseAssets { public Rect TeamRectNoIndex; public Rect TeamRect; @@ -22,35 +23,31 @@ public class AutoFightAssets // 树脂状态 public RecognitionObject CondensedResinCountRa; + public RecognitionObject FragileResinCountRa; - public AutoFightAssets() + private AutoFightAssets() { - var info = TaskContext.Instance().SystemInfo; - var captureRect = info.CaptureAreaRect; - var assetScale = info.AssetScale; - - TeamRectNoIndex = new Rect(captureRect.Width - (int)(355 * assetScale), (int)(220 * assetScale), - (int)((355 - 85) * assetScale), (int)(465 * assetScale)); - TeamRect = new Rect(captureRect.Width - (int)(355 * assetScale), (int)(220 * assetScale), - (int)(355 * assetScale), (int)(465 * assetScale)); - ERect = new Rect(captureRect.Width - (int)(267 * assetScale), captureRect.Height - (int)(132 * assetScale), - (int)(77 * assetScale), (int)(77 * assetScale)); - QRect = new Rect(captureRect.Width - (int)(157 * assetScale), captureRect.Height - (int)(165 * assetScale), - (int)(110 * assetScale), (int)(110 * assetScale)); + TeamRectNoIndex = new Rect(CaptureRect.Width - (int)(355 * AssetScale), (int)(220 * AssetScale), + (int)((355 - 85) * AssetScale), (int)(465 * AssetScale)); + TeamRect = new Rect(CaptureRect.Width - (int)(355 * AssetScale), (int)(220 * AssetScale), + (int)(355 * AssetScale), (int)(465 * AssetScale)); + ERect = new Rect(CaptureRect.Width - (int)(267 * AssetScale), CaptureRect.Height - (int)(132 * AssetScale), + (int)(77 * AssetScale), (int)(77 * AssetScale)); + QRect = new Rect(CaptureRect.Width - (int)(157 * AssetScale), CaptureRect.Height - (int)(165 * AssetScale), + (int)(110 * AssetScale), (int)(110 * AssetScale)); // 结束提示从中间开始找相对位置 - EndTipsUpperRect = new Rect(captureRect.Width / 2 - (int)(100 * assetScale), (int)(243 * assetScale), - (int)(200 * assetScale), (int)(50 * assetScale)); - EndTipsRect = new Rect(captureRect.Width / 2 - (int)(200 * assetScale), captureRect.Height - (int)(160 * assetScale), - (int)(400 * assetScale), (int)(80 * assetScale)); - + EndTipsUpperRect = new Rect(CaptureRect.Width / 2 - (int)(100 * AssetScale), (int)(243 * AssetScale), + (int)(200 * AssetScale), (int)(50 * AssetScale)); + EndTipsRect = new Rect(CaptureRect.Width / 2 - (int)(200 * AssetScale), CaptureRect.Height - (int)(160 * AssetScale), + (int)(400 * AssetScale), (int)(80 * AssetScale)); AvatarIndexRectList = new List { - new(captureRect.Width - (int)(61 * assetScale), (int)(256 * assetScale), (int)(28 * assetScale), (int)(24 * assetScale)), - new(captureRect.Width - (int)(61 * assetScale), (int)(352 * assetScale), (int)(28 * assetScale), (int)(24 * assetScale)), - new(captureRect.Width - (int)(61 * assetScale), (int)(448 * assetScale), (int)(28 * assetScale), (int)(24 * assetScale)), - new(captureRect.Width - (int)(61 * assetScale), (int)(544 * assetScale), (int)(28 * assetScale), (int)(24 * assetScale)), + new(CaptureRect.Width - (int)(61 * AssetScale), (int)(256 * AssetScale), (int)(28 * AssetScale), (int)(24 * AssetScale)), + new(CaptureRect.Width - (int)(61 * AssetScale), (int)(352 * AssetScale), (int)(28 * AssetScale), (int)(24 * AssetScale)), + new(CaptureRect.Width - (int)(61 * AssetScale), (int)(448 * AssetScale), (int)(28 * AssetScale), (int)(24 * AssetScale)), + new(CaptureRect.Width - (int)(61 * AssetScale), (int)(544 * AssetScale), (int)(28 * AssetScale), (int)(24 * AssetScale)), }; WandererIconRa = new RecognitionObject @@ -74,7 +71,7 @@ public class AutoFightAssets Name = "Confirm", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFight", "confirm.png"), - RegionOfInterest = new Rect(captureRect.Width / 2, captureRect.Height / 2, captureRect.Width / 2, captureRect.Height / 2), + RegionOfInterest = new Rect(CaptureRect.Width / 2, CaptureRect.Height / 2, CaptureRect.Width / 2, CaptureRect.Height / 2), DrawOnWindow = false }.InitTemplate(); @@ -84,7 +81,7 @@ public class AutoFightAssets Name = "ClickAnyCloseTip", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFight", "click_any_close_tip.png"), - RegionOfInterest = new Rect(0, captureRect.Height / 2, captureRect.Width, captureRect.Height / 2), + RegionOfInterest = new Rect(0, CaptureRect.Height / 2, CaptureRect.Width, CaptureRect.Height / 2), DrawOnWindow = false }.InitTemplate(); @@ -93,7 +90,7 @@ public class AutoFightAssets Name = "UseCondensedResin", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFight", "use_condensed_resin.png"), - RegionOfInterest = new Rect(0, captureRect.Height / 2, captureRect.Width / 2, captureRect.Height / 2), + RegionOfInterest = new Rect(0, CaptureRect.Height / 2, CaptureRect.Width / 2, CaptureRect.Height / 2), DrawOnWindow = false }.InitTemplate(); @@ -102,7 +99,7 @@ public class AutoFightAssets Name = "Exit", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFight", "exit.png"), - RegionOfInterest = new Rect(0, captureRect.Height / 2, captureRect.Width / 2, captureRect.Height / 2), + RegionOfInterest = new Rect(0, CaptureRect.Height / 2, CaptureRect.Width / 2, CaptureRect.Height / 2), DrawOnWindow = false }.InitTemplate(); @@ -111,7 +108,7 @@ public class AutoFightAssets Name = "CondensedResinCount", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFight", "condensed_resin_count.png"), - RegionOfInterest = new Rect(captureRect.Width / 2, captureRect.Height / 3 * 2, captureRect.Width / 2, captureRect.Height / 3), + RegionOfInterest = new Rect(CaptureRect.Width / 2, CaptureRect.Height / 3 * 2, CaptureRect.Width / 2, CaptureRect.Height / 3), DrawOnWindow = false }.InitTemplate(); FragileResinCountRa = new RecognitionObject @@ -119,8 +116,8 @@ public class AutoFightAssets Name = "FragileResinCount", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFight", "fragile_resin_count.png"), - RegionOfInterest = new Rect(captureRect.Width / 2, captureRect.Height / 3 * 2, captureRect.Width / 2, captureRect.Height / 3), + RegionOfInterest = new Rect(CaptureRect.Width / 2, CaptureRect.Height / 3 * 2, CaptureRect.Width / 2, CaptureRect.Height / 3), DrawOnWindow = false }.InitTemplate(); } -} \ No newline at end of file +} diff --git a/BetterGenshinImpact/GameTask/AutoFight/AutoFightContext.cs b/BetterGenshinImpact/GameTask/AutoFight/AutoFightContext.cs index 01871da5..7f0e3916 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/AutoFightContext.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/AutoFightContext.cs @@ -1,10 +1,6 @@ using BetterGenshinImpact.Core.Simulator; using BetterGenshinImpact.GameTask.AutoFight.Assets; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using BetterGenshinImpact.Model; namespace BetterGenshinImpact.GameTask.AutoFight; @@ -12,37 +8,20 @@ namespace BetterGenshinImpact.GameTask.AutoFight; /// 自动战斗上下文 /// 请在启动BetterGI以后再初始化 /// -public class AutoFightContext +public class AutoFightContext : Singleton { - - private static AutoFightContext? _uniqueInstance; - private static readonly object Locker = new(); - private AutoFightContext() { - FightAssets = new(); Simulator = Simulation.PostMessage(TaskContext.Instance().GameHandle); } - public static AutoFightContext Instance() - { - if (_uniqueInstance == null) - { - lock (Locker) - { - _uniqueInstance ??= new AutoFightContext(); - } - } - return _uniqueInstance; - } - /// /// find资源 /// - public readonly AutoFightAssets FightAssets; + public AutoFightAssets FightAssets => AutoFightAssets.Instance; /// /// 战斗专用的PostMessage模拟键鼠操作 /// public readonly PostMessageSimulator Simulator; -} \ No newline at end of file +} diff --git a/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs b/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs index f69bed4d..28d47a31 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/Model/Avatar.cs @@ -103,7 +103,7 @@ public class Avatar /// public void ThrowWhenDefeated(CaptureContent content) { - var confirmRectArea = content.CaptureRectArea.Find(AutoFightContext.Instance().FightAssets.ConfirmRa); + var confirmRectArea = content.CaptureRectArea.Find(AutoFightContext.Instance.FightAssets.ConfirmRa); if (!confirmRectArea.IsEmpty()) { Simulation.SendInputEx.Keyboard.KeyPress(User32.VK.VK_ESCAPE); @@ -135,7 +135,7 @@ public class Avatar return; } - AutoFightContext.Instance().Simulator.KeyPress(User32.VK.VK_1 + (byte)Index - 1); + AutoFightContext.Instance.Simulator.KeyPress(User32.VK.VK_1 + (byte)Index - 1); // Debug.WriteLine($"切换到{Index}号位"); // Cv2.ImWrite($"log/切换.png", content.CaptureRectArea.SrcMat); Sleep(250, Cts); @@ -181,7 +181,7 @@ public class Avatar { var assetScale = TaskContext.Instance().SystemInfo.AssetScale; // 剪裁出队伍区域 - var teamRa = content.CaptureRectArea.Crop(AutoFightContext.Instance().FightAssets.TeamRect); + var teamRa = content.CaptureRectArea.Crop(AutoFightContext.Instance.FightAssets.TeamRect); var blockX = NameRect.X + NameRect.Width * 2 - 10; var block = teamRa.Crop(new Rect(blockX, NameRect.Y, teamRa.Width - blockX, NameRect.Height * 2)); // Cv2.ImWrite($"block_{Name}.png", block.SrcMat); @@ -204,7 +204,7 @@ public class Avatar else { // 剪裁出IndexRect区域 - var teamRa = content.CaptureRectArea.Crop(AutoFightContext.Instance().FightAssets.TeamRect); + var teamRa = content.CaptureRectArea.Crop(AutoFightContext.Instance.FightAssets.TeamRect); var blockX = NameRect.X + NameRect.Width * 2 - 10; var indexBlock = teamRa.Crop(new Rect(blockX + IndexRect.X, NameRect.Y + IndexRect.Y, IndexRect.Width, IndexRect.Height)); // Cv2.ImWrite($"indexBlock_{Name}.png", indexBlock.SrcMat); @@ -232,7 +232,7 @@ public class Avatar return; } - AutoFightContext.Instance().Simulator.LeftButtonClick(); + AutoFightContext.Instance.Simulator.LeftButtonClick(); ms -= 200; Sleep(200, Cts); } @@ -254,7 +254,7 @@ public class Avatar { if (Name == "纳西妲") { - AutoFightContext.Instance().Simulator.KeyDown(User32.VK.VK_E); + AutoFightContext.Instance.Simulator.KeyDown(User32.VK.VK_E); Sleep(300, Cts); for (int j = 0; j < 10; j++) { @@ -263,16 +263,16 @@ public class Avatar } Sleep(300); // 持续操作不应该被cts取消 - AutoFightContext.Instance().Simulator.KeyUp(User32.VK.VK_E); + AutoFightContext.Instance.Simulator.KeyUp(User32.VK.VK_E); } else { - AutoFightContext.Instance().Simulator.LongKeyPress(User32.VK.VK_E); + AutoFightContext.Instance.Simulator.LongKeyPress(User32.VK.VK_E); } } else { - AutoFightContext.Instance().Simulator.KeyPress(User32.VK.VK_E); + AutoFightContext.Instance.Simulator.KeyPress(User32.VK.VK_E); } Sleep(200, Cts); @@ -296,7 +296,7 @@ public class Avatar /// public double GetSkillCurrentCd(CaptureContent content) { - var eRa = content.CaptureRectArea.Crop(AutoFightContext.Instance().FightAssets.ERect); + var eRa = content.CaptureRectArea.Crop(AutoFightContext.Instance.FightAssets.ERect); var text = OcrFactory.Paddle.Ocr(eRa.SrcGreyMat); return StringUtils.TryParseDouble(text); } @@ -315,7 +315,7 @@ public class Avatar return; } - AutoFightContext.Instance().Simulator.KeyPress(User32.VK.VK_Q); + AutoFightContext.Instance.Simulator.KeyPress(User32.VK.VK_Q); Sleep(200, Cts); var content = GetContentFromDispatcher(); @@ -350,7 +350,7 @@ public class Avatar /// public double GetBurstCurrentCd(CaptureContent content) { - var qRa = content.CaptureRectArea.Crop(AutoFightContext.Instance().FightAssets.QRect); + var qRa = content.CaptureRectArea.Crop(AutoFightContext.Instance.FightAssets.QRect); var text = OcrFactory.Paddle.Ocr(qRa.SrcGreyMat); return StringUtils.TryParseDouble(text); } @@ -370,12 +370,11 @@ public class Avatar ms = 200; } - AutoFightContext.Instance().Simulator.RightButtonDown(); + AutoFightContext.Instance.Simulator.RightButtonDown(); Sleep(ms); // 冲刺不能被cts取消 - AutoFightContext.Instance().Simulator.RightButtonUp(); + AutoFightContext.Instance.Simulator.RightButtonUp(); } - public void Walk(string key, int ms) { if (Cts is { IsCancellationRequested: true }) @@ -406,9 +405,9 @@ public class Avatar return; } - AutoFightContext.Instance().Simulator.KeyDown(vk); + AutoFightContext.Instance.Simulator.KeyDown(vk); Sleep(ms); // 行走不能被cts取消 - AutoFightContext.Instance().Simulator.KeyUp(vk); + AutoFightContext.Instance.Simulator.KeyUp(vk); } /// @@ -435,7 +434,7 @@ public class Avatar /// public void Jump() { - AutoFightContext.Instance().Simulator.KeyPress(User32.VK.VK_SPACE); + AutoFightContext.Instance.Simulator.KeyPress(User32.VK.VK_SPACE); } /// @@ -450,7 +449,7 @@ public class Avatar if (Name == "那维莱特") { - AutoFightContext.Instance().Simulator.LeftButtonDown(); + AutoFightContext.Instance.Simulator.LeftButtonDown(); while (ms >= 0) { if (Cts is { IsCancellationRequested: true }) @@ -463,27 +462,26 @@ public class Avatar Sleep(50); // 持续操作不应该被cts取消 } - AutoFightContext.Instance().Simulator.LeftButtonUp(); + AutoFightContext.Instance.Simulator.LeftButtonUp(); } else { - AutoFightContext.Instance().Simulator.LeftButtonDown(); + AutoFightContext.Instance.Simulator.LeftButtonDown(); Sleep(ms); // 持续操作不应该被cts取消 - AutoFightContext.Instance().Simulator.LeftButtonUp(); + AutoFightContext.Instance.Simulator.LeftButtonUp(); } } - public void MouseDown(string key = "left") { key = key.ToLower(); if (key == "left") { - AutoFightContext.Instance().Simulator.LeftButtonDown(); + AutoFightContext.Instance.Simulator.LeftButtonDown(); } else if (key == "right") { - AutoFightContext.Instance().Simulator.RightButtonDown(); + AutoFightContext.Instance.Simulator.RightButtonDown(); } else if (key == "middle") { @@ -496,11 +494,11 @@ public class Avatar key = key.ToLower(); if (key == "left") { - AutoFightContext.Instance().Simulator.LeftButtonUp(); + AutoFightContext.Instance.Simulator.LeftButtonUp(); } else if (key == "right") { - AutoFightContext.Instance().Simulator.RightButtonUp(); + AutoFightContext.Instance.Simulator.RightButtonUp(); } else if (key == "middle") { @@ -513,11 +511,11 @@ public class Avatar key = key.ToLower(); if (key == "left") { - AutoFightContext.Instance().Simulator.LeftButtonClick(); + AutoFightContext.Instance.Simulator.LeftButtonClick(); } else if (key == "right") { - AutoFightContext.Instance().Simulator.RightButtonClick(); + AutoFightContext.Instance.Simulator.RightButtonClick(); } else if (key == "middle") { @@ -533,19 +531,19 @@ public class Avatar public void KeyDown(string key) { var vk = ToVk(key); - AutoFightContext.Instance().Simulator.KeyDown(vk); + AutoFightContext.Instance.Simulator.KeyDown(vk); } public void KeyUp(string key) { var vk = ToVk(key); - AutoFightContext.Instance().Simulator.KeyUp(vk); + AutoFightContext.Instance.Simulator.KeyUp(vk); } public void KeyPress(string key) { var vk = ToVk(key); - AutoFightContext.Instance().Simulator.KeyPress(vk); + AutoFightContext.Instance.Simulator.KeyPress(vk); } public static User32.VK ToVk(string key) @@ -558,4 +556,4 @@ public class Avatar return (User32.VK)Enum.Parse(typeof(User32.VK), key); } -} \ No newline at end of file +} diff --git a/BetterGenshinImpact/GameTask/AutoFight/Model/CombatScenes.cs b/BetterGenshinImpact/GameTask/AutoFight/Model/CombatScenes.cs index 8def46bf..b54606ba 100644 --- a/BetterGenshinImpact/GameTask/AutoFight/Model/CombatScenes.cs +++ b/BetterGenshinImpact/GameTask/AutoFight/Model/CombatScenes.cs @@ -44,7 +44,7 @@ public class CombatScenes } // 剪裁出队伍区域 - var teamRa = content.CaptureRectArea.Crop(AutoFightContext.Instance().FightAssets.TeamRectNoIndex); + var teamRa = content.CaptureRectArea.Crop(AutoFightContext.Instance.FightAssets.TeamRectNoIndex); // 过滤出白色 var hsvFilterMat = OpenCvCommonHelper.InRangeHsv(teamRa.SrcMat, new Scalar(0, 0, 210), new Scalar(255, 30, 255)); @@ -108,10 +108,10 @@ public class CombatScenes { // 流浪者特殊处理 // 4人以上的队伍,不支持流浪者的识别 - var wanderer = rectArea.Find(AutoFightContext.Instance().FightAssets.WandererIconRa); + var wanderer = rectArea.Find(AutoFightContext.Instance.FightAssets.WandererIconRa); if (wanderer.IsEmpty()) { - wanderer = rectArea.Find(AutoFightContext.Instance().FightAssets.WandererIconNoActiveRa); + wanderer = rectArea.Find(AutoFightContext.Instance.FightAssets.WandererIconNoActiveRa); } if (wanderer.IsEmpty()) @@ -187,7 +187,7 @@ public class CombatScenes var nameRect = nameRects?[i] ?? Rect.Empty; avatars[i] = new Avatar(this, names[i], i + 1, nameRect) { - IndexRect = AutoFightContext.Instance().FightAssets.AvatarIndexRectList[i] + IndexRect = AutoFightContext.Instance.FightAssets.AvatarIndexRectList[i] }; } diff --git a/BetterGenshinImpact/GameTask/AutoFishing/Assets/AutoFishingAssets.cs b/BetterGenshinImpact/GameTask/AutoFishing/Assets/AutoFishingAssets.cs index 9782a509..b57631c0 100644 --- a/BetterGenshinImpact/GameTask/AutoFishing/Assets/AutoFishingAssets.cs +++ b/BetterGenshinImpact/GameTask/AutoFishing/Assets/AutoFishingAssets.cs @@ -1,89 +1,82 @@ -using BetterGenshinImpact.Core.Config; +using BetterGenshinImpact.Core.Recognition; +using BetterGenshinImpact.GameTask.Model; 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.AutoFishing.Assets +namespace BetterGenshinImpact.GameTask.AutoFishing.Assets; + +public class AutoFishingAssets : BaseAssets { - public class AutoFishingAssets + public RecognitionObject SpaceButtonRo; + + public RecognitionObject BaitButtonRo; + public RecognitionObject WaitBiteButtonRo; + public RecognitionObject LiftRodButtonRo; + public RecognitionObject ExitFishingButtonRo; + + private AutoFishingAssets() { - public RecognitionObject SpaceButtonRo; - - public RecognitionObject BaitButtonRo; - public RecognitionObject WaitBiteButtonRo; - public RecognitionObject LiftRodButtonRo; - public RecognitionObject ExitFishingButtonRo; - - public AutoFishingAssets() + SpaceButtonRo = new RecognitionObject { - var info = TaskContext.Instance().SystemInfo; - SpaceButtonRo = new RecognitionObject - { - Name = "SpaceButton", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", "space.png"), - RegionOfInterest = new Rect(info.CaptureAreaRect.Width - info.CaptureAreaRect.Width / 3, - info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 5, - info.CaptureAreaRect.Width / 3, - info.CaptureAreaRect.Height / 5), - DrawOnWindow = false - }.InitTemplate(); + Name = "SpaceButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", "space.png"), + RegionOfInterest = new Rect(CaptureRect.Width - CaptureRect.Width / 3, + CaptureRect.Height - CaptureRect.Height / 5, + CaptureRect.Width / 3, + CaptureRect.Height / 5), + DrawOnWindow = false + }.InitTemplate(); - BaitButtonRo = new RecognitionObject - { - Name = "BaitButton", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", "switch_bait.png"), - RegionOfInterest = new Rect(info.CaptureAreaRect.Width - info.CaptureAreaRect.Width / 2, - info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 4, - info.CaptureAreaRect.Width / 2, - info.CaptureAreaRect.Height / 4), - Threshold = 0.7, - DrawOnWindow = false - }.InitTemplate(); - WaitBiteButtonRo = new RecognitionObject - { - Name = "WaitBiteButton", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", "wait_bite.png"), - RegionOfInterest = new Rect(info.CaptureAreaRect.Width - info.CaptureAreaRect.Width / 2, - info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 4, - info.CaptureAreaRect.Width / 2, - info.CaptureAreaRect.Height / 4), - Threshold = 0.7, - DrawOnWindow = false - }.InitTemplate(); - LiftRodButtonRo = new RecognitionObject - { - Name = "LiftRodButton", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", "lift_rod.png"), - RegionOfInterest = new Rect(info.CaptureAreaRect.Width - info.CaptureAreaRect.Width / 2, - info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 4, - info.CaptureAreaRect.Width / 2, - info.CaptureAreaRect.Height / 4), - Threshold = 0.7, - DrawOnWindow = false - }.InitTemplate(); + BaitButtonRo = new RecognitionObject + { + Name = "BaitButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", "switch_bait.png"), + RegionOfInterest = new Rect(CaptureRect.Width - CaptureRect.Width / 2, + CaptureRect.Height - CaptureRect.Height / 4, + CaptureRect.Width / 2, + CaptureRect.Height / 4), + Threshold = 0.7, + DrawOnWindow = false + }.InitTemplate(); + WaitBiteButtonRo = new RecognitionObject + { + Name = "WaitBiteButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", "wait_bite.png"), + RegionOfInterest = new Rect(CaptureRect.Width - CaptureRect.Width / 2, + CaptureRect.Height - CaptureRect.Height / 4, + CaptureRect.Width / 2, + CaptureRect.Height / 4), + Threshold = 0.7, + DrawOnWindow = false + }.InitTemplate(); + LiftRodButtonRo = new RecognitionObject + { + Name = "LiftRodButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", "lift_rod.png"), + RegionOfInterest = new Rect(CaptureRect.Width - CaptureRect.Width / 2, + CaptureRect.Height - CaptureRect.Height / 4, + CaptureRect.Width / 2, + CaptureRect.Height / 4), + Threshold = 0.7, + DrawOnWindow = false + }.InitTemplate(); - var w = (int)(140 * info.AssetScale); - var h = (int)(150 * info.AssetScale); - ExitFishingButtonRo = new RecognitionObject - { - Name = "ExitFishingButton", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", "exit_fishing.png"), - RegionOfInterest = new Rect(info.CaptureAreaRect.Width - w, - info.CaptureAreaRect.Height - h, - w, - h), - Threshold = 0.8, - DrawOnWindow = false - }.InitTemplate(); - } + var w = (int)(140 * AssetScale); + var h = (int)(150 * AssetScale); + ExitFishingButtonRo = new RecognitionObject + { + Name = "ExitFishingButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoFishing", "exit_fishing.png"), + RegionOfInterest = new Rect(CaptureRect.Width - w, + CaptureRect.Height - h, + w, + h), + Threshold = 0.8, + DrawOnWindow = false + }.InitTemplate(); } -} \ No newline at end of file +} diff --git a/BetterGenshinImpact/GameTask/AutoFishing/AutoFishingTrigger.cs b/BetterGenshinImpact/GameTask/AutoFishing/AutoFishingTrigger.cs index c8b9b8ed..835f8ca2 100644 --- a/BetterGenshinImpact/GameTask/AutoFishing/AutoFishingTrigger.cs +++ b/BetterGenshinImpact/GameTask/AutoFishing/AutoFishingTrigger.cs @@ -53,7 +53,7 @@ namespace BetterGenshinImpact.GameTask.AutoFishing public AutoFishingTrigger() { - _autoFishingAssets = new AutoFishingAssets(); + _autoFishingAssets = AutoFishingAssets.Instance; } public void Init() diff --git a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs index 73534101..993c6401 100644 --- a/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs +++ b/BetterGenshinImpact/GameTask/AutoGeniusInvokation/Assets/AutoGeniusInvokationAssets.cs @@ -1,160 +1,154 @@ -using BetterGenshinImpact.Core.Config; +using BetterGenshinImpact.Core.Recognition; +using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model; +using BetterGenshinImpact.GameTask.Model; using OpenCvSharp; -using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using BetterGenshinImpact.Core.Recognition; -using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Model; -namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Assets +namespace BetterGenshinImpact.GameTask.AutoGeniusInvokation.Assets; + +public class AutoGeniusInvokationAssets : BaseAssets { - 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; + + private 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() + ConfirmButtonRo = new RecognitionObject { - var info = TaskContext.Instance().SystemInfo; - ConfirmButtonRo = new RecognitionObject - { - Name = "ConfirmButton", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\确定.png"), - DrawOnWindow = false - }.InitTemplate(); - RoundEndButtonRo = new RecognitionObject - { - Name = "RoundEndButton", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("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.LoadAssetImage("AutoGeniusInvokation", @"other\元素调和.png"), - RegionOfInterest = new Rect(0, info.CaptureAreaRect.Height/2, info.CaptureAreaRect.Width, info.CaptureAreaRect.Height/2), - Threshold = 0.9, - DrawOnWindow = false - }.InitTemplate(); - ExitDuelButtonRo = new RecognitionObject - { - Name = "ExitDuelButton", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("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.LoadAssetImage("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.LoadAssetImage("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.LoadAssetImage("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.LoadAssetImage("AutoGeniusInvokation", @"other\角色死亡.png"), - DrawOnWindow = true - }.InitTemplate(); + Name = "ConfirmButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\确定.png"), + DrawOnWindow = false + }.InitTemplate(); + RoundEndButtonRo = new RecognitionObject + { + Name = "RoundEndButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\回合结束.png"), + RegionOfInterest = new Rect(0, 0, CaptureRect.Width / 5, CaptureRect.Height), + DrawOnWindow = true + }.InitTemplate(); + ElementalTuningConfirmButtonRo = new RecognitionObject + { + Name = "ElementalTuningConfirmButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\元素调和.png"), + RegionOfInterest = new Rect(0, CaptureRect.Height / 2, CaptureRect.Width, CaptureRect.Height / 2), + Threshold = 0.9, + DrawOnWindow = false + }.InitTemplate(); + ExitDuelButtonRo = new RecognitionObject + { + Name = "ExitDuelButton", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\退出挑战.png"), + RegionOfInterest = new Rect(0, CaptureRect.Height / 2, CaptureRect.Width / 2, CaptureRect.Height - CaptureRect.Height / 2), + DrawOnWindow = true + }.InitTemplate(); + InOpponentActionRo = new RecognitionObject + { + Name = "InOpponentAction", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\对方行动中.png"), + RegionOfInterest = new Rect(0, 0, CaptureRect.Width / 5, CaptureRect.Height), + DrawOnWindow = true + }.InitTemplate(); + EndPhaseRo = new RecognitionObject + { + Name = "EndPhase", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\回合结算阶段.png"), + RegionOfInterest = new Rect(0, 0, CaptureRect.Width / 5, CaptureRect.Height), + DrawOnWindow = true + }.InitTemplate(); + ElementalDiceLackWarningRo = new RecognitionObject + { + Name = "ElementalDiceLackWarning", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\元素骰子不足.png"), + RegionOfInterest = new Rect(CaptureRect.Width - CaptureRect.Width / 2, 0, + CaptureRect.Width / 2, CaptureRect.Height), + DrawOnWindow = true + }.InitTemplate(); + CharacterTakenOutRo = new RecognitionObject + { + Name = "CharacterTakenOut", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\角色死亡.png"), + DrawOnWindow = true + }.InitTemplate(); + CharacterDefeatedMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\角色被打败.png", ImreadModes.Grayscale); - CharacterDefeatedMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\角色被打败.png", ImreadModes.Grayscale); + InCharacterPickRo = new RecognitionObject + { + Name = "InCharacterPick", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\出战角色.png"), + RegionOfInterest = new Rect(CaptureRect.Width / 2, CaptureRect.Height / 2, + CaptureRect.Width - CaptureRect.Width / 2, + CaptureRect.Height - CaptureRect.Height / 2), + DrawOnWindow = true + }.InitTemplate(); + CharacterHpUpperRo = new RecognitionObject + { + Name = "CharacterHpUpper", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\角色血量上方.png"), + DrawOnWindow = true + }.InitTemplate(); - InCharacterPickRo = new RecognitionObject - { - Name = "InCharacterPick", - RecognitionType = RecognitionTypes.TemplateMatch, - TemplateImageMat = GameTaskManager.LoadAssetImage("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.LoadAssetImage("AutoGeniusInvokation", @"other\角色血量上方.png"), - DrawOnWindow = true - }.InitTemplate(); + CharacterStatusFreezeMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\角色状态_冻结.png", ImreadModes.Grayscale); + CharacterStatusDizzinessMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\角色状态_水泡.png", ImreadModes.Grayscale); + CharacterEnergyOnMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\满能量.png", ImreadModes.Grayscale); + // 投掷期间的骰子 + RollPhaseDiceMats = new Dictionary() + { + { "anemo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_anemo.png", ImreadModes.Color) }, + { "electro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_electro.png", ImreadModes.Color) }, + { "dendro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_dendro.png", ImreadModes.Color) }, + { "hydro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_hydro.png", ImreadModes.Color) }, + { "pyro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_pyro.png", ImreadModes.Color) }, + { "cryo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_cryo.png", ImreadModes.Color) }, + { "geo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_geo.png", ImreadModes.Color) }, + { "omni", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_omni.png", ImreadModes.Color) }, + }; - CharacterStatusFreezeMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\角色状态_冻结.png", ImreadModes.Grayscale); - CharacterStatusDizzinessMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\角色状态_水泡.png", ImreadModes.Grayscale); - CharacterEnergyOnMat = GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"other\满能量.png", ImreadModes.Grayscale); - - // 投掷期间的骰子 - RollPhaseDiceMats = new Dictionary() - { - { "anemo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_anemo.png", ImreadModes.Color) }, - { "electro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_electro.png", ImreadModes.Color) }, - { "dendro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_dendro.png", ImreadModes.Color) }, - { "hydro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_hydro.png", ImreadModes.Color) }, - { "pyro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_pyro.png", ImreadModes.Color) }, - { "cryo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_cryo.png", ImreadModes.Color) }, - { "geo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_geo.png", ImreadModes.Color) }, - { "omni", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\roll_omni.png", ImreadModes.Color) }, - }; - - // 主界面骰子 - ActionPhaseDiceMats = new Dictionary() - { - { "anemo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_anemo.png", ImreadModes.Color) }, - { "electro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_electro.png", ImreadModes.Color) }, - { "dendro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_dendro.png", ImreadModes.Color) }, - { "hydro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_hydro.png", ImreadModes.Color) }, - { "pyro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_pyro.png", ImreadModes.Color) }, - { "cryo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_cryo.png", ImreadModes.Color) }, - { "geo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_geo.png", ImreadModes.Color) }, - { "omni", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_omni.png", ImreadModes.Color) }, - }; - var msg = ActionPhaseDiceMats.Aggregate("", (current, kvp) => current + $"{kvp.Key.ToElementalType().ToChinese()}| "); - Debug.WriteLine($"默认骰子排序:{msg}"); - } + // 主界面骰子 + ActionPhaseDiceMats = new Dictionary() + { + { "anemo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_anemo.png", ImreadModes.Color) }, + { "electro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_electro.png", ImreadModes.Color) }, + { "dendro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_dendro.png", ImreadModes.Color) }, + { "hydro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_hydro.png", ImreadModes.Color) }, + { "pyro", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_pyro.png", ImreadModes.Color) }, + { "cryo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_cryo.png", ImreadModes.Color) }, + { "geo", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_geo.png", ImreadModes.Color) }, + { "omni", GameTaskManager.LoadAssetImage("AutoGeniusInvokation", @"dice\action_omni.png", ImreadModes.Color) }, + }; + var msg = ActionPhaseDiceMats.Aggregate("", (current, kvp) => current + $"{kvp.Key.ToElementalType().ToChinese()}| "); + Debug.WriteLine($"默认骰子排序:{msg}"); } -} \ No newline at end of file +} diff --git a/BetterGenshinImpact/GameTask/AutoSkip/Assets/AutoSkipAssets.cs b/BetterGenshinImpact/GameTask/AutoSkip/Assets/AutoSkipAssets.cs index 87dad844..452663d9 100644 --- a/BetterGenshinImpact/GameTask/AutoSkip/Assets/AutoSkipAssets.cs +++ b/BetterGenshinImpact/GameTask/AutoSkip/Assets/AutoSkipAssets.cs @@ -1,11 +1,12 @@ using System; using System.Collections.Generic; using BetterGenshinImpact.Core.Recognition; +using BetterGenshinImpact.GameTask.Model; using OpenCvSharp; namespace BetterGenshinImpact.GameTask.AutoSkip.Assets; -public class AutoSkipAssets +public class AutoSkipAssets : BaseAssets { public RecognitionObject StopAutoButtonRo; public RecognitionObject PlayingTextRo; @@ -30,15 +31,14 @@ public class AutoSkipAssets public Mat HangoutSelectedMat; public Mat HangoutUnselectedMat; - public AutoSkipAssets() + private AutoSkipAssets() { - var info = TaskContext.Instance().SystemInfo; StopAutoButtonRo = new RecognitionObject { Name = "StopAutoButton", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "stop_auto.png"), - RegionOfInterest = new Rect(0, 0, info.CaptureAreaRect.Width / 5, info.CaptureAreaRect.Height / 8), + RegionOfInterest = new Rect(0, 0, CaptureRect.Width / 5, CaptureRect.Height / 8), DrawOnWindow = true }.InitTemplate(); @@ -55,7 +55,7 @@ public class AutoSkipAssets { Name = "PlayingText", RecognitionType = RecognitionTypes.Ocr, - RegionOfInterest = new Rect((int)(100 * info.AssetScale), (int)(35 * info.AssetScale), (int)(85 * info.AssetScale), (int)(35 * info.AssetScale)), + RegionOfInterest = new Rect((int)(100 * AssetScale), (int)(35 * AssetScale), (int)(85 * AssetScale), (int)(35 * AssetScale)), OneContainMatchText = new List { "播", "番", "放", "中" @@ -63,7 +63,7 @@ public class AutoSkipAssets DrawOnWindow = true }.InitTemplate(); - OptionRoi = new Rect(info.CaptureAreaRect.Width / 2, 0, info.CaptureAreaRect.Width - info.CaptureAreaRect.Width / 2 - info.CaptureAreaRect.Width / 6, info.CaptureAreaRect.Height); + OptionRoi = new Rect(CaptureRect.Width / 2, 0, CaptureRect.Width - CaptureRect.Width / 2 - CaptureRect.Width / 6, CaptureRect.Height); OptionIconRo = new RecognitionObject { Name = "OptionIcon", @@ -103,7 +103,7 @@ public class AutoSkipAssets Name = "PageClose", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "page_close.png"), - RegionOfInterest = new Rect(info.CaptureAreaRect.Width - info.CaptureAreaRect.Width / 8, 0, info.CaptureAreaRect.Width / 8, info.CaptureAreaRect.Height / 8), + RegionOfInterest = new Rect(CaptureRect.Width - CaptureRect.Width / 8, 0, CaptureRect.Width / 8, CaptureRect.Height / 8), DrawOnWindow = true }.InitTemplate(); @@ -113,7 +113,7 @@ public class AutoSkipAssets Name = "Collect", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "collect.png"), - RegionOfInterest = new Rect(0, info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 3, info.CaptureAreaRect.Width / 4, info.CaptureAreaRect.Height / 3), + RegionOfInterest = new Rect(0, CaptureRect.Height - CaptureRect.Height / 3, CaptureRect.Width / 4, CaptureRect.Height / 3), DrawOnWindow = false }.InitTemplate(); ReRo = new RecognitionObject @@ -121,7 +121,7 @@ public class AutoSkipAssets Name = "Re", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "re.png"), - RegionOfInterest = new Rect(info.CaptureAreaRect.Width / 2, info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 4, info.CaptureAreaRect.Width / 4, info.CaptureAreaRect.Height / 4), + RegionOfInterest = new Rect(CaptureRect.Width / 2, CaptureRect.Height - CaptureRect.Height / 4, CaptureRect.Width / 4, CaptureRect.Height / 4), DrawOnWindow = false }.InitTemplate(); @@ -131,7 +131,7 @@ public class AutoSkipAssets Name = "Primogem", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "primogem.png"), - RegionOfInterest = new Rect(0, info.CaptureAreaRect.Height / 3, info.CaptureAreaRect.Width, info.CaptureAreaRect.Height / 3), + RegionOfInterest = new Rect(0, CaptureRect.Height / 3, CaptureRect.Width, CaptureRect.Height / 3), DrawOnWindow = false }.InitTemplate(); @@ -141,7 +141,7 @@ public class AutoSkipAssets Name = "SubmitExclamationIconRo", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "submit_icon_exclamation.png"), - RegionOfInterest = new Rect(0, 0, info.CaptureAreaRect.Width, info.CaptureAreaRect.Height / 4), + RegionOfInterest = new Rect(0, 0, CaptureRect.Width, CaptureRect.Height / 4), DrawOnWindow = false }.InitTemplate(); SubmitGoodsRo = new RecognitionObject @@ -151,7 +151,7 @@ public class AutoSkipAssets TemplateMatchMode = TemplateMatchModes.CCorrNormed, Threshold = 0.9, TemplateImageMat = GameTaskManager.LoadAssetImage("AutoSkip", "submit_goods.png"), - RegionOfInterest = new Rect(0, 0, info.CaptureAreaRect.Width / 2, info.CaptureAreaRect.Height / 3), + RegionOfInterest = new Rect(0, 0, CaptureRect.Width / 2, CaptureRect.Height / 3), DrawOnWindow = true, Use3Channels = true }.InitTemplate(); diff --git a/BetterGenshinImpact/GameTask/AutoWood/Assets/AutoWoodAssets.cs b/BetterGenshinImpact/GameTask/AutoWood/Assets/AutoWoodAssets.cs index e53ac8aa..72d4a850 100644 --- a/BetterGenshinImpact/GameTask/AutoWood/Assets/AutoWoodAssets.cs +++ b/BetterGenshinImpact/GameTask/AutoWood/Assets/AutoWoodAssets.cs @@ -1,17 +1,20 @@ using BetterGenshinImpact.Core.Recognition; +using BetterGenshinImpact.GameTask.Model; using OpenCvSharp; namespace BetterGenshinImpact.GameTask.AutoWood.Assets; -public class AutoWoodAssets +public class AutoWoodAssets : BaseAssets { public RecognitionObject TheBoonOfTheElderTreeRo; + // public RecognitionObject CharacterGuideRo; public RecognitionObject MenuBagRo; + public RecognitionObject ConfirmRo; public RecognitionObject EnterGameRo; - public AutoWoodAssets() + private AutoWoodAssets() { var info = TaskContext.Instance().SystemInfo; //「王树瑞佑」 @@ -60,4 +63,4 @@ public class AutoWoodAssets DrawOnWindow = false }.InitTemplate(); } -} \ No newline at end of file +} diff --git a/BetterGenshinImpact/GameTask/AutoWood/AutoWoodTask.cs b/BetterGenshinImpact/GameTask/AutoWood/AutoWoodTask.cs index dc101041..74bd4ea0 100644 --- a/BetterGenshinImpact/GameTask/AutoWood/AutoWoodTask.cs +++ b/BetterGenshinImpact/GameTask/AutoWood/AutoWoodTask.cs @@ -23,7 +23,7 @@ namespace BetterGenshinImpact.GameTask.AutoWood; /// public class AutoWoodTask { - private readonly AutoWoodAssets _assets = new(); + private readonly AutoWoodAssets _assets; private bool _first = true; @@ -39,6 +39,7 @@ public class AutoWoodTask var assetScale = TaskContext.Instance().SystemInfo.AssetScale; _clickOffset = new ClickOffset(captureArea.X, captureArea.Y, assetScale); _login3rdParty = new(); + _assets = AutoWoodAssets.Instance; } public void Start(WoodTaskParam taskParam) diff --git a/BetterGenshinImpact/GameTask/QuickSereniteaPot/Assets/QuickSereniteaPotAssets.cs b/BetterGenshinImpact/GameTask/QuickSereniteaPot/Assets/QuickSereniteaPotAssets.cs index 52c2ea22..e02aa71c 100644 --- a/BetterGenshinImpact/GameTask/QuickSereniteaPot/Assets/QuickSereniteaPotAssets.cs +++ b/BetterGenshinImpact/GameTask/QuickSereniteaPot/Assets/QuickSereniteaPotAssets.cs @@ -1,14 +1,15 @@ using BetterGenshinImpact.Core.Recognition; +using BetterGenshinImpact.GameTask.Model; using OpenCvSharp; namespace BetterGenshinImpact.GameTask.QuickSereniteaPot.Assets; -public class QuickSereniteaPotAssets +public class QuickSereniteaPotAssets : BaseAssets { public RecognitionObject BagCloseButtonRo; public RecognitionObject SereniteaPotIconRo; - public QuickSereniteaPotAssets() + private QuickSereniteaPotAssets() { var info = TaskContext.Instance().SystemInfo; diff --git a/BetterGenshinImpact/GameTask/QuickSereniteaPot/QuickSereniteaPotTask.cs b/BetterGenshinImpact/GameTask/QuickSereniteaPot/QuickSereniteaPotTask.cs index 74b11456..5b642151 100644 --- a/BetterGenshinImpact/GameTask/QuickSereniteaPot/QuickSereniteaPotTask.cs +++ b/BetterGenshinImpact/GameTask/QuickSereniteaPot/QuickSereniteaPotTask.cs @@ -12,7 +12,7 @@ namespace BetterGenshinImpact.GameTask.QuickSereniteaPot; public class QuickSereniteaPotTask { - private static readonly QuickSereniteaPotAssets _assets = new(); + private static readonly QuickSereniteaPotAssets _assets = QuickSereniteaPotAssets.Instance; private static void WaitForBagToOpen() { diff --git a/BetterGenshinImpact/GameTask/QuickTeleport/Assets/QuickTeleportAssets.cs b/BetterGenshinImpact/GameTask/QuickTeleport/Assets/QuickTeleportAssets.cs index 5312ac0c..899601a4 100644 --- a/BetterGenshinImpact/GameTask/QuickTeleport/Assets/QuickTeleportAssets.cs +++ b/BetterGenshinImpact/GameTask/QuickTeleport/Assets/QuickTeleportAssets.cs @@ -1,11 +1,11 @@ using BetterGenshinImpact.Core.Recognition; +using BetterGenshinImpact.GameTask.Model; using OpenCvSharp; using System.Collections.Generic; -using BetterGenshinImpact.Helpers; namespace BetterGenshinImpact.GameTask.QuickTeleport.Assets; -public class QuickTeleportAssets +public class QuickTeleportAssets : BaseAssets { public Rect MapChooseIconRoi; public List MapChooseIconRoList; @@ -16,14 +16,12 @@ public class QuickTeleportAssets public RecognitionObject MapCloseButtonRo; public RecognitionObject MapChooseRo; - public QuickTeleportAssets() + private QuickTeleportAssets() { - var info = TaskContext.Instance().SystemInfo; - - MapChooseIconRoi = new Rect((int)(1270 * info.AssetScale), - (int)(100 * info.AssetScale), - (int)(50 * info.AssetScale), - info.CaptureAreaRect.Height - (int)(200 * info.AssetScale)); + MapChooseIconRoi = new Rect((int)(1270 * AssetScale), + (int)(100 * AssetScale), + (int)(50 * AssetScale), + CaptureRect.Height - (int)(200 * AssetScale)); MapChooseIconRoList = new List { BuildMapChooseIconRo("TeleportWaypoint.png"), @@ -37,16 +35,16 @@ public class QuickTeleportAssets MapChooseIconGreyMatList = MapChooseIconRoList.ConvertAll(x => x.TemplateImageGreyMat ?? new Mat()); // 传送按钮宽泛的识别区域 - // RegionOfInterest = new Rect(info.CaptureAreaRect.Width - info.CaptureAreaRect.Width / 4, info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 8, info.CaptureAreaRect.Width / 4, info.CaptureAreaRect.Height / 8), + // RegionOfInterest = new Rect(CaptureRect.Width - CaptureRect.Width / 4, CaptureRect.Height - CaptureRect.Height / 8, CaptureRect.Width / 4, CaptureRect.Height / 8), TeleportButtonRo = new RecognitionObject { Name = "GoTeleport", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("QuickTeleport", "GoTeleport.png"), - RegionOfInterest = new Rect((int)(1440 * info.AssetScale), - (int)(979 * info.AssetScale), - (int)(60 * info.AssetScale), - (int)(60 * info.AssetScale)), + RegionOfInterest = new Rect((int)(1440 * AssetScale), + (int)(979 * AssetScale), + (int)(60 * AssetScale), + (int)(60 * AssetScale)), DrawOnWindow = false }.InitTemplate(); @@ -55,10 +53,10 @@ public class QuickTeleportAssets // Name = "MapScaleButton", // RecognitionType = RecognitionTypes.TemplateMatch, // TemplateImageMat = GameTaskManager.LoadAssetImage("QuickTeleport", "ScaleWithMask.png"), - // RegionOfInterest = new Rect((int)(30 * info.AssetScale), - // (int)(440 * info.AssetScale), - // (int)(40 * info.AssetScale), - // (int)(200 * info.AssetScale)), + // RegionOfInterest = new Rect((int)(30 * AssetScale), + // (int)(440 * AssetScale), + // (int)(40 * AssetScale), + // (int)(200 * AssetScale)), // UseMask = true, // DrawOnWindow = true //}.InitTemplate(); @@ -68,10 +66,10 @@ public class QuickTeleportAssets Name = "MapScaleButton", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("QuickTeleport", "MapScaleButton.png"), - RegionOfInterest = new Rect((int)(30 * info.AssetScale), - (int)(440 * info.AssetScale), - (int)(40 * info.AssetScale), - (int)(200 * info.AssetScale)), + RegionOfInterest = new Rect((int)(30 * AssetScale), + (int)(440 * AssetScale), + (int)(40 * AssetScale), + (int)(200 * AssetScale)), DrawOnWindow = false }.InitTemplate(); @@ -80,10 +78,10 @@ public class QuickTeleportAssets Name = "MapCloseButton", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("QuickTeleport", "MapCloseButton.png"), - RegionOfInterest = new Rect(info.CaptureAreaRect.Width - (int)(107 * info.AssetScale), - (int)(19 * info.AssetScale), - (int)(58 * info.AssetScale), - (int)(58 * info.AssetScale)), + RegionOfInterest = new Rect(CaptureRect.Width - (int)(107 * AssetScale), + (int)(19 * AssetScale), + (int)(58 * AssetScale), + (int)(58 * AssetScale)), DrawOnWindow = false }.InitTemplate(); @@ -92,17 +90,17 @@ public class QuickTeleportAssets Name = "MapChoose", RecognitionType = RecognitionTypes.TemplateMatch, TemplateImageMat = GameTaskManager.LoadAssetImage("QuickTeleport", "MapChoose.png"), - RegionOfInterest = new Rect(info.CaptureAreaRect.Width - (int)(480 * info.AssetScale), + RegionOfInterest = new Rect(CaptureRect.Width - (int)(480 * AssetScale), 0, - (int)(100 * info.AssetScale), - (int)(70 * info.AssetScale)), + (int)(100 * AssetScale), + (int)(70 * AssetScale)), DrawOnWindow = false }.InitTemplate(); } /// /// 宽泛的识别区域 - /// RegionOfInterest = new Rect(info.CaptureAreaRect.Width / 2, info.CaptureAreaRect.Height / 3, info.CaptureAreaRect.Width / 4, info.CaptureAreaRect.Height - info.CaptureAreaRect.Height / 3), + /// RegionOfInterest = new Rect(CaptureRect.Width / 2, CaptureRect.Height / 3, CaptureRect.Width / 4, CaptureRect.Height - CaptureRect.Height / 3), /// /// 限制小区域,防止误识别 /// @@ -127,4 +125,4 @@ public class QuickTeleportAssets return ro; } -} \ No newline at end of file +}