diff --git a/BetterGenshinImpact/Core/Config/AllConfig.cs b/BetterGenshinImpact/Core/Config/AllConfig.cs index 4c637853..7e6a0d42 100644 --- a/BetterGenshinImpact/Core/Config/AllConfig.cs +++ b/BetterGenshinImpact/Core/Config/AllConfig.cs @@ -7,6 +7,7 @@ using BetterGenshinImpact.GameTask.AutoGeniusInvokation; using BetterGenshinImpact.GameTask.AutoPick; using BetterGenshinImpact.GameTask.AutoSkip; using BetterGenshinImpact.GameTask.AutoWood; +using BetterGenshinImpact.GameTask.AutoMusicGame; using BetterGenshinImpact.GameTask.QuickTeleport; using BetterGenshinImpact.Service.Notification; using CommunityToolkit.Mvvm.ComponentModel; @@ -132,6 +133,11 @@ public partial class AllConfig : ObservableObject /// 自动战斗配置 /// public AutoFightConfig AutoFightConfig { get; set; } = new(); + + /// + /// 自动乐曲配置 - 千音雅集 + /// + public AutoMusicGameConfig AutoMusicGameConfig { get; set; } = new(); /// /// 自动秘境配置 @@ -193,6 +199,7 @@ public partial class AllConfig : ObservableObject AutoWoodConfig.PropertyChanged += OnAnyPropertyChanged; AutoFightConfig.PropertyChanged += OnAnyPropertyChanged; AutoDomainConfig.PropertyChanged += OnAnyPropertyChanged; + AutoMusicGameConfig.PropertyChanged += OnAnyPropertyChanged; ScriptConfig.PropertyChanged += OnAnyPropertyChanged; PathingConditionConfig.PropertyChanged += OnAnyPropertyChanged; diff --git a/BetterGenshinImpact/GameTask/AutoMusicGame/Assets/1920x1080/music_canorus.png b/BetterGenshinImpact/GameTask/AutoMusicGame/Assets/1920x1080/music_canorus.png new file mode 100644 index 00000000..53ffab3f Binary files /dev/null and b/BetterGenshinImpact/GameTask/AutoMusicGame/Assets/1920x1080/music_canorus.png differ diff --git a/BetterGenshinImpact/GameTask/AutoMusicGame/Assets/AutoMusicAssets.cs b/BetterGenshinImpact/GameTask/AutoMusicGame/Assets/AutoMusicAssets.cs index b78b03a6..d2c5587b 100644 --- a/BetterGenshinImpact/GameTask/AutoMusicGame/Assets/AutoMusicAssets.cs +++ b/BetterGenshinImpact/GameTask/AutoMusicGame/Assets/AutoMusicAssets.cs @@ -11,6 +11,10 @@ public class AutoMusicAssets : BaseAssets public RecognitionObject BtnPause; public RecognitionObject AlbumMusicComplate; public RecognitionObject BtnList; + public RecognitionObject MusicCanorusLevel1; + public RecognitionObject MusicCanorusLevel2; + public RecognitionObject MusicCanorusLevel3; + public RecognitionObject MusicCanorusLevel4; private AutoMusicAssets() { @@ -42,5 +46,39 @@ public class AutoMusicAssets : BaseAssets TemplateImageMat = GameTaskManager.LoadAssetImage(@"AutoMusicGame", "btn_list.png"), RegionOfInterest = CaptureRect.CutRightBottom(0.4, 0.2), }.InitTemplate(); + + var musicCanorusTemplateImageMat = GameTaskManager.LoadAssetImage(@"AutoMusicGame", "music_canorus.png"); + MusicCanorusLevel1 = new RecognitionObject + { + Name = "MusicCanorusLevel1", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = musicCanorusTemplateImageMat, + RegionOfInterest = new Rect((int)(450 * AssetScale), (int)(430 * AssetScale), (int)(200 * AssetScale), + (int)(60 * AssetScale)), + }.InitTemplate(); + MusicCanorusLevel2 = new RecognitionObject + { + Name = "MusicCanorusLevel2", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = musicCanorusTemplateImageMat, + RegionOfInterest = new Rect((int)(450 * AssetScale), (int)(520 * AssetScale), (int)(200 * AssetScale), + (int)(60 * AssetScale)), + }.InitTemplate(); + MusicCanorusLevel3 = new RecognitionObject + { + Name = "MusicCanorusLevel3", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = musicCanorusTemplateImageMat, + RegionOfInterest = new Rect((int)(450 * AssetScale), (int)(610 * AssetScale), (int)(200 * AssetScale), + (int)(60 * AssetScale)), + }.InitTemplate(); + MusicCanorusLevel4 = new RecognitionObject + { + Name = "MusicCanorusLevel4", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = musicCanorusTemplateImageMat, + RegionOfInterest = new Rect((int)(450 * AssetScale), (int)(690 * AssetScale), (int)(200 * AssetScale), + (int)(60 * AssetScale)), + }.InitTemplate(); } } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoMusicGame/AutoAlbumTask.cs b/BetterGenshinImpact/GameTask/AutoMusicGame/AutoAlbumTask.cs index d025dde7..883712c6 100644 --- a/BetterGenshinImpact/GameTask/AutoMusicGame/AutoAlbumTask.cs +++ b/BetterGenshinImpact/GameTask/AutoMusicGame/AutoAlbumTask.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using BetterGenshinImpact.GameTask.AutoMusicGame.Assets; @@ -39,62 +40,95 @@ public class AutoAlbumTask(AutoMusicGameParam taskParam) : ISoloTask { throw new Exception("当前未处于专辑界面,请在专辑界面运行本任务"); } - - // 12个音乐 - for (int i = 0; i < 13; i++) + + var musicLevel = TaskContext.Instance().Config.AutoMusicGameConfig.MusicLevel; + if (string.IsNullOrEmpty(musicLevel)) { + musicLevel = "传说"; + } + Logger.LogInformation("自动音游乐曲难度等级:{Text}", musicLevel); + + // 遍历4个难度等级 + var defaultDifficultyLevels = new[] + { + ("普通", 480, 600, AutoMusicAssets.Instance.MusicCanorusLevel1), + ("困难", 800, 600, AutoMusicAssets.Instance.MusicCanorusLevel2), + ("大师", 1150, 600, AutoMusicAssets.Instance.MusicCanorusLevel3), + ("传说", 1400, 600, AutoMusicAssets.Instance.MusicCanorusLevel4) + }; + var difficultyLevels = defaultDifficultyLevels; + if (musicLevel != "所有") + { + difficultyLevels = [Array.Find(defaultDifficultyLevels, level => level.Item1 == musicLevel)]; + } - using var doneRa = CaptureToRectArea().Find(AutoMusicAssets.Instance.AlbumMusicComplate); - if (doneRa.IsExist()) + foreach (var (difficultyName, xPos, yPos, canorusAsset) in difficultyLevels) + { + Logger.LogInformation("开始演奏{Difficulty}难度的乐曲", difficultyName); + + // 每个难度12首曲子 + for (int i = 0; i < 13; i++) { - Logger.LogInformation("当前乐曲{Num}所有奖励已领取,切换下一首", i + 1); + using var canoraRa = CaptureToRectArea().Find(canorusAsset); + if (canoraRa.IsExist()) + { + Logger.LogInformation("乐曲{Num} - {Difficulty}级别:已完成【大音天籁】,切换下一首", i + 1, difficultyName); + GameCaptureRegion.GameRegion1080PPosClick(310, 220); + await Delay(800, ct); + continue; + } + + Logger.LogInformation("第{Num}首{Difficulty}难度的乐曲:{Message}", i + 1, difficultyName, "没有完成【大音天籁】"); + + // 点击确认按钮 + Bv.ClickWhiteConfirmButton(CaptureToRectArea()); + await Delay(800, ct); + + // 选择难度 + GameCaptureRegion.GameRegion1080PPosClick(xPos, yPos); + await Delay(200, ct); + + // 开始演奏 + Bv.ClickWhiteConfirmButton(CaptureToRectArea()); + await Delay(500, ct); + + using var cts = new CancellationTokenSource(); + ct.Register(cts.Cancel); + + // 演奏结束检查任务 + var checkTask = Task.Run(async () => + { + while (!cts.Token.IsCancellationRequested) + { + await Delay(5000, ct); // 每5秒检查一次 + using var listRa = CaptureToRectArea().Find(AutoMusicAssets.Instance.BtnList); + if (listRa.IsExist()) + { + Logger.LogDebug("检测到返回列表按钮,演奏结束"); + listRa.Click(); + return; + } + } + }, cts.Token); + + // 演奏任务 + var musicTask = _autoMusicGameTask.StartWithOutInit(cts.Token); + + // 等待任意一个任务完成 + await Task.WhenAny(checkTask, musicTask); + await cts.CancelAsync(); + + Logger.LogInformation("第{Num}首{Difficulty}难度乐曲演奏完成", i + 1, difficultyName); + await Delay(2000, ct); + + await Bv.WaitUntilFound(AutoMusicAssets.Instance.UiLeftTopAlbumIcon, ct); + Logger.LogDebug("切换到下一首乐曲"); GameCaptureRegion.GameRegion1080PPosClick(310, 220); await Delay(800, ct); - continue; } - - Logger.LogInformation("当前乐曲{Num}存在未领取奖励,前往演奏", i + 1); - Bv.ClickWhiteConfirmButton(CaptureToRectArea()); - await Delay(800, ct); - // 点击传说 - GameCaptureRegion.GameRegion1080PPosClick(1400, 600); - await Delay(200, ct); - // 演奏 - Bv.ClickWhiteConfirmButton(CaptureToRectArea()); - await Delay(500, ct); - - CancellationTokenSource cts = new(); - ct.Register(cts.Cancel); - - // 演奏结束检查任务 - var checkTask = Task.Run(async () => - { - while (!cts.Token.IsCancellationRequested) - { - await Delay(5000, ct); // n秒检查一次 - using var listRa = CaptureToRectArea().Find(AutoMusicAssets.Instance.BtnList); - if (listRa.IsExist()) - { - listRa.Click(); - return; - } - } - }, cts.Token); - - // 演奏任务 - var musicTask = _autoMusicGameTask.StartWithOutInit(cts.Token); - - // 等待任意一个任务完成 - await Task.WhenAny(checkTask, musicTask); - await cts.CancelAsync(); - Logger.LogInformation("当前乐曲{Num}演奏结束", i + 1); - await Delay(2000, ct); - await Bv.WaitUntilFound(AutoMusicAssets.Instance.UiLeftTopAlbumIcon, ct); - Logger.LogInformation("切换下一首"); - GameCaptureRegion.GameRegion1080PPosClick(310, 220); - await Delay(800, ct); + Logger.LogInformation("完成{Difficulty}难度所有乐曲的演奏", difficultyName); } Logger.LogInformation("当前专辑所有乐曲演奏结束"); diff --git a/BetterGenshinImpact/GameTask/AutoMusicGame/AutoMusicGameConfig.cs b/BetterGenshinImpact/GameTask/AutoMusicGame/AutoMusicGameConfig.cs new file mode 100644 index 00000000..d7083ed5 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoMusicGame/AutoMusicGameConfig.cs @@ -0,0 +1,17 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using System; +using System.Collections.Generic; + +namespace BetterGenshinImpact.GameTask.AutoMusicGame; + + +/// +/// 千音雅集配置 +/// +[Serializable] +public partial class AutoMusicGameConfig : ObservableObject +{ + // 乐曲级别 + [ObservableProperty] + private string _musicLevel = ""; +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/Common/Job/GoToAdventurersGuildTask.cs b/BetterGenshinImpact/GameTask/Common/Job/GoToAdventurersGuildTask.cs index a1d10bd4..32019d37 100644 --- a/BetterGenshinImpact/GameTask/Common/Job/GoToAdventurersGuildTask.cs +++ b/BetterGenshinImpact/GameTask/Common/Job/GoToAdventurersGuildTask.cs @@ -80,7 +80,7 @@ public class GoToAdventurersGuildTask await new ReturnMainUiTask().Start(ct); // 结束后重新打开 - await Delay(200, ct); + await Delay(1000, ct); var ra = CaptureToRectArea(); if (!Bv.FindFAndPress(ra, "凯瑟琳")) { diff --git a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml index 46c35a15..8f419032 100644 --- a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml +++ b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml @@ -1155,16 +1155,20 @@ - - + + - - + + + + + + + - - - + + + + + + + + + + + + + + + + + +