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 @@
-
-
+
+
-
-
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+