From 8a41148ba6b74cea3842902e74635ab628d8d0ce Mon Sep 17 00:00:00 2001 From: FishmanTheMurloc <162452111+FishmanTheMurloc@users.noreply.github.com> Date: Sat, 16 Aug 2025 13:51:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=93=E5=B1=95=E8=87=AA=E5=8A=A8=E5=90=83?= =?UTF-8?q?=E8=8D=AF=EF=BC=8C=E5=9F=BA=E4=BA=8E=E5=9B=BE=E6=A0=87=E8=AF=86?= =?UTF-8?q?=E5=88=AB=20(#2051)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/Config/PathingPartyConfig.cs | 14 +- .../Core/Script/Dependence/Dispatcher.cs | 81 +++++++- .../AutoArtifactSalvageTask.cs | 72 ++++++-- .../GameTask/AutoEat/AutoEatConfig.cs | 24 +++ .../GameTask/AutoEat/AutoEatParam.cs | 17 +- .../GameTask/AutoEat/AutoEatTask.cs | 96 +++++++--- .../GameTask/AutoEat/FoodEffectType.cs | 23 +++ .../1920x1080/bag_artifact_unchecked.png | Bin 3793 -> 3637 bytes .../bag_characterdevelopmentitem_checked.png | Bin 0 -> 1918 bytes ...bag_characterdevelopmentitem_unchecked.png | Bin 0 -> 1767 bytes .../Assets/1920x1080/bag_food_checked.png | Bin 0 -> 2323 bytes .../Assets/1920x1080/bag_food_unchecked.png | Bin 0 -> 2121 bytes .../1920x1080/bag_furnishing_checked.png | Bin 0 -> 2090 bytes .../1920x1080/bag_furnishing_unchecked.png | Bin 0 -> 1918 bytes .../Assets/1920x1080/bag_gadget_checked.png | Bin 0 -> 2063 bytes .../Assets/1920x1080/bag_gadget_unchecked.png | Bin 0 -> 1916 bytes .../Assets/1920x1080/bag_material_checked.png | Bin 0 -> 2216 bytes .../1920x1080/bag_material_unchecked.png | Bin 0 -> 2081 bytes .../1920x1080/bag_preciousitem_checked.png | Bin 0 -> 2038 bytes .../1920x1080/bag_preciousitem_unchecked.png | Bin 0 -> 1852 bytes .../Assets/1920x1080/bag_quest_checked.png | Bin 0 -> 1729 bytes .../Assets/1920x1080/bag_quest_unchecked.png | Bin 0 -> 1604 bytes .../Assets/1920x1080/bag_weapon_checked.png | Bin 0 -> 2155 bytes .../Assets/1920x1080/bag_weapon_unchecked.png | Bin 0 -> 2062 bytes .../Common/Element/Assets/ElementAssets.cs | 174 +++++++++++++++++- .../GetGridIcons/GetGridIconsConfig.cs | 5 +- .../GameTask/GetGridIcons/GetGridIconsTask.cs | 45 +++-- .../GetGridIcons/GridIconsAccuracyTestTask.cs | 58 +++++- .../Helpers/ScriptObjectConverter.cs | 4 +- .../View/Pages/TaskSettingsPage.xaml | 7 +- .../Pages/View/ScriptGroupConfigView.xaml | 139 ++++++++++++-- .../Pages/TaskSettingsPageViewModel.cs | 20 +- 32 files changed, 674 insertions(+), 105 deletions(-) create mode 100644 BetterGenshinImpact/GameTask/AutoEat/FoodEffectType.cs create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_characterdevelopmentitem_checked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_characterdevelopmentitem_unchecked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_food_checked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_food_unchecked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_furnishing_checked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_furnishing_unchecked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_gadget_checked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_gadget_unchecked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_material_checked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_material_unchecked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_preciousitem_checked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_preciousitem_unchecked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_quest_checked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_quest_unchecked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_weapon_checked.png create mode 100644 BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_weapon_unchecked.png diff --git a/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs b/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs index 1a69d149..59356af3 100644 --- a/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs +++ b/BetterGenshinImpact/Core/Config/PathingPartyConfig.cs @@ -1,9 +1,10 @@ -using CommunityToolkit.Mvvm.ComponentModel; +using BetterGenshinImpact.GameTask; +using BetterGenshinImpact.GameTask.AutoEat; +using BetterGenshinImpact.GameTask.AutoFight; +using CommunityToolkit.Mvvm.ComponentModel; using System; using System.Collections.Generic; using System.Text.Json.Serialization; -using BetterGenshinImpact.GameTask; -using BetterGenshinImpact.GameTask.AutoFight; namespace BetterGenshinImpact.Core.Config; @@ -96,6 +97,13 @@ public partial class PathingPartyConfig : ObservableObject [ObservableProperty] private bool _autoEatEnabled = false; + /// + /// 自动吃食物配置 + /// 供JS脚本使用 + /// + [ObservableProperty] + private AutoEatConfig _autoEatConfig = new(); + //在连续执行时是否隐藏 [ObservableProperty] private bool _hideOnRepeat = false; diff --git a/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs b/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs index 9a281126..3e7b89d8 100644 --- a/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs +++ b/BetterGenshinImpact/Core/Script/Dependence/Dispatcher.cs @@ -1,19 +1,26 @@ -using BetterGenshinImpact.Core.Script.Dependence.Model; +using BetterGenshinImpact.Core.Config; +using BetterGenshinImpact.Core.Script.Dependence.Model; using BetterGenshinImpact.GameTask; -using BetterGenshinImpact.ViewModel.Pages; -using System; -using System.Threading.Tasks; using BetterGenshinImpact.GameTask.AutoDomain; +using BetterGenshinImpact.GameTask.AutoEat; using BetterGenshinImpact.GameTask.AutoFishing; -using BetterGenshinImpact.GameTask.AutoWood; using BetterGenshinImpact.GameTask.AutoGeniusInvokation; using BetterGenshinImpact.GameTask.AutoPathing.Handler; +using BetterGenshinImpact.GameTask.AutoWood; +using BetterGenshinImpact.Helpers; +using BetterGenshinImpact.ViewModel.Pages; +using Microsoft.ClearScript; +using Microsoft.Extensions.Logging; +using System; using System.Threading; +using System.Threading.Tasks; namespace BetterGenshinImpact.Core.Script.Dependence; public class Dispatcher { + private readonly ILogger _logger = App.GetLogger(); + private object _config = null; public Dispatcher(object config) @@ -127,7 +134,7 @@ public class Dispatcher // 如果没有自定义令牌,就使用全局令牌 cancellationToken = CancellationContext.Instance.Cts.Token; } - + // 根据名称执行任务 switch (soloTask.Name) { @@ -162,7 +169,69 @@ public class Dispatcher await new AutoFishingTask(AutoFishingTaskParam.BuildFromSoloTaskConfig(soloTask.Config)).Start( cancellationToken); break; + case "AutoEat": + string? foodName = soloTask.Config == null ? null : ScriptObjectConverter.GetValue((ScriptObject)soloTask.Config, "foodName", null); + FoodEffectType? foodEffectType = soloTask.Config == null ? null : (FoodEffectType?)ScriptObjectConverter.GetValue((ScriptObject)soloTask.Config, "foodEffectType", null); + if (foodName != null && foodEffectType != null) + { + throw new NotSupportedException("不能同时指定foodName和foodEffectType"); + } + + if (foodName == null) + { + if (foodEffectType != null) + { + PathingPartyConfig? pathingPartyConfig = _config as PathingPartyConfig; + if (pathingPartyConfig == null) + { + throw new NotSupportedException("foodEffectType参数需要调度器配置,请在调度器下使用"); + } + else + { + switch (foodEffectType) + { + case FoodEffectType.ATKBoostingDish: + foodName = pathingPartyConfig.AutoEatConfig.DefaultAtkBoostingDishName; + if (foodName == null) + { + _logger.LogInformation("缺少{Text}配置,跳过吃Buff", "默认的攻击类料理"); + return; + } + break; + case FoodEffectType.AdventurersDish: + foodName = pathingPartyConfig.AutoEatConfig.DefaultAdventurersDishName; + if (foodName == null) + { + _logger.LogInformation("缺少{Text}配置,跳过吃Buff", "默认的冒险类料理"); + return; + } + break; + case FoodEffectType.DEFBoostingDish: + foodName = pathingPartyConfig.AutoEatConfig.DefaultDefBoostingDishName; + if (foodName == null) + { + _logger.LogInformation("缺少{Text}配置,跳过吃Buff", "默认的防御类料理"); + return; + } + break; + default: + throw new NotSupportedException("JS脚本入参错误:错误的foodEffectType"); + } + } + } + } + + var autoEatConfig = TaskContext.Instance().Config.AutoEatConfig; + await new AutoEatTask(new AutoEatParam() + { + CheckInterval = autoEatConfig.CheckInterval, + EatInterval = autoEatConfig.EatInterval, + ShowNotification = autoEatConfig.ShowNotification, + FoodName = foodName + }).Start(cancellationToken); + + break; default: throw new ArgumentException($"未知的任务名称: {soloTask.Name}", nameof(soloTask.Name)); } diff --git a/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs index 83728f3a..ca5f1737 100644 --- a/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs +++ b/BetterGenshinImpact/GameTask/AutoArtifactSalvage/AutoArtifactSalvageTask.cs @@ -1,4 +1,4 @@ -using BetterGenshinImpact.GameTask.Common.BgiVision; +using BetterGenshinImpact.GameTask.Common.BgiVision; using System; using System.Diagnostics; using System.Threading; @@ -35,7 +35,6 @@ public class AutoArtifactSalvageTask : ISoloTask { private readonly ILogger logger = App.GetLogger(); private readonly InputSimulator input = Simulation.SendInput; - private readonly ReturnMainUiTask _returnMainUiTask = new(); private CancellationToken ct; @@ -51,7 +50,7 @@ public class AutoArtifactSalvageTask : ISoloTask private readonly int? maxNumToCheck; - private bool returnToMainUi = true; + private readonly bool returnToMainUi = true; public AutoArtifactSalvageTask(int star, string? regularExpression = null, int? maxNumToCheck = null) { @@ -75,12 +74,51 @@ public class AutoArtifactSalvageTask : ISoloTask this.returnToMainUi = returnToMainUi; } - public async Task Start(CancellationToken ct) + public static async Task OpenBag(GridScreenName gridScreenName, InputSimulator input, ILogger logger, CancellationToken ct) { - this.ct = ct; - if (returnToMainUi) + RecognitionObject? recognitionObjectChecked; + RecognitionObject? recognitionObjectUnchecked; + + switch (gridScreenName) { - await _returnMainUiTask.Start(ct); + case GridScreenName.Weapons: + recognitionObjectChecked = ElementAssets.Instance.BagWeaponChecked; + recognitionObjectUnchecked = ElementAssets.Instance.BagWeaponUnchecked; + break; + case GridScreenName.Artifacts: + recognitionObjectChecked = ElementAssets.Instance.BagArtifactChecked; + recognitionObjectUnchecked = ElementAssets.Instance.BagArtifactUnchecked; + break; + case GridScreenName.CharacterDevelopmentItems: + recognitionObjectChecked = ElementAssets.Instance.BagCharacterDevelopmentItemChecked; + recognitionObjectUnchecked = ElementAssets.Instance.BagCharacterDevelopmentItemUnchecked; + break; + case GridScreenName.Food: + recognitionObjectChecked = ElementAssets.Instance.BagFoodChecked; + recognitionObjectUnchecked = ElementAssets.Instance.BagFoodUnchecked; + break; + case GridScreenName.Materials: + recognitionObjectChecked = ElementAssets.Instance.BagMaterialChecked; + recognitionObjectUnchecked = ElementAssets.Instance.BagMaterialUnchecked; + break; + case GridScreenName.Gadget: + recognitionObjectChecked = ElementAssets.Instance.BagGadgetChecked; + recognitionObjectUnchecked = ElementAssets.Instance.BagGadgetUnchecked; + break; + case GridScreenName.Quest: + recognitionObjectChecked = ElementAssets.Instance.BagQuestChecked; + recognitionObjectUnchecked = ElementAssets.Instance.BagQuestUnchecked; + break; + case GridScreenName.PreciousItems: + recognitionObjectChecked = ElementAssets.Instance.BagPreciousItemChecked; + recognitionObjectUnchecked = ElementAssets.Instance.BagPreciousItemUnchecked; + break; + case GridScreenName.Furnishings: + recognitionObjectChecked = ElementAssets.Instance.BagFurnishingChecked; + recognitionObjectUnchecked = ElementAssets.Instance.BagFurnishingUnchecked; + break; + default: + throw new NotSupportedException($"背包不支持的界面:{gridScreenName.GetDescription()}"); } // B键打开背包 @@ -89,12 +127,11 @@ public class AutoArtifactSalvageTask : ISoloTask var openBagSuccess = await NewRetry.WaitForAction(() => { - // 选择圣遗物 using var ra = CaptureToRectArea(); - using var artifactBtn = ra.Find(ElementAssets.Instance.BagArtifactChecked); + using var artifactBtn = ra.Find(recognitionObjectChecked); if (artifactBtn.IsEmpty()) { - using var artifactBtn2 = ra.Find(ElementAssets.Instance.BagArtifactUnchecked); + using var artifactBtn2 = ra.Find(recognitionObjectUnchecked); if (artifactBtn2.IsExist()) { artifactBtn2.Click(); @@ -118,12 +155,23 @@ public class AutoArtifactSalvageTask : ISoloTask if (!openBagSuccess) { - logger.LogError("未找到背包中圣遗物菜单按钮,打开背包失败"); + logger.LogError("未找到背包中{name}菜单按钮,打开背包失败", gridScreenName.GetDescription()); return; } await Delay(800, ct); + } + + public async Task Start(CancellationToken ct) + { + this.ct = ct; + if (returnToMainUi) + { + await new ReturnMainUiTask().Start(ct); + } + + await OpenBag(GridScreenName.Artifacts, this.input, this.logger, this.ct); // 点击分解按钮打开分解界面 using var ra2 = CaptureToRectArea(); @@ -217,7 +265,7 @@ public class AutoArtifactSalvageTask : ISoloTask if (returnToMainUi) { - await _returnMainUiTask.Start(ct); + await new ReturnMainUiTask().Start(ct); } } } diff --git a/BetterGenshinImpact/GameTask/AutoEat/AutoEatConfig.cs b/BetterGenshinImpact/GameTask/AutoEat/AutoEatConfig.cs index 1e0c1292..5fab8ad9 100644 --- a/BetterGenshinImpact/GameTask/AutoEat/AutoEatConfig.cs +++ b/BetterGenshinImpact/GameTask/AutoEat/AutoEatConfig.cs @@ -33,4 +33,28 @@ public partial class AutoEatConfig : ObservableObject /// [ObservableProperty] private int _eatInterval = 2000; + + /// + /// 测试食物名称 + /// + [ObservableProperty] + private string? _testFoodName; + + /// + /// 默认的攻击类料理名称 + /// + [ObservableProperty] + private string? _defaultAtkBoostingDishName; + + /// + /// 默认的冒险类料理名称 + /// + [ObservableProperty] + private string? _defaultAdventurersDishName; + + /// + /// 默认的防御类料理名称 + /// + [ObservableProperty] + private string? _defaultDefBoostingDishName; } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoEat/AutoEatParam.cs b/BetterGenshinImpact/GameTask/AutoEat/AutoEatParam.cs index 1777886d..4a0ec76d 100644 --- a/BetterGenshinImpact/GameTask/AutoEat/AutoEatParam.cs +++ b/BetterGenshinImpact/GameTask/AutoEat/AutoEatParam.cs @@ -22,16 +22,9 @@ public class AutoEatParam : BaseTaskParam /// public int EatInterval { get; set; } - public AutoEatParam() - { - SetDefault(); - } - - public void SetDefault() - { - var config = TaskContext.Instance().Config.AutoEatConfig; - ShowNotification = config.ShowNotification; - CheckInterval = config.CheckInterval; - EatInterval = config.EatInterval; - } + /// + /// 食物名称 + /// 如果传空就使用便携营养袋,否则进入背包查找对应食物并使用 + /// + public string? FoodName { get; set; } } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoEat/AutoEatTask.cs b/BetterGenshinImpact/GameTask/AutoEat/AutoEatTask.cs index 90b151ba..b78b9036 100644 --- a/BetterGenshinImpact/GameTask/AutoEat/AutoEatTask.cs +++ b/BetterGenshinImpact/GameTask/AutoEat/AutoEatTask.cs @@ -1,13 +1,19 @@ using BetterGenshinImpact.Core.Recognition.OCR; using BetterGenshinImpact.Core.Simulator; using BetterGenshinImpact.Core.Simulator.Extensions; +using BetterGenshinImpact.GameTask.AutoArtifactSalvage; using BetterGenshinImpact.GameTask.Common.BgiVision; using BetterGenshinImpact.GameTask.Common.Element.Assets; +using BetterGenshinImpact.GameTask.Common.Job; +using BetterGenshinImpact.GameTask.GetGridIcons; using BetterGenshinImpact.GameTask.Model; -using BetterGenshinImpact.Service.Notification; -using BetterGenshinImpact.Service.Notification.Model.Enum; +using BetterGenshinImpact.GameTask.Model.Area; +using BetterGenshinImpact.GameTask.Model.GameUI; +using Fischless.WindowsInput; using Microsoft.Extensions.Logging; +using Microsoft.ML.OnnxRuntime; using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using static BetterGenshinImpact.GameTask.Common.TaskControl; @@ -24,6 +30,8 @@ public class AutoEatTask : BaseIndependentTask, ISoloTask private readonly AutoEatParam _taskParam; private readonly AutoEatConfig _config; + private readonly ILogger _logger = App.GetLogger(); + private readonly InputSimulator _input = Simulation.SendInput; private CancellationToken _ct; public AutoEatTask(AutoEatParam taskParam) @@ -37,33 +45,75 @@ public class AutoEatTask : BaseIndependentTask, ISoloTask _ct = ct; Init(); - Logger.LogInformation("自动吃药任务启动"); + _logger.LogInformation("自动吃药任务启动"); - if (!IsTakeFood()) + if (String.IsNullOrWhiteSpace(_taskParam.FoodName)) { - Logger.LogWarning("未装备 \"{Tool}\",无法启用自动吃药功能", "便携营养袋"); - return; - } + if (!IsTakeFood()) + { + _logger.LogWarning("未装备 \"{Tool}\",无法启用自动吃药功能", "便携营养袋"); + return; + } - try - { - await AutoEatLoop(); + try + { + await AutoEatLoop(); + } + catch (Exception e) + { + _logger.LogError(e, "自动吃药任务发生异常"); + throw; + } + finally + { + _logger.LogInformation("自动吃药任务结束"); + } } - catch (Exception e) + else { - Logger.LogError(e, "自动吃药任务发生异常"); - throw; - } - finally - { - Logger.LogInformation("自动吃药任务结束"); + _logger.LogInformation("打开背包寻找{name}……", _taskParam.FoodName); + await new ReturnMainUiTask().Start(ct); + await AutoArtifactSalvageTask.OpenBag(GridScreenName.Food, _input, _logger, _ct); + + using InferenceSession session = GridIconsAccuracyTestTask.LoadModel(out Dictionary prototypes); + + using var ra0 = CaptureToRectArea(); + GridScreenParams gridParams = GridScreenParams.Templates[GridScreenName.Food]; + var gridRoi = gridParams.GetRect(ra0); + GridScreen gridScreen = new GridScreen(gridRoi, gridParams, _logger, _ct); + bool isAte = false; + await foreach (ImageRegion itemRegion in gridScreen) + { + var result = GridIconsAccuracyTestTask.Infer(itemRegion.SrcMat, session, prototypes); + string predName = result.Item1; + if (predName == _taskParam.FoodName) + { + // 点击item + itemRegion.Click(); + await Delay(300, ct); + // 点击确定 + using var ra = ra0.Find(ElementAssets.Instance.BtnWhiteConfirm); + if (ra.IsExist()) + { + ra.Click(); + } + _logger.LogInformation("吃了一份{name},真香!", predName); + isAte = true; + break; + } + } + if (!isAte) + { + _logger.LogInformation("没有找到{name}", _taskParam.FoodName); + } + await new ReturnMainUiTask().Start(ct); } } private void Init() { - Logger.LogInformation("→ {Text} 检测间隔: {Interval}ms", "自动吃药,", _config.CheckInterval); - Logger.LogInformation("→ {Text} 吃药间隔: {Interval}ms", "自动吃药,", _config.EatInterval); + _logger.LogInformation("→ {Text} 检测间隔: {Interval}ms", "自动吃药,", _config.CheckInterval); + _logger.LogInformation("→ {Text} 吃药间隔: {Interval}ms", "自动吃药,", _config.EatInterval); } /// @@ -87,8 +137,8 @@ public class AutoEatTask : BaseIndependentTask, ISoloTask // 模拟按键 "Z" 使用便携营养袋 Simulation.SendInput.SimulateAction(GIActions.QuickUseGadget); lastEatTime = now; - - Logger.LogInformation("检测到红血,自动吃药"); + + _logger.LogInformation("检测到红血,自动吃药"); } } @@ -101,7 +151,7 @@ public class AutoEatTask : BaseIndependentTask, ISoloTask } catch (Exception e) { - Logger.LogDebug(e, "自动吃药检测时发生异常"); + _logger.LogDebug(e, "自动吃药检测时发生异常"); await Delay(1000, _ct); // 异常时稍作等待 } } @@ -124,7 +174,7 @@ public class AutoEatTask : BaseIndependentTask, ISoloTask } catch (Exception e) { - Logger.LogDebug(e, "检测便携营养袋时发生异常"); + _logger.LogDebug(e, "检测便携营养袋时发生异常"); return false; } } diff --git a/BetterGenshinImpact/GameTask/AutoEat/FoodEffectType.cs b/BetterGenshinImpact/GameTask/AutoEat/FoodEffectType.cs new file mode 100644 index 00000000..8b774ffe --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoEat/FoodEffectType.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; + +namespace BetterGenshinImpact.GameTask.AutoEat +{ + public enum FoodEffectType + { + [Description("恢复类料理")] + RecoveryDish, + [Description("攻击类料理")] + ATKBoostingDish, + [Description("冒险类料理")] + AdventurersDish, + [Description("防御类料理")] + DEFBoostingDish, + [Description("药剂")] + Potion, + [Description("其他")] + Other + } +} diff --git a/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_artifact_unchecked.png b/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_artifact_unchecked.png index 7d15f5369f45ec2abc23120ad321750032d3d1e8..9f5f2d202a4d14e1dba08bcae858601fb32e473f 100644 GIT binary patch delta 3621 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 delta 3779 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 diff --git a/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_characterdevelopmentitem_checked.png b/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_characterdevelopmentitem_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a8ab48b606d0207cda320deb2e0d6fdd8605a9 GIT binary patch literal 1918 zcmbu3X*Ao38pi*T*jmwq=nPUz8bxfi-YC7cqCyy&6jjt#qKX7HV=2-lwO1-HI`sht+ln5puM*C($b(z?mhRMd*<^z@2B@X@AG?~eSa-GCGTfB`VC=>H{rLO@Um!t*p> z00_bd0)xSP0^tApyamE9AP5J9#DvA=5t=3_4+*rEDLKv|t%eu)5yV6Ng~hw(6XZE+ zaDbQPH1Bmb%@xj4xzzA4%P+>7V+8vNMvR z2I&MJ#)z_X{j+G9B(tk;&X@0=4|_O%O;es|dl~V-F^xc24+vMswSXzKMFaXfm7}-k z!V3>=3o?sKJtIbET}`*_e7)+kqra{s#lBj&Ztj0O8gi{KDkcHq*gfN-=x&1DMi8$- zz9Ti>zpv$3`MrGVYID=rD*+K7IWQzu(Jjm-2$kelOW1<20ud+t6V^Bobp+MhH;@fp zZUW!A@aTYU!RZi=j1IRy>%&RU>NykO^tJZZ4g7$EcSzVo+wIGRG~rQ;I7~N8E4Iu#vFmf2Th-zw z3%50QZcu2repmO_6?KE;UNT0mPOrjV=eD+ovqA=Fst#3r-==vQm5M3!bSoNbx-E4K z1YTs{luGWm*3;9Z*XmLR8Tt}h`I0c<9{06iXEdqnh{NYTY`jn5n%uD}_ju}W<#9DL zeLKXg7$!OSQ%yb&SI%!ykdOX$Zat`iNmnk(!XuO7%N;GA)Ql49l91y0mS|+Ep+O8@ zwf3mkdc*$&%SGsA*3tg!TS^P6PvokqFi5ReC@rc#Fh4PzDR&<$@yniF3Z7_NQ-~kE zGGXACx#ilmI?%B~HUt-!yR?#aFs;mGwy=VULV`RxFVJePQ1Pzxh<23fMN6N~xeYM# z6bCH(>wa*aLH0I2xiMxbnjJWQAd(*w)Rz;TxwG@_U;7cd;Vo5;j^>+n9?QDe0%9Vb zz9o5X$y%bG3ng%NoYY>Yf3uXvR+Tl3hg_XBrc|b3nKMOqKU`!CHT0c4>Hv@7FlW@hdV;w~&FD#Z}J zRTCcfmc@TMJE^rS6=|a_3AJHZ5nKdC0fOL^@>IyX(&Hs&$4fgLpq9S z31319bBiCO%zx?LCWw(u^i5Vs+N1~t(%fk3NAgfdgK}xF-vE4hueJ{Nsq8dEQjF%M zkd`#s%vxP0|3f-puoG$zd&X+qn%;RozGs;1Ts`YOpNK&Zu-HnASKp5s$-@(|=o{)v zWz59qStlzmV9-dIGUm&5J*Sc~f85)Os-F|mGr+ckfREaM>9(K(^#>Jsxf>*VI=-W= z%bb>PTRq0Qm;M-cvM})3=mTSZDzzo=t9Uh~Ah)ZiqG3v7AT_wDR)cF}2Ye`g;a=)b zU61~wlDzqXJiSDd4dUk47TP~hU z2kedDNmfhpAKH%DxvuC%??yLQy2Wp+Doe>l!bBa&saj4YxBreltr1gXiD+lF(LARr ziNu>d4Mn{IRBb3X7R3~NREol|4!(qj+3DuwaLxVcwK&EI9+8L? zLs>}qEs;bsQ%otA8EBDM<3&Q)j?0>g8068arNgL-cA7LSmu6qR4{HCu#}V&r^N%zf zRB-KME3W)(5Vosf`8+L*pykwDb?Tw2iPwb((7txUuZrBIVf*R%3P*BV?w*Td zrH1Zqr?P&PGUd>D)amKtxl(d=k|aCn{-uJzl2s2C88^>22M?*N{mUQM2?dOX*)2HH z!O9tthQ#coJ%P$(h)9WbpI1EVI9m;Px(vAzwav7Q*S-&{-SctAJvLi_$8kD2cOyt^ zYH_~II%G}jwb$*%`g7a@VhUu})q|@OG`19GV{IJe5}ZSEz4V4OA^SsINhl(=hw$;^ zdf~hERqoT^F`3g9PJPyqUOveoZ|5)1anbn=J!(+HoAkVuW~PNf%4Sh&%CuMNZ?ebJ Fe*$2%Er9?4 literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_characterdevelopmentitem_unchecked.png b/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_characterdevelopmentitem_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..f8158cae3d9514f89f57ffa500e17d209bf317c9 GIT binary patch literal 1767 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 literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_gadget_checked.png b/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_gadget_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..84445a353b1e52e4bc161565e7c6ddaddf52efd5 GIT binary patch literal 2063 zcmbu9`#;lr9LK-2xwI&gF^!6dX5^B)Tu(F-!`!nNzyx#BU z(L~StcX+bAi%Mic-2pmXFyebEI|#D86Rwfduq_QLJac#m z$9acgmEv%?rTVXDZSN8UeQ#z;S5z~I`)KPe$`Yw1=bJ8%Hq&&aC6IFp@>9N(q3ZqGTJ#wa0uQ?57G=0JR5=XXAIR2ubBB+iPO z7(r!veZYDx)QW&T>ymT1aA7C=8i-;@qp_XKwtLyuISX&oazsUK>J@BuBp>WLM@2c63T=GC07 zwAc|08KL#D*P8uV`jN#CQeu$Y(de7}MdWx^-Iw`_S4Tr?N-o{|sp*~_+1levXFl)v z8PCJ0m_!f1pM%Shf&SP#l(_7Onsj7Iz8V*fL$f(Aii=dwYwvHKG+oUbob2~j(SOlT z>Sj6wdJav7sYuzRKnKWCT27?Er0c~^q~!Zd*=gqBnl@?X zkrTSNRJD7r9d^s=UtzNw5iGu0zp>@hdS$hfHF_7X)%KR}mkPtDNivRlRg zs<6p}LSB}m_qoQmG&AW`5^vD^dt=QybX@%IgXvjGUF-0@GU?F{1I`?~Q(l=fuMfB} z?w9IM9U-Fp_)zPQw^vfQaH7GSW5Sfsq5QlSTHkn<60KVh@K(DpW40{TT*`G15`7Uj zIEXx=qkDSV=){k=a?%3KshBu|90(ewJ1)^2Fw)vtyJ;`rFCjbIL&jzh_w93s%l+PX z)h!b)qfTrUu5h|U0K(Q%N1kin)|ZT+&uQpZ@M&!(3w@LRdyP4(qk;8$4P6g0jdzkY zWYZ0#F1^7&6Mr5pCZY1oe1QX!Y`+_(+`FWHum>M|y%33)sBDOx$hX{7U}`$}KSQ6o zkh1AO?lx@4PD9*LveWp_s05sQ`xotk6T@-DqlH(d&K18)nxT1Gd%i+b&C9f@B53(?K_XK=3C`=^ZLQCUIGB3yjn+`6>yO7^>r-W$Xfg>g@Zgnu$}DZB;eK+0v+w zGrsc{0c~Rgyz*0130v(G!=GMhg+3u{uqak)bquQkl_LrQ1?FUAm*k6H?4;|cQB>N(>Xm%{}XFJrSt403(f zaeg}ulpF%%YQqh)wmy#uVwjcz{I{yY*$5y0Gr_H_@MaF@S84G1pcv@28~N7vX!1VA_~f6{&bD=0d;(S`c^*Y2G{;oZW?4iW!v>i2(d literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_gadget_unchecked.png b/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_gadget_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..96de9da30ddc7cfee5f60ab3f2d39dd35b3a9912 GIT binary patch literal 1916 zcmbu3`9IVN7{|XeV>D9q&5V2HTt_3umB~>UY>vEgU%5spBNm%m(^_(bQ5Y&jju>fj z4AC;VhH;cwGvvO;Mzd0m7BxHDFZ&1V=XpIpJg?9D`8*GAf;SHwv#~mF1wbGG0O1$F zn*uEO)Bn@IA^$Idzs-9EfCxYhP=i4f0VoK8fe>B~AjAI?{_nT{N$?Ot=rBxxZ>k>y zAOcV*zhMCEI{k%D1cZ(w6~q)#7&8f-a6T#p0bu+i|D^yh0XPH@ZCpwT}_jT2VRiHleOiPOzKa#-*VZx=|~MOApW*lPHJ0h(|474 zqCbOnHw*M@Eo}E@RvRcPDug`657isB;kc`L)-S(Ce4&l!CsnfI_Da!a8I8gWzpS*h zG*)lbZ6pqdTmSZm?YqCb1Ywq34(`w^kn7XBQpp(@4v}|V*xM^(YJ3|Zi%B6ONl2T@ zbWhdRfxoS+>Sz0uP(=EVoav3zlZCB1fgZL`WSx@(PWIS96+&`v(LPhcvyH>0(>o*L zsh_3>CyaOWb|$WA>V~iz#vBPof_G)v2h(B__bAzx);D`=|71qfsb$w!PD(% zwvxvjjq3WiU2JCmmu#*Wy@O7tYi#^6D8Xzl@-e>JX4myuxMpfUN<=^R-O?vtxnQRQ zCCPq{Qci@RRuJc^?G!RI>>4|1$`;+g0H*`HqXreQ#h6SF8y6{IoTnfwE7V-sCHb<8 zxhw^8&03u@wcG+v)LuVI%p$b!eISIiRec)0BU;*zU)>HX_7%4)a~k@l(e{(N%WJW7 z9Iv?~3)IDdKJ15p68AzAEyMcCEkr`OlSmXLDlnP#&C>lqz|j8oFr3i-pB+wE1*u5Hi;u= zB(A$V&G|@9*Kjx}#$Zv$Zu$*YtK}(L+4C+g#;&3O73~@Y{Z$Zof5P3o<+T7X44JEjEq<2@f5vBb)WJ#jnz6*2**y%%#2TesH90Mo&cjMdf|{ik?v zU_0WmKA1S8sCB=BVF;&v#l@a&h!uX6Fa*PSuSVJ0`UeS&Pm0^8v+WW*3k$gyaXRwk z7m706z$Q!yg$mkTn3^{&eld0X%P>iNO14bxje&u0S9Kr=TW)Y!DbG)NZBj4e!A7)ggx@No%04l~%QikdV9_MU^AMAYXb7y% zxfcHLN8M};{7*)agEjWqZp^E&4}*|l?9uMH1R}bx!AK!wzm`O@h;|G6qVTGxPB|f0 zS;!G-;aFdXpG{*^9-nTxvGlk|bn&A0?+%cM6`L~XNa5uEU(S^X2^e15d9Pa`YYk;K zlmwaDy{`yc!IsqSWtGbq5pIfX7C5es82G^IN=H`4Ey!n>iv@a1wo#ibf(2xcV2JDk^5wr}?CFTZGBnKrcGGjr+$U zQ-_QElMDwByvf$VInM~Fm7Gn4-L6uaH7$$#+CfyPv5)-oLxheHG`ZyJVy6)?kv6F+ zS-MA`AO`I(dB`mBfTyWyP0eR5QhXYb@7ymPfjHyp1~u|r{b~?&#A5bZY5wPmYRi$X zbwzuEJ1c8A=0WBs){SVY>WNc~iG3|kPTN){K{~Y@ZQLgHQ@c{pEx(#O$i$s$lKM1j zE2DOlnwnbj^6aRA6w9&ut%|FAMW7x^uX>Y=FL6h>5xi;x0i<*`8+aiF|7xFZd{g=ba}zEPIJ4od(6>p zMILXm>JFrJn`Feq#72svWBl;Fh%S&TSwz&zPoPi>Y?x~vw#)78f^SMm@7J6)>97ZAM;~d5)8Cyh-OHO$RJv>po4zte^uS94> zCdZs6hgzxWfG|swq=S?<9`Ad-*L%JHKi~VW`}%(G&-dP*+I|bjxe$m100aU6(9Qtc zuL1j=?eFQ|kiSRRx!&#t5HLU!(1n0702l#+AVAv#fC>PBL1H_P{!fxp07Oh&0w%rV z>d65hC>R8Rf*=sF|0EzFFm%U705GJayaHNZ5rfB)f_CpwH@LBrM}Yt^BO}#E ziD*m}yGL_S>&4?CtS&ASs^L#Tq_{I_jLJp7;UC9VU)*}C zKq9@Y3JpQ>O*jSW;uJNUPLFn~>CaFbCl%jC`^Pb8yp|i(m6<#2IAO!KJT?XCT~;pN z{Y(m2Nx+FPwI9<&dJ z`=lFOk8+GRMXINQRcR{W&0Xwz^>K4-wx%GKLmA!7L!4js8gz}RE;Xm!U{Reu5;19* z5Dz?^%T4GF(TuIbo0)pLv1+Poo#+C)!9?wR>9k(CZPh#@6Xf1v)Ryi!&CTPk`U2@`T`dibt}qOw;-?cGLAe@x$fO)aTWjy!{3@lG^i zTF^|l@LI}fevWD+!!&P2g@PM!h=ia|I&Iu|J$jILpR*u&rjZDR+up2=kD-mTkDSc0 z^v(~SDPI3RV#^I^;Bg{4PJ4(9Nyxi;k4(1#?b=xlzJYizJjP!BdY8?&oUX>_o9{SQ zgM=falD!du)X5FWBSQ}324#QR#Vg(V9Qo)8zc{D>J%^g$=H$B5hm?IjNCbaxna++L zH`cn$U&3LMDq3UMGWMQKsGQ2;1{YpByibD-OIvd+lGe|y|K*sVM_Hns_o2$QRi3s; zk-7vL>F8e(hGH z$<|ihV3(H^%CP!25HCXwvS+$)eJZQ5iX4y>N*j#i;9yB_}T&sP^I} zR0tkL^_=7y=bVd-=!egjVKq75p)qSK#W1tf95_QwzVmb$-BIlauj&l$3w^h4obxWX_Q+3$8RZEmY0!zdvJTb@+)bx~Qm5(`SD+GJ^Pm zLJSV<0IK9-T-sW>fwHevDKg_oVp5i+n`mxSomVJm>}+$h{ee>6L_M*ttElw)dC<6R zx}&4{LdC7Im1BA$sJ9?DdGBZH8+$R)ex0X`pyYCeMMrf5j-97s1~qg17wxoP|FY^o zJ}h+HH=FY5u?bu2%D#LR)l!))D2!9YmbjfDSxcX`ljb^mSUXpMwKotIzf;QH=#lM5 zecv}f&r&23^2-eBk-P!@=}?TYyn)hWcQJK zO8yXf?g^#zq!44@@+T>;FFZ~_&k9HT@0NLX+v0xjlThTh-}7+1(P;S+mSKqfQTTM< z;q#nh#`s)Jbeo1;-W}qkXu7DVJW7A20&O*Z`xdKCgc9a9qbPvhFpcbp@2AhhCMNKH zha3DSrG(~qoF~CXy5!D!J>dZT4OTk qWP+PgDNdCRq&A%ILzS9fp#K9x2G|PO0*7uc z4Nw3G3jR++{!IXbAW+zrt!My_*rupyri8_jRg&>`_M2q&&3|G4F9bjVFa);cFBb#! zrV9WA!yvH#`hdU?GyvVEX$G@X#GYg(D>roE@MQ0)jY&XmGY%NNxjq0Os2b*obDoQ4 zarr|H6XM!Cr|wr1jw<5_VL%GAY4F)kyy-)$^FFD^PpbtD!N}Wr#(f`HlXpmZxG0Oo z=97M3ewG#~D3Pdh+7h5zHnONu)N=_H@|)>TIHNuA&%=s_h%NIdBq<7 zwU$v*le8jZa8*^dwzQ@Qv6v*dvD|foxN=5DFl9}~>Ja6Web(Z6!-?ZlF^bi0!?S@3 z5_wWmUf)YP<+t8l<#PT9E9hHWquE29@g2mT5SksgU-lP?WJ~ZNp?^@3On- zV){x(xH+89cg*I6%eQhb2A7Gy&a5YA_4G>3LYE2^B#uRqm%=S&yZZCQ%wC0-PqTA! z>1$h)l^hROoLHvaB4o7C`Y3jmpcBX%!rL9FC>mk%`L6G7^=Acy3szrNrIVjm9Vy)} zN1#+MczT(1G}C$mh`X3xUBYW#|JSuAMUi%bPuVdo3y<}_EiolJ+?1${g6@J*Iy>hw zm9lVzEfr)1T6<}=BN>;t?yM>EwGerXiSUhnrsYRZ_;po*zHTm;7qEV$`~r#svKSsaH)>jz1$9Oo zr7R$<9jP%+48rr-82_hMQA&>tjA=?==lj!*-`QRu&yaF;8EulWT1SQ?0)EI9L3Z+b ztPzi4?~J8i{+yUQeUo=7(Sx2r|8`mJLk?@~SEE$hy>@>f{K^9z^R#78+%2D1ea!#D zs;v%|Z(_s-$29$d=q)qR^028|#yb0kpnO`q7(!%}7JuJZ=8`QR{w77I@2NU;Y~06L zD$SPm-1U!bXii95@a35lU!g~Dn`ForbH;jUu*L)<$0v^!Ek=6s#O_4V*KqgM*wxPW zeWa_n+=4PL?Q&;1=XiGL$DN2vMIu!P_qYNB#!85<(FTBFvm6S$2{Z2TQ&@uLfEGd7 z<;a4K2KAWH={eR%^Nz8&K*Q69W8XYm%gh4Iv#Fo>(`WABK0jc!S@KsZtTNEt{d4P< z?J%Uc^|*L_a8YAvhnjX5Tv%2V$$9WJ^{NAG*B&+Y{$ZVpl6Ya+?ka(fV2R&u*x?l1 z^9&cPVIuSNSeBP>BrZLK0LvQYLl?y7!t&j`XFYEUJpu_*-eV z*nh^X+?lOn+q8P0=3qTDa_WUrafQKahmKoAD49Hco^SZ+c2U@_!5@#>=Eu*^j_kb$ zuM1`Ng$6_$?{8EoEO@~EU(vS95&yb8{)#b#-k)w?(${hS9brEWY>aBqZs!rqngRj!2_tFD)qA}gIJYxCq zp$x=;ECR}En^fFJWhP*ePo(KBuREJO8#~5Z4bGoj!NUiP3ioO!2R8QT)=gE|Qi2ZK zC_)Wg*alaAA_nrfs45-ey}1jFbsGi#Khj(>WlcT^YxXT3)Ez~rIIA26#;k<(DPrH- zyaAK5I~I-WAosgx&pn_zXfgsh4+k5{79Q>NkEi6Ev}(JN=5sM1f|_~C46jGVS>dM# zVhkP6+3ej@f1t24sFJI>+roSKmZUA=eOt43H*?Z(yK04i`3;XjpI`hL$rSO?T7LZm z!?2(>dpYNj31r;K9|36ebk*owvkld=@;qY^|C;E6J#q&)QE1PXQJo-AVt@DR^h-$s ze|H_dL>$+t$AH$tQY6Kk>DcPTw*hS0e3YrLaiptSPL)|`73!2$Ti68o+n}u9^p%v{Oa?^^6gP`LOoGwrd+e Id&9=WpQ`L_6951J literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_preciousitem_checked.png b/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_preciousitem_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..275f4bb313257ae55b11108bc2bf8a0f65244369 GIT binary patch literal 2038 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 literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_quest_checked.png b/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_quest_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..3c85a86733627e4cee093033e36bac16c7537bf8 GIT binary patch literal 1729 zcmbu4eLT|%9LIm#&*tGu+iVM~jH%EPHjgFNGFeo6%0m`&A+|}&zn`z-nc@Y2pwnDv00aU6 z5aj@hae%7a{+~WU{vSb^Ry+WZYJd@71VRh|C=vo9A&PDQ2LK=d1%ZD_T?48L!qk)| z2?0PrC)YB2?7OGU~oVcsiuz7LhED9DcJ2~UQE5Vjsd}t5mlxP=|TYLe}O7+ z00sqBmEHj)0EIwd5EYGoE`9W;%yqYEuFIV~QgJ%?>eh&MlhD`KspssuKU4ex!aiuRfO5h@<5?LAPA2p~Dtj&cTP z<927pzsj9>7TK2RlLFq}l`$P8RO@?Eq%qJR9dmU2>|nNptP>!Vnt!!GwT`%u;pE-3 z<06t`#&=$s3_K}*Ah^0?$rxg$)CuuuuTZ2pL5E+u`A4%Smv*3B?_6?shL3) z)SVrUTl}~a$L3d5oL~xytk5an2Oo_9|9q|hM0jp**$|gbCOk$|Fsp4n@0wsTn20&A zCes^Js(Cv~Eq@LEyu^o(C+ z34(B%*Hzh5&JO1E%@&(rXvc|%v&^em+KD|uqb4jye&;p_+cZ(q}}lvM1CUP_~2Y*1wU&wJ($v9t(2KT>TuR@hUJ`_{gF)pe8| z!l9hr+ya!RyDLAmd;*I0PE6>`GwE?#r|IW`}4?+Q9b;lw{KOv6MkK-onY0IqJGvgL~gS53>+kGG@)@iKL9$K||I9I}OeS&v9^omN< zL(}aA3&bRLQr8w)#Hq(G>+4>ocJ6=Wie0GxX}NPb=QGD<4>C(D|LOKN3*VIt2jSD? zk-dywe!=!BkF~1xbj^O_*|!_Kx9p|H_0_Zw$gfBT!$sfH-nSKt=R}d@6wRMjd(V0}rHDSx_0)Xi!QOl^AJ5F8 zb);ud>SA=}wbgZUnnvF3PP9T84gQ&SVUrgr)-zzo=Q$UtsjOyePfy;FuibBQUW?@Y zroY(d(5L`PPRenl#7(z==9qws{p@V+r4ub4h)RAfdCTrKp;_m{Dw4Uvtc!UC;v;jj#)lHI*GtHEI3#hjdEv8YCBQe%SX z?_WsCe*QSqZ@LO-k&-a0yuq#MR<1e$(Sivp?{!UQy`y1oXg7adTs>@Nih5F~@rPk_ zVkFziyh;18I z`z*TEt7Pcnjf1yXE(!O-`Hmobi+`!>hvLgk7W{2Qbm&8fnnM;)pH6gKldMhoGl=9M XR368$2-=OJy}Nb{hlW!Xr98+ literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_quest_unchecked.png b/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_quest_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2138e59c99d03147bd6a78faf2d9b769f5affd GIT binary patch literal 1604 zcmbu5`9IVN7{|Y3e4VqCF^)lDP#DcJ?ofzf#(hnNnKY}(8aEB~vYL>vU07#yFz%zn zH3&t7O<6|>89Bn#D`z>v?DX1w?fwCMo}ZrA=Xu`G=k@SLc~gLdoej|jfIt8M!Y_a~ z4p{NKAJccpj}iFWyk`JH1keC9pb!;600Ds_AiNGh9sr;KlppkeiHbo5ML@o1AOS$2 z0)m1dAPW970TFMC1V#Tf`9wj4B!C8SRHTZfYnZBDY<{(ru7O)zDyycAHwM7?;RFy+ z1YizK%x$%A2%XQt<6~&+_{8jyj7aY`%-5>4^7s}m`e2c2krrLE+}Fn-u>Fmx_x@=w zN0PWS*d!}4Fr2btuNi`_md@ULP@%s1xIWb>0CPIBvu@zZL9FcQi*#JR#&JohBBirM z%69;i)&4m9F71Yfp#cXFiF_b0u9U?~3CoI2$D5+U?r8{BfTvvvp6= zs6=xtqrcCsh`C&H{AnP%BbxB>(DheZ35+E@h0(%5;bZn0i6vOKM44oiN>$q^yfETp z&>@2evAMj;PwQlw8pJlcvx;jMUfpXb9LY7o7FWg^^@~FLbB=ZUvSR|u7cSMx(;JxG zM*i+-`*b<4X_6gX(2(06YsG1{Rc=Xsqbep{L5I}>#y`A#ylty<^SLcXaVR;-YlqZnVf&)$9b-k-Qt=fg zZ|K_{?ynW@pBW><)1i2RW^12*N$vF-8u|zzD+g8zMNz5js5AN|7h#RFmw&NPfM3!Y z<}7)G$X?m2aB=Qx!pS#0K*5(*^bw!w{=n0~^>Q$uspt(?@556a)ne{-X$zxU?> z_@`62zLnTuw2N7ec>%J-zop|+BG-f{jMjA|PYmV~`zC6Q(x@c;4-S}Pbw-57ouaw( z`I7i^lN8S+mn{8VmpnV6_ptKNvsUa1B~mGLl?>$p>Y}k^mZw<|(?hXhXp1oU9Czd4 z6lp7+OnuF&Pd;iA0S;ZRG7EDZKw8KzK6`$@d`FK56h55}#f;qO)b=xVPS6jlCm?II znCA@TyynACZ9N_?fSEe{A>Q3<)Or%i%(5JGr}nkgZb!5u$L?@RJ8w7SgB)ah4j<4T zp`2itEEeD87~^i;3un_fBJuRv;a#*Jr4R*cHWhv`yF0U1a23XAmR%mzp4ZtePN7qr zTbb6|vZwu2JQwVvu*Qw44eBb&zV0Wpf{u6^sN&@a8Bf4$EW64vpi)1L?4|%T7-@DC z3KZbp{N@-@)BUOBT={4Zimi8bxrpXbOmli7=ld5a|DeJvo7XcsnG_=Yu~X9QLuXcn z8^KkF3dMsyh>DBP4Szz2DM$x&qLxkxEiY4Nq8C2+{eD*>Q%x;XlG84`z4u02WBKL;<9V2)5-pvxl6Wh1pOH(n52b^JfpH__wy;*f@ z^_snRn=!eLMi;Ce^o)M_Vn?u9A4<>B2wh9GDdRY#xt6YA+AUAOQ2C_xQd-hC>Eu)= ztO()}TWeH;Q)w7~!1_fhm%s#VUC8O)WpfA7`&4b! z32bX@yweP^te`X|tvJ2SZUA0(x=cM(8KvV(Rs-)R!7b;N`VKXhO-3C>E>M`fw|@f^ Cb%OT* literal 0 HcmV?d00001 diff --git a/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_weapon_checked.png b/BetterGenshinImpact/GameTask/Common/Element/Assets/1920x1080/bag_weapon_checked.png new file mode 100644 index 0000000000000000000000000000000000000000..c92fecc70820bd134b7bdf22fa1b309b640da6af GIT binary patch literal 2155 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 public RecognitionObject Keyreduce; public RecognitionObject Keyincrease; + public RecognitionObject BagWeaponUnchecked; + public RecognitionObject BagWeaponChecked; public RecognitionObject BagArtifactUnchecked; public RecognitionObject BagArtifactChecked; + public RecognitionObject BagCharacterDevelopmentItemUnchecked; + public RecognitionObject BagCharacterDevelopmentItemChecked; + public RecognitionObject BagFoodUnchecked; + public RecognitionObject BagFoodChecked; + public RecognitionObject BagMaterialUnchecked; + public RecognitionObject BagMaterialChecked; + public RecognitionObject BagGadgetUnchecked; + public RecognitionObject BagGadgetChecked; + public RecognitionObject BagQuestUnchecked; + public RecognitionObject BagQuestChecked; + public RecognitionObject BagPreciousItemUnchecked; + public RecognitionObject BagPreciousItemChecked; + public RecognitionObject BagFurnishingUnchecked; + public RecognitionObject BagFurnishingChecked; public RecognitionObject BtnArtifactSalvage; public RecognitionObject BtnArtifactSalvageConfirm; @@ -245,7 +261,26 @@ public class ElementAssets : BaseAssets DrawOnWindow = false }.InitTemplate(); - // 分解圣遗物 + // 背包武器 + BagWeaponUnchecked = new RecognitionObject + { + Name = "BagWeaponUnchecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_weapon_unchecked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.87, + DrawOnWindow = false + }.InitTemplate(); + BagWeaponChecked = new RecognitionObject + { + Name = "BagWeaponChecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_weapon_checked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.8, + DrawOnWindow = false + }.InitTemplate(); + // 背包圣遗物 BagArtifactUnchecked = new RecognitionObject { Name = "BagArtifactUnchecked", @@ -264,6 +299,141 @@ public class ElementAssets : BaseAssets Threshold = 0.8, DrawOnWindow = false }.InitTemplate(); + // 背包养成道具 + BagCharacterDevelopmentItemUnchecked = new RecognitionObject + { + Name = "BagCharacterDevelopmentItemUnchecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_characterdevelopmentitem_unchecked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.87, + DrawOnWindow = false + }.InitTemplate(); + BagCharacterDevelopmentItemChecked = new RecognitionObject + { + Name = "BagCharacterDevelopmentItemChecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_characterdevelopmentitem_checked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.8, + DrawOnWindow = false + }.InitTemplate(); + // 背包食物 + BagFoodUnchecked = new RecognitionObject + { + Name = "BagFoodUnchecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_food_unchecked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.87, + DrawOnWindow = false + }.InitTemplate(); + BagFoodChecked = new RecognitionObject + { + Name = "BagFoodChecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_food_checked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.8, + DrawOnWindow = false + }.InitTemplate(); + // 背包材料 + BagMaterialUnchecked = new RecognitionObject + { + Name = "BagMaterialUnchecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_material_unchecked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.87, + DrawOnWindow = false + }.InitTemplate(); + BagMaterialChecked = new RecognitionObject + { + Name = "BagMaterialChecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_material_checked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.8, + DrawOnWindow = false + }.InitTemplate(); + // 背包小道具 + BagGadgetUnchecked = new RecognitionObject + { + Name = "BagGadgetUnchecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_gadget_unchecked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.87, + DrawOnWindow = false + }.InitTemplate(); + BagGadgetChecked = new RecognitionObject + { + Name = "BagGadgetChecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_gadget_checked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.8, + DrawOnWindow = false + }.InitTemplate(); + // 背包任务 + BagQuestUnchecked = new RecognitionObject + { + Name = "BagQuestUnchecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_quest_unchecked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.87, + DrawOnWindow = false + }.InitTemplate(); + BagQuestChecked = new RecognitionObject + { + Name = "BagQuestChecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_quest_checked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.8, + DrawOnWindow = false + }.InitTemplate(); + // 背包贵重道具 + BagPreciousItemUnchecked = new RecognitionObject + { + Name = "BagPreciousItemUnchecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_preciousitem_unchecked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.87, + DrawOnWindow = false + }.InitTemplate(); + BagPreciousItemChecked = new RecognitionObject + { + Name = "BagPreciousItemChecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_preciousitem_checked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.8, + DrawOnWindow = false + }.InitTemplate(); + // 背包摆设 + BagFurnishingUnchecked = new RecognitionObject + { + Name = "BagFurnishingUnchecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_furnishing_unchecked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.87, + DrawOnWindow = false + }.InitTemplate(); + BagFurnishingChecked = new RecognitionObject + { + Name = "BagFurnishingChecked", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = GameTaskManager.LoadAssetImage(@"Common\Element", "bag_furnishing_checked.png"), + RegionOfInterest = CaptureRect.CutTop(0.1), + Threshold = 0.8, + DrawOnWindow = false + }.InitTemplate(); + + // 分解圣遗物 BtnArtifactSalvage = new RecognitionObject { Name = "BtnArtifactSalvage", diff --git a/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsConfig.cs b/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsConfig.cs index feadb5a2..5a5fa1d4 100644 --- a/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsConfig.cs +++ b/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsConfig.cs @@ -1,4 +1,4 @@ -using BetterGenshinImpact.GameTask.Model.GameUI; +using BetterGenshinImpact.GameTask.Model.GameUI; using CommunityToolkit.Mvvm.ComponentModel; using System; @@ -8,8 +8,7 @@ namespace BetterGenshinImpact.GameTask.GetGridIcons; public partial class GetGridIconsConfig : ObservableObject { /// - /// 昼夜策略 - /// 钓全天的鱼、还是只钓白天或夜晚的鱼 + /// Grid界面名称 /// [ObservableProperty] private GridScreenName _gridName = GridScreenName.Weapons; diff --git a/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsTask.cs b/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsTask.cs index 1028e9de..f1c9cbf5 100644 --- a/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsTask.cs +++ b/BetterGenshinImpact/GameTask/GetGridIcons/GetGridIconsTask.cs @@ -1,17 +1,21 @@ +using BetterGenshinImpact.Core.Recognition.OCR; +using BetterGenshinImpact.Core.Simulator; +using BetterGenshinImpact.GameTask.AutoArtifactSalvage; +using BetterGenshinImpact.GameTask.Common.Job; +using BetterGenshinImpact.GameTask.Model.Area; +using BetterGenshinImpact.GameTask.Model.GameUI; +using BetterGenshinImpact.Helpers.Extensions; +using Fischless.WindowsInput; +using Microsoft.Extensions.Logging; +using OpenCvSharp; +using OpenCvSharp.Extensions; using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; using static BetterGenshinImpact.GameTask.Common.TaskControl; -using Microsoft.Extensions.Localization; -using BetterGenshinImpact.GameTask.Model.Area; -using System.Collections.Generic; -using OpenCvSharp; -using System.Linq; -using BetterGenshinImpact.Core.Recognition.OCR; -using System.IO; -using OpenCvSharp.Extensions; -using BetterGenshinImpact.GameTask.Model.GameUI; namespace BetterGenshinImpact.GameTask.GetGridIcons; @@ -21,6 +25,7 @@ namespace BetterGenshinImpact.GameTask.GetGridIcons; public class GetGridIconsTask : ISoloTask { private readonly ILogger logger = App.GetLogger(); + private readonly InputSimulator input = Simulation.SendInput; private CancellationToken ct; @@ -37,13 +42,31 @@ public class GetGridIconsTask : ISoloTask this.gridScreenName = gridScreenName; this.starAsSuffix = starAsSuffix; this.maxNumToGet = maxNumToGet; - IStringLocalizer stringLocalizer = App.GetService>() ?? throw new NullReferenceException(); } public async Task Start(CancellationToken ct) { this.ct = ct; + switch (this.gridScreenName) + { + case GridScreenName.Weapons: + case GridScreenName.Artifacts: + case GridScreenName.CharacterDevelopmentItems: + case GridScreenName.Food: + case GridScreenName.Materials: + case GridScreenName.Gadget: + case GridScreenName.Quest: + case GridScreenName.PreciousItems: + case GridScreenName.Furnishings: + await new ReturnMainUiTask().Start(ct); + await AutoArtifactSalvageTask.OpenBag(this.gridScreenName, this.input, this.logger, this.ct); + break; + default: + logger.LogInformation("{name}暂不支持自动打开,请提前手动打开界面", gridScreenName.GetDescription()); + break; + } + using var ra0 = CaptureToRectArea(); GridScreenParams gridParams = GridScreenParams.Templates[this.gridScreenName]; Rect gridRoi = gridParams.GetRect(ra0); diff --git a/BetterGenshinImpact/GameTask/GetGridIcons/GridIconsAccuracyTestTask.cs b/BetterGenshinImpact/GameTask/GetGridIcons/GridIconsAccuracyTestTask.cs index aa43c96f..689c45a3 100644 --- a/BetterGenshinImpact/GameTask/GetGridIcons/GridIconsAccuracyTestTask.cs +++ b/BetterGenshinImpact/GameTask/GetGridIcons/GridIconsAccuracyTestTask.cs @@ -1,6 +1,11 @@ using BetterGenshinImpact.Core.Recognition.OCR; +using BetterGenshinImpact.Core.Simulator; +using BetterGenshinImpact.GameTask.AutoArtifactSalvage; +using BetterGenshinImpact.GameTask.Common.Job; using BetterGenshinImpact.GameTask.Model.Area; using BetterGenshinImpact.GameTask.Model.GameUI; +using BetterGenshinImpact.Helpers.Extensions; +using Fischless.WindowsInput; using Microsoft.Extensions.Logging; using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; @@ -21,6 +26,7 @@ namespace BetterGenshinImpact.GameTask.GetGridIcons; public class GridIconsAccuracyTestTask : ISoloTask { private readonly ILogger logger = App.GetLogger(); + private readonly InputSimulator input = Simulation.SendInput; private CancellationToken ct; @@ -36,25 +42,28 @@ public class GridIconsAccuracyTestTask : ISoloTask this.maxNumToTest = maxNumToTest; } - public async Task Start(CancellationToken ct) + /// + /// 加载图标识别模型 + /// + /// 原型向量 + /// 推理会话 + /// + public static InferenceSession LoadModel(out Dictionary prototypes) { - this.ct = ct; - #region 加载model - using var session = new InferenceSession(@".\GameTask\GetGridIcons\gridIcon.onnx"); // todo 所有数据炼好后放到onnx统一存放的位置去 + var session = new InferenceSession(@".\GameTask\GetGridIcons\gridIcon.onnx"); // todo 所有数据炼好后放到onnx统一存放的位置去 var metadata = session.ModelMetadata; if (!metadata.CustomMetadataMap.TryGetValue("prefix_list", out string? prefixListJson)) { - logger.LogError("模型文件缺少prefix_list"); - return; + throw new Exception("模型文件缺少prefix_list"); } List prefixList = System.Text.Json.JsonSerializer.Deserialize>(prefixListJson) ?? throw new Exception(); // 不预测前缀 #endregion #region 加载原型向量 var allLines = File.ReadLines(@".\GameTask\GetGridIcons\训练集原型特征.csv").Skip(1); // 跳过首行列名 - Dictionary prototypes = new Dictionary(); + prototypes = new Dictionary(); foreach (string line in allLines) { var columns = line.Split(",").ToArray(); @@ -65,6 +74,33 @@ public class GridIconsAccuracyTestTask : ISoloTask prototypes.Add(columns[0], flatData); } #endregion + return session; + } + + public async Task Start(CancellationToken ct) + { + this.ct = ct; + + switch (this.gridScreenName) + { + case GridScreenName.Weapons: + case GridScreenName.Artifacts: + case GridScreenName.CharacterDevelopmentItems: + case GridScreenName.Food: + case GridScreenName.Materials: + case GridScreenName.Gadget: + case GridScreenName.Quest: + case GridScreenName.PreciousItems: + case GridScreenName.Furnishings: + await new ReturnMainUiTask().Start(ct); + await AutoArtifactSalvageTask.OpenBag(this.gridScreenName, this.input, this.logger, this.ct); + break; + default: + logger.LogInformation("{name}暂不支持自动打开,请提前手动打开界面", gridScreenName.GetDescription()); + break; + } + + using InferenceSession session = LoadModel(out Dictionary prototypes); using var ra0 = CaptureToRectArea(); GridScreenParams gridParams = GridScreenParams.Templates[this.gridScreenName]; @@ -89,6 +125,8 @@ public class GridIconsAccuracyTestTask : ISoloTask await Task.WhenAll(task1, task2); (string, int) result = task2.Result; + string predName = result.Item1; + int predStarNum = result.Item2; // 用CV方法得到的结果 using var ra1 = CaptureToRectArea(); @@ -101,14 +139,14 @@ public class GridIconsAccuracyTestTask : ISoloTask // 统计结果 total_count++; - if (itemName.Contains(result.Item1) && result.Item2 == itemStarNum) + if (itemName.Contains(predName) && predStarNum == itemStarNum) { total_acc++; - logger.LogInformation($"{result.Item1}|{result.Item2}星,✔,正确率{total_acc / total_count:0.00}"); + logger.LogInformation($"{predName}|{predStarNum}星,✔,正确率{total_acc / total_count:0.00}"); } else { - logger.LogInformation($"{result.Item1}|{result.Item2}星,应为:{itemName}|{itemStarNum}星,❌,正确率{total_acc / total_count:0.00}"); + logger.LogInformation($"{predName}|{predStarNum}星,应为:{itemName}|{itemStarNum}星,❌,正确率{total_acc / total_count:0.00}"); } count--; diff --git a/BetterGenshinImpact/Helpers/ScriptObjectConverter.cs b/BetterGenshinImpact/Helpers/ScriptObjectConverter.cs index 663c04fb..976d9c2b 100644 --- a/BetterGenshinImpact/Helpers/ScriptObjectConverter.cs +++ b/BetterGenshinImpact/Helpers/ScriptObjectConverter.cs @@ -1,4 +1,4 @@ -using Microsoft.ClearScript; +using Microsoft.ClearScript; using System; using System.Reflection; @@ -45,7 +45,7 @@ public class ScriptObjectConverter if (source[propertyName] is not Undefined && source[propertyName] != null) { object value = source.GetProperty(propertyName); - return (T)Convert.ChangeType(value, typeof(T)); + return (T)value; } return defaultValue; } diff --git a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml index 9ef5895b..1cecc075 100644 --- a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml +++ b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml @@ -782,7 +782,8 @@ ItemsSource=' 1234' SelectedIndex="{Binding Config.AutoFightConfig.GuardianAvatar, Mode=TwoWay}" SelectedItem="{Binding Config.AutoFightConfig.GuardianAvatar, Mode=TwoWay}" /> - + + - + @@ -2580,7 +2581,7 @@ - + + + + + + + + + + + + + + + + + + + + + 供JS脚本调用Buff类食物配置;食物名称会忽略“美味的”等前缀,请填不带前缀的名称 + + + + + + + + + + + + + + + + 入参"foodEffectType":1时使用 + + + + + + + + + + + + + + + 入参"foodEffectType":2时使用 + + + + + + + + + + + + + + + 入参"foodEffectType":3时使用 + + + + + + Icon="{ui:SymbolIcon FlashSettings24}"> diff --git a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs index d66ceba8..82a42a8b 100644 --- a/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs +++ b/BetterGenshinImpact/ViewModel/Pages/TaskSettingsPageViewModel.cs @@ -123,7 +123,7 @@ public partial class TaskSettingsPageViewModel : ViewModel private List _domainNameList; public static List ArtifactSalvageStarList = ["4", "3", "2", "1"]; - + public static List BossNumList = [1, 2, 3]; @@ -225,6 +225,12 @@ public partial class TaskSettingsPageViewModel : ViewModel SwitchAutoDomainEnabled = false; SwitchAutoFightEnabled = false; SwitchAutoMusicGameEnabled = false; + SwitchAutoAlbumEnabled = false; + SwitchAutoFishingEnabled = false; + SwitchArtifactSalvageEnabled = false; + SwitchAutoRedeemCodeEnabled = false; + SwitchAutoStygianOnslaughtEnabled = false; + SwitchGetGridIconsEnabled = false; await Task.Delay(800); } @@ -597,20 +603,20 @@ public partial class TaskSettingsPageViewModel : ViewModel p.Height = 500; p.ShowDialog(); if (p.DialogResult == true && !string.IsNullOrWhiteSpace(multilineTextBox.Text)) - { + { char[] separators = ['\r', '\n']; - var codes = multilineTextBox.Text.Split(separators, StringSplitOptions.RemoveEmptyEntries) + var codes = multilineTextBox.Text.Split(separators, StringSplitOptions.RemoveEmptyEntries) - .Select(code => code.Trim()) - .Where(code => !string.IsNullOrEmpty(code)) - .ToList(); + .Select(code => code.Trim()) + .Where(code => !string.IsNullOrEmpty(code)) + .ToList(); if (codes.Count == 0) { Toast.Warning("没有有效的兑换码"); return; } - + SwitchAutoRedeemCodeEnabled = true; await new TaskRunner() .RunSoloTaskAsync(new UseRedemptionCodeTask(codes));