From afe4a2e6dbc8ade504e84b8eb52ec98c7bdfd780 Mon Sep 17 00:00:00 2001 From: status102 <102887808+status102@users.noreply.github.com> Date: Fri, 14 Mar 2025 16:25:38 +0800 Subject: [PATCH] =?UTF-8?q?rft:=20Wpf=E8=82=89=E9=B8=BD=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=20(#12124)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * rft(wpf): 肉鸽任务序列化 * perf: 部分参数设置简化 --- src/MaaWpfGui/Constants/ConfigurationKeys.cs | 2 +- src/MaaWpfGui/Main/AsstProxy.cs | 193 ------------ .../Models/AsstTasks/AsstRoguelikeTask.cs | 281 ++++++++++++++++++ .../ViewModels/UI/TaskQueueViewModel.cs | 34 +-- .../RoguelikeSettingsUserControlModel.cs | 151 +++++++--- .../RoguelikeSettingsUserControl.xaml | 22 +- 6 files changed, 398 insertions(+), 285 deletions(-) create mode 100644 src/MaaWpfGui/Models/AsstTasks/AsstRoguelikeTask.cs diff --git a/src/MaaWpfGui/Constants/ConfigurationKeys.cs b/src/MaaWpfGui/Constants/ConfigurationKeys.cs index 0cc07a969a..0f08280bde 100644 --- a/src/MaaWpfGui/Constants/ConfigurationKeys.cs +++ b/src/MaaWpfGui/Constants/ConfigurationKeys.cs @@ -130,7 +130,7 @@ namespace MaaWpfGui.Constants public const string RoguelikeStartWithSelectList = "Roguelike.RoguelikeStartWithSelectList"; public const string RoguelikeStartWithTwoIdeas = "Roguelike.RoguelikeStartWithTwoIdeas"; public const string Roguelike3FirstFloorFoldartal = "Roguelike.Roguelike3FirstFloorFoldartal"; - public const string Roguelike3StartFloorFoldartal = "Roguelike.Roguelike3StartFloorFoldartal"; + public const string Roguelike3FirstFloorFoldartals = "Roguelike.Roguelike3StartFloorFoldartal"; public const string Roguelike3NewSquad2StartingFoldartal = "Roguelike.Roguelike3NewSquad2StartingFoldartal"; public const string Roguelike3NewSquad2StartingFoldartals = "Roguelike.Roguelike3NewSquad2StartingFoldartals"; public const string RoguelikeExpectedCollapsalParadigms = "Roguelike.RoguelikeExpectedCollapsalParadigms"; diff --git a/src/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs index f84e8024a9..6df2f453c6 100644 --- a/src/MaaWpfGui/Main/AsstProxy.cs +++ b/src/MaaWpfGui/Main/AsstProxy.cs @@ -2180,199 +2180,6 @@ namespace MaaWpfGui.Main return AsstSetTaskParamsWithEncoding(id, taskParams); } - /// - /// 无限刷肉鸽。 - /// - /// - /// 模式。可用值包括: - /// - /// - /// 0 - /// 刷蜡烛,尽可能稳定地打更多层数。 - /// - /// - /// 1 - /// 刷源石锭,第一层投资完就退出。 - /// - /// - /// 2 - /// 【即将弃用】两者兼顾,投资过后再退出,没有投资就继续往后打。 - /// - /// - /// 3 - /// 【开发中】尝试通关,尽可能打的远。 - /// - /// - /// - /// 刷投资的目标难度/其他模式的选择难度 - /// 开始探索次数。 - /// 是否投资源石锭 - /// 投资时候刷更多分 - /// 刷开局模式是否购物 - /// 投资源石锭次数。 - /// 投资满了自动停止任务。 - /// 烧水时使用的分队 - /// 开局分队 - /// 开局职业组 - /// 开局干员名 - /// 是否凹开局直升 - /// 是否只凹开局直升,不进行作战 - /// 需要刷的开局 - /// 凹第一层远见板子 - /// 需要凹的板子 - /// 是否在萨米肉鸽生活队凹开局板子 - /// 需要凹的板子,用;连接的字符串 - /// sami 刷坍缩专用,需要刷的坍缩列表 - /// 是否core_char使用好友助战 - /// 是否允许使用非好友助战 - /// 肉鸽主题["Phantom", "Mizuki", "Sami", "Sarkaz"] - /// 是否用骰子刷新商店购买特殊商品,目前支持水月肉鸽的指路鳞 - /// 是否在五层BOSS前停下来 - /// 是否启动月度小队自动切换 - /// 是否将月度小队通信也作为切换依据 - /// 是否启动深入调查自动切换 - /// 是否在满级时停止任务 - /// 是否使用刷钱种子 - /// 是否成功。 - public bool AsstAppendRoguelike( - int mode, - int difficulty, - int starts, - bool investmentEnabled, - bool investmentWithMoreScore, - bool collectibleModeShopping, - int invests, - bool stopWhenFull, - string collectibleModeSquad, - string squad, - string roles, - string coreChar, - bool startWithEliteTwo, - bool onlyStartWithEliteTwo, - List startWithSelectList, - bool roguelike3FirstFloorFoldartal, - string roguelike3StartFloorFoldartal, - bool roguelike3NewSquad2StartingFoldartal, - string roguelike3NewSquad2StartingFoldartals, - string roguelikeExpectedCollapsalParadigms, - bool useSupport, - bool enableNonFriendSupport, - string theme, - bool refreshTraderWithDice, - bool stopAtFinalBoss, - bool monthlySquadAutoIterate, - bool monthlySquadCheckComms, - bool deepExplorationAutoIterate, - bool stopAtMaxLevel, - bool startWithSeed) - { - var taskParams = new JObject - { - ["mode"] = mode, - ["starts_count"] = starts, - ["theme"] = theme, - ["investment_enabled"] = false, - }; - - if (theme != "Phantom") - { - taskParams["difficulty"] = difficulty; - } - - if (investmentEnabled) - { - taskParams["investment_enabled"] = true; - taskParams["investment_with_more_score"] = investmentWithMoreScore; - taskParams["investments_count"] = invests; - taskParams["stop_when_investment_full"] = stopWhenFull; - } - - if (squad.Length > 0) - { - taskParams["squad"] = squad; - } - - if (roles.Length > 0) - { - taskParams["roles"] = roles; - } - - if (coreChar.Length > 0) - { - taskParams["core_char"] = coreChar; - } - - if (mode == 0) - { - taskParams["stop_at_final_boss"] = stopAtFinalBoss; - taskParams["stop_at_max_level"] = stopAtMaxLevel; - } - else if (mode == 4) - { - // 刷开局模式 - taskParams["collectible_mode_shopping"] = collectibleModeShopping; - taskParams["collectible_mode_squad"] = collectibleModeSquad; - taskParams["start_with_elite_two"] = startWithEliteTwo; - taskParams["only_start_with_elite_two"] = onlyStartWithEliteTwo; - - var rewardKeys = new Dictionary - { - { "Roguelike@LastReward", "hot_water" }, - { "Roguelike@LastReward2", "shield" }, - { "Roguelike@LastReward3", "ingot" }, - { "Roguelike@LastReward4", "hope" }, - { "Roguelike@LastRewardRand", "random" }, - { "Mizuki@Roguelike@LastReward5", "key" }, - { "Mizuki@Roguelike@LastReward6", "dice" }, - { "Sarkaz@Roguelike@LastReward5", "ideas" }, - }; - var startWithSelect = new JObject(); - foreach (var select in startWithSelectList) - { - if (rewardKeys.TryGetValue(select, out var paramKey)) - { - startWithSelect[paramKey] = true; - } - } - - taskParams["collectible_mode_start_list"] = startWithSelect; - } - - if (mode == 6) - { - taskParams["monthly_squad_auto_iterate"] = monthlySquadAutoIterate; - taskParams["monthly_squad_check_comms"] = monthlySquadCheckComms; - } - - if (mode == 7) - { - taskParams["deep_exploration_auto_iterate"] = deepExplorationAutoIterate; - } - - if (roguelike3FirstFloorFoldartal && roguelike3StartFloorFoldartal.Length > 0) - { - taskParams["first_floor_foldartal"] = roguelike3StartFloorFoldartal; - } - - if (roguelike3NewSquad2StartingFoldartal && roguelike3NewSquad2StartingFoldartals.Length > 0) - { - taskParams["start_foldartal_list"] = new JArray(roguelike3NewSquad2StartingFoldartals.Trim().Split(';', ';').Where(i => !string.IsNullOrEmpty(i)).Take(3)); - } - - if (mode == 5 && roguelikeExpectedCollapsalParadigms.Length > 0) - { - taskParams["expected_collapsal_paradigms"] = new JArray(roguelikeExpectedCollapsalParadigms.Trim().Split(';', ';').Where(i => !string.IsNullOrEmpty(i))); - } - - taskParams["use_support"] = useSupport; - taskParams["use_nonfriend_support"] = enableNonFriendSupport; - taskParams["refresh_trader_with_dice"] = theme == "Mizuki" && refreshTraderWithDice; - - AsstTaskId id = AsstAppendTaskWithEncoding(AsstTaskType.Roguelike, taskParams); - _taskStatus.Add(id, TaskType.Roguelike); - return id != 0; - } - /// /// 公招识别。 /// diff --git a/src/MaaWpfGui/Models/AsstTasks/AsstRoguelikeTask.cs b/src/MaaWpfGui/Models/AsstTasks/AsstRoguelikeTask.cs new file mode 100644 index 0000000000..20fe8f5029 --- /dev/null +++ b/src/MaaWpfGui/Models/AsstTasks/AsstRoguelikeTask.cs @@ -0,0 +1,281 @@ +// +// MaaWpfGui - A part of the MaaCoreArknights project +// Copyright (C) 2021 MistEO and Contributors +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License v3.0 only as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY +// + +#nullable enable +using System.Collections.Generic; +using MaaWpfGui.Services; +using MaaWpfGui.ViewModels.UserControl.TaskQueue; +using Newtonsoft.Json.Linq; + +namespace MaaWpfGui.Models.AsstTasks; + +/// +/// 肉鸽任务 +/// +public class AsstRoguelikeTask : AsstBaseTask +{ + public override AsstTaskType TaskType => AsstTaskType.Roguelike; + + /// + /// Gets or sets 模式。可用值包括: + /// + /// + /// 0 + /// 刷蜡烛,尽可能稳定地打更多层数。 + /// + /// + /// 1 + /// 刷源石锭,第一层投资完就退出。 + /// + /// + /// 2 + /// 【即将弃用】两者兼顾,投资过后再退出,没有投资就继续往后打。 + /// + /// + /// 3 + /// 【开发中】尝试通关,尽可能打的远。 + /// + /// + /// + public int Mode { get; set; } + + /// + /// Gets or sets 刷投资的目标难度/其他模式的选择难度 + /// + public int Difficulty { get; set; } + + /// + /// Gets or sets 开始探索次数 + /// + public int Starts { get; set; } + + /// + /// Gets or sets a value indicating whether 是否投资源石锭 + /// + public bool InvestmentEnabled { get; set; } + + /// + /// Gets or sets 投资源石锭次数 + /// + public int InvestmentCount { get; set; } + + /// + /// Gets or sets a value indicating whether 投资时候刷更多分 + /// + public bool InvestmentWithMoreScore { get; set; } + + /// + /// Gets or sets a value indicating whether 投资满了自动停止任务 + /// + public bool InvestmentStopWhenFull { get; set; } + + /// + /// Gets or sets a value indicating whether 刷开局模式是否购物 + /// + public bool CollectibleModeShopping { get; set; } + + /// + /// Gets or sets 烧水时使用的分队 + /// + public string CollectibleModeSquad { get; set; } = string.Empty; + + /// + /// Gets or sets 开局分队 + /// + public string Squad { get; set; } = string.Empty; + + /// + /// Gets or sets 开局职业组 + /// + public string Roles { get; set; } = string.Empty; + + /// + /// Gets or sets 开局干员名 + /// + public string CoreChar { get; set; } = string.Empty; + + /// + /// Gets or sets a value indicating whether 是否凹开局直升 + /// + public bool StartWithEliteTwo { get; set; } + + /// + /// Gets or sets a value indicating whether 是否只凹开局直升,不进行作战 + /// + public bool StartWithEliteTwoNonBattle { get; set; } + + /// + /// Gets or sets 需要刷的开局 + /// + public Dictionary CollectibleModeStartRewards { get; set; } = []; + + /// + /// Gets or sets a value indicating whether 凹第一层远见板子 + /// + public bool SamiFirstFloorFoldartal { get; set; } + + /// + /// Gets or sets 需要凹的板子 + /// + public string SamiStartFloorFoldartal { get; set; } = string.Empty; + + /// + /// Gets or sets a value indicating whether 是否在萨米肉鸽生活队凹开局板子 + /// + public bool SamiNewSquad2StartingFoldartal { get; set; } + + /// + /// Gets or sets 需要凹的板子 + /// + public List SamiNewSquad2StartingFoldartals { get; set; } = []; + + /// + /// Gets or sets 萨米刷坍缩专用,需要刷的坍缩列表 + /// + public List ExpectedCollapsalParadigms { get; set; } = []; + + /// + /// Gets or sets a value indicating whether 是否core_char使用好友助战 + /// + public bool UseSupport { get; set; } + + /// + /// Gets or sets a value indicating whether 是否允许使用非好友助战 + /// + public bool UseSupportNonFriend { get; set; } + + /// + /// Gets or sets 肉鸽主题 + /// + public RoguelikeTheme Theme { get; set; } + + /// + /// Gets or sets a value indicating whether 是否用骰子刷新商店购买特殊商品,目前支持水月肉鸽的指路鳞 + /// + public bool RefreshTraderWithDice { get; set; } + + /// + /// Gets or sets a value indicating whether 是否启动月度小队自动切换 + /// + public bool MonthlySquadAutoIterate { get; set; } + + /// + /// Gets or sets a value indicating whether 是否将月度小队通信也作为切换依据 + /// + public bool MonthlySquadCheckComms { get; set; } + + /// + /// Gets or sets a value indicating whether 是否启动深入调查自动切换 + /// + public bool DeepExplorationAutoIterate { get; set; } + + /// + /// Gets or sets a value indicating whether 是否在五层BOSS前停下来 + /// + public bool StopAtFinalBoss { get; set; } + + /// + /// Gets or sets a value indicating whether 是否在满级时停止任务 + /// + public bool StopAtMaxLevel { get; set; } + + /// + /// Gets or sets a value indicating whether 是否使用刷钱种子 + /// + public bool StartWithSeed { get; set; } + + public override (AsstTaskType TaskType, JObject Params) Serialize() + { + var taskParams = new JObject + { + ["mode"] = Mode, + ["theme"] = Theme.ToString(), + ["starts_count"] = Starts, + ["investment_enabled"] = InvestmentEnabled, + }; + + if (Theme != RoguelikeTheme.Phantom) + { + taskParams["difficulty"] = Difficulty; + } + + if (InvestmentEnabled) + { + taskParams["investment_with_more_score"] = InvestmentWithMoreScore; + taskParams["investments_count"] = InvestmentCount; + taskParams["stop_when_investment_full"] = InvestmentStopWhenFull; + } + + if (Squad.Length > 0) + { + taskParams["squad"] = Squad; + } + + if (Roles.Length > 0) + { + taskParams["roles"] = Roles; + } + + if (CoreChar.Length > 0) + { + taskParams["core_char"] = CoreChar; + } + + if (Mode == 0) + { + taskParams["stop_at_final_boss"] = StopAtFinalBoss; + taskParams["stop_at_max_level"] = StopAtMaxLevel; + } + else if (Mode == 4) + { + // 刷开局模式 + taskParams["collectible_mode_shopping"] = CollectibleModeShopping; + taskParams["collectible_mode_squad"] = CollectibleModeSquad; + taskParams["start_with_elite_two"] = StartWithEliteTwo; + taskParams["only_start_with_elite_two"] = StartWithEliteTwoNonBattle; + taskParams["collectible_mode_start_list"] = JObject.FromObject(CollectibleModeStartRewards); + } + + if (Mode == 6) + { + taskParams["monthly_squad_auto_iterate"] = MonthlySquadAutoIterate; + taskParams["monthly_squad_check_comms"] = MonthlySquadCheckComms; + } + + if (Mode == 7) + { + taskParams["deep_exploration_auto_iterate"] = DeepExplorationAutoIterate; + } + + if (SamiFirstFloorFoldartal && SamiStartFloorFoldartal.Length > 0) + { + taskParams["first_floor_foldartal"] = SamiStartFloorFoldartal; + } + + if (SamiNewSquad2StartingFoldartal && SamiNewSquad2StartingFoldartals.Count > 0) + { + taskParams["start_foldartal_list"] = JArray.FromObject(SamiNewSquad2StartingFoldartals); + } + + if (Mode == 5 && ExpectedCollapsalParadigms.Count > 0) + { + taskParams["expected_collapsal_paradigms"] = JArray.FromObject(ExpectedCollapsalParadigms); + } + + taskParams["use_support"] = UseSupport; + taskParams["use_nonfriend_support"] = UseSupportNonFriend; + taskParams["refresh_trader_with_dice"] = Theme == RoguelikeTheme.Mizuki && RefreshTraderWithDice; + + return (TaskType, taskParams); + } +} diff --git a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs index 3513b5dc6f..d8e4b3ab36 100644 --- a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs @@ -1733,37 +1733,9 @@ namespace MaaWpfGui.ViewModels.UI private static bool AppendRoguelike() { - return Instances.AsstProxy.AsstAppendRoguelike( - RoguelikeTask.RoguelikeMode, - RoguelikeTask.RoguelikeDifficulty, - RoguelikeTask.RoguelikeStartsCount, - RoguelikeTask.RoguelikeInvestmentEnabled, - RoguelikeTask.RoguelikeInvestmentWithMoreScore, - RoguelikeTask.RoguelikeCollectibleModeShopping, - RoguelikeTask.RoguelikeInvestsCount, - RoguelikeTask.RoguelikeStopWhenInvestmentFull, - RoguelikeTask.RoguelikeCollectibleModeSquad, - RoguelikeTask.RoguelikeSquad, - RoguelikeTask.RoguelikeRoles, - DataHelper.GetCharacterByNameOrAlias(RoguelikeTask.RoguelikeCoreChar)?.Name ?? RoguelikeTask.RoguelikeCoreChar, - RoguelikeTask.RoguelikeStartWithEliteTwo, - RoguelikeTask.RoguelikeOnlyStartWithEliteTwo, - RoguelikeTask.RoguelikeStartWithSelectList, - RoguelikeTask.Roguelike3FirstFloorFoldartal, - RoguelikeTask.Roguelike3StartFloorFoldartal, - RoguelikeTask.Roguelike3NewSquad2StartingFoldartal, - RoguelikeTask.Roguelike3NewSquad2StartingFoldartals, - RoguelikeTask.RoguelikeExpectedCollapsalParadigms, - RoguelikeTask.RoguelikeUseSupportUnit, - RoguelikeTask.RoguelikeEnableNonfriendSupport, - RoguelikeTask.RoguelikeTheme.ToString(), - RoguelikeTask.RoguelikeRefreshTraderWithDice, - RoguelikeTask.RoguelikeStopAtFinalBoss, - RoguelikeTask.RoguelikeMonthlySquadAutoIterate, - RoguelikeTask.RoguelikeMonthlySquadCheckComms, - RoguelikeTask.RoguelikeDeepExplorationAutoIterate, - RoguelikeTask.RoguelikeStopAtMaxLevel, - RoguelikeTask.RoguelikeStartWithSeed); + // 被RemoteControlService反射调用,暂不移除 + var (type, param) = RoguelikeTask.Serialize(); + return Instances.AsstProxy.AsstAppendTaskWithEncoding(AsstProxy.TaskType.Roguelike, type, param); } private static bool AppendReclamation() diff --git a/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RoguelikeSettingsUserControlModel.cs b/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RoguelikeSettingsUserControlModel.cs index d213c3ab8f..af79b150dc 100644 --- a/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RoguelikeSettingsUserControlModel.cs +++ b/src/MaaWpfGui/ViewModels/UserControl/TaskQueue/RoguelikeSettingsUserControlModel.cs @@ -18,6 +18,8 @@ using System.IO; using System.Linq; using MaaWpfGui.Constants; using MaaWpfGui.Helper; +using MaaWpfGui.Models.AsstTasks; +using MaaWpfGui.Services; using MaaWpfGui.Utilities.ValueType; using MaaWpfGui.ViewModels.UI; using Newtonsoft.Json; @@ -365,15 +367,9 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel } } - public bool RoguelikeSquadIsProfessional => - RoguelikeMode == 4 && - RoguelikeTheme != Theme.Phantom && - RoguelikeSquad is "突击战术分队" or "堡垒战术分队" or "远程战术分队" or "破坏战术分队"; + public bool RoguelikeSquadIsProfessional => RoguelikeMode == 4 && RoguelikeTheme != Theme.Phantom && RoguelikeSquad is "突击战术分队" or "堡垒战术分队" or "远程战术分队" or "破坏战术分队"; - public bool RoguelikeSquadIsFoldartal => - RoguelikeMode == 4 && - RoguelikeTheme == Theme.Sami && - RoguelikeSquad == "生活至上分队"; + public bool RoguelikeSquadIsFoldartal => RoguelikeMode == 4 && RoguelikeTheme == Theme.Sami && RoguelikeSquad == "生活至上分队"; private string _roguelikeRoles = ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeRoles, string.Empty); @@ -435,7 +431,7 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel /// /// Gets or sets a value indicating whether core char need start with elite two. /// - public bool RoguelikeStartWithEliteTwoRaw + public bool RoguelikeStartWithEliteTwo { get => _roguelikeStartWithEliteTwo; set @@ -456,11 +452,6 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel } } - /// - /// Gets a value indicating whether core char need start with elite two. - /// - public bool RoguelikeStartWithEliteTwo => _roguelikeStartWithEliteTwo && RoguelikeSquadIsProfessional; - private bool _roguelikeOnlyStartWithEliteTwo = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeOnlyStartWithEliteTwo, bool.FalseString)); /// @@ -479,7 +470,7 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel /// /// Gets a value indicating whether only need with elite two's core char. /// - public bool RoguelikeOnlyStartWithEliteTwo => _roguelikeOnlyStartWithEliteTwo && RoguelikeStartWithEliteTwo; + public bool RoguelikeOnlyStartWithEliteTwo => _roguelikeOnlyStartWithEliteTwo && _roguelikeStartWithEliteTwo && RoguelikeSquadIsProfessional; public static Dictionary RoguelikeStartWithAllDict { get; } = new() { @@ -493,7 +484,7 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel { "Sarkaz@Roguelike@LastReward5", LocalizationHelper.GetString("RoguelikeStartWithIdea") }, }; - private static object[] _roguelikeStartWithSelectListRaw = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.RoguelikeStartWithSelectList, "Roguelike@LastReward Roguelike@LastReward4 Sarkaz@Roguelike@LastReward5") + private object[] _roguelikeStartWithSelectListRaw = ConfigurationHelper.GetGlobalValue(ConfigurationKeys.RoguelikeStartWithSelectList, "Roguelike@LastReward Roguelike@LastReward4 Sarkaz@Roguelike@LastReward5") .Split(' ') .Where(s => RoguelikeStartWithAllDict.ContainsKey(s.ToString())) .Select(s => (object)new KeyValuePair(s, RoguelikeStartWithAllDict[s])) @@ -511,14 +502,14 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel } } - public List RoguelikeStartWithSelectList => (RoguelikeMode == 4 && !RoguelikeOnlyStartWithEliteTwo) ? _roguelikeStartWithSelectListRaw.Cast>().Select(pair => pair.Key).ToList() : []; + public List RoguelikeStartWithSelectList => _roguelikeStartWithSelectListRaw.Cast>().Select(pair => pair.Key).ToList(); private bool _roguelike3FirstFloorFoldartal = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.Roguelike3FirstFloorFoldartal, bool.FalseString)); /// /// Gets or sets a value indicating whether core char need start with elite two. /// - public bool Roguelike3FirstFloorFoldartalRaw + public bool Roguelike3FirstFloorFoldartal { get => _roguelike3FirstFloorFoldartal; set @@ -528,20 +519,16 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel } } - /// - /// Gets a value indicating whether core char need start with elite two. - /// - public bool Roguelike3FirstFloorFoldartal => _roguelike3FirstFloorFoldartal && RoguelikeMode == 4 && RoguelikeTheme == Theme.Sami; + private string _roguelike3FirstFloorFoldartals = ConfigurationHelper.GetValue(ConfigurationKeys.Roguelike3FirstFloorFoldartals, string.Empty).Trim(); - private string _roguelike3StartFloorFoldartal = ConfigurationHelper.GetValue(ConfigurationKeys.Roguelike3StartFloorFoldartal, string.Empty); - - public string Roguelike3StartFloorFoldartal + public string Roguelike3FirstFloorFoldartals { - get => _roguelike3StartFloorFoldartal; + get => _roguelike3FirstFloorFoldartals; set { - SetAndNotify(ref _roguelike3StartFloorFoldartal, value); - ConfigurationHelper.SetValue(ConfigurationKeys.Roguelike3StartFloorFoldartal, value); + value = value.Trim(); + SetAndNotify(ref _roguelike3FirstFloorFoldartals, value); + ConfigurationHelper.SetValue(ConfigurationKeys.Roguelike3FirstFloorFoldartals, value); } } @@ -550,7 +537,7 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel /// /// Gets or sets a value indicating whether core char need start with elite two. /// - public bool Roguelike3NewSquad2StartingFoldartalRaw + public bool Roguelike3NewSquad2StartingFoldartal { get => _roguelike3NewSquad2StartingFoldartal; set @@ -560,24 +547,20 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel } } - /// - /// Gets a value indicating whether core char need start with elite two. - /// - public bool Roguelike3NewSquad2StartingFoldartal => _roguelike3NewSquad2StartingFoldartal && RoguelikeSquadIsFoldartal; - - private string _roguelike3NewSquad2StartingFoldartals = ConfigurationHelper.GetValue(ConfigurationKeys.Roguelike3NewSquad2StartingFoldartals, string.Empty); + private string _roguelike3NewSquad2StartingFoldartals = ConfigurationHelper.GetValue(ConfigurationKeys.Roguelike3NewSquad2StartingFoldartals, string.Empty).Replace(';', ';').Trim(); public string Roguelike3NewSquad2StartingFoldartals { get => _roguelike3NewSquad2StartingFoldartals; set { + value = value.Replace(';', ';').Trim(); SetAndNotify(ref _roguelike3NewSquad2StartingFoldartals, value); ConfigurationHelper.SetValue(ConfigurationKeys.Roguelike3NewSquad2StartingFoldartals, value); } } - private string _roguelikeExpectedCollapsalParadigms = ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeExpectedCollapsalParadigms, string.Empty); + private string _roguelikeExpectedCollapsalParadigms = ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeExpectedCollapsalParadigms, string.Empty).Replace(";", ";").Trim(); /// /// Gets or sets the expected collapsal paradigms. @@ -588,6 +571,7 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel get => _roguelikeExpectedCollapsalParadigms; set { + value = value.Replace(';', ';').Trim(); SetAndNotify(ref _roguelikeExpectedCollapsalParadigms, value); ConfigurationHelper.SetValue(ConfigurationKeys.RoguelikeExpectedCollapsalParadigms, value); } @@ -603,9 +587,9 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel get => _roguelikeUseSupportUnit; set { - if (value && RoguelikeStartWithEliteTwo) + if (value && _roguelikeStartWithEliteTwo && RoguelikeSquadIsProfessional) { - RoguelikeStartWithEliteTwoRaw = false; + RoguelikeStartWithEliteTwo = false; } SetAndNotify(ref _roguelikeUseSupportUnit, value); @@ -628,17 +612,17 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel } } - private string _roguelikeStartsCount = ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeStartsCount, "99999"); + private int _roguelikeStartsCount = ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeStartsCount, 99999); /// /// Gets or sets the start count of roguelike. /// public int RoguelikeStartsCount { - get => int.Parse(_roguelikeStartsCount); + get => _roguelikeStartsCount; set { - SetAndNotify(ref _roguelikeStartsCount, value.ToString()); + SetAndNotify(ref _roguelikeStartsCount, value); ConfigurationHelper.SetValue(ConfigurationKeys.RoguelikeStartsCount, value.ToString()); } } @@ -715,17 +699,17 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel } } - private string _roguelikeInvestsCount = ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeInvestsCount, "9999999"); + private int _roguelikeInvestsCount = ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeInvestsCount, 999); /// /// Gets or sets the invests count of roguelike. /// public int RoguelikeInvestsCount { - get => int.Parse(_roguelikeInvestsCount); + get => _roguelikeInvestsCount; set { - SetAndNotify(ref _roguelikeInvestsCount, value.ToString()); + SetAndNotify(ref _roguelikeInvestsCount, value); ConfigurationHelper.SetValue(ConfigurationKeys.RoguelikeInvestsCount, value.ToString()); } } @@ -820,22 +804,91 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel } } - private bool _roguelikeStartWithSeedRaw = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeStartWithSeed, bool.FalseString)); + private bool _roguelikeStartWithSeed = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeStartWithSeed, bool.FalseString)); /// /// Gets or sets a value indicating whether start with seed when investing in Sarkaz. /// - public bool RoguelikeStartWithSeedRaw + public bool RoguelikeStartWithSeed { - get => _roguelikeStartWithSeedRaw; + get => _roguelikeStartWithSeed; set { - SetAndNotify(ref _roguelikeStartWithSeedRaw, value); + SetAndNotify(ref _roguelikeStartWithSeed, value); ConfigurationHelper.SetValue(ConfigurationKeys.RoguelikeStartWithSeed, value.ToString()); } } - public bool RoguelikeStartWithSeed => _roguelikeStartWithSeedRaw && RoguelikeTheme == Theme.Sarkaz && RoguelikeMode == 1 && RoguelikeSquad is "点刺成锭分队" or "后勤分队"; + public override (AsstTaskType Type, JObject Params) Serialize() + { + var task = new AsstRoguelikeTask() + { + Theme = RoguelikeTheme, + Mode = RoguelikeMode, + Starts = RoguelikeStartsCount, + Difficulty = RoguelikeDifficulty, + Squad = RoguelikeSquad, + Roles = RoguelikeRoles, + CoreChar = DataHelper.GetCharacterByNameOrAlias(RoguelikeCoreChar)?.Name ?? RoguelikeCoreChar, + UseSupport = RoguelikeUseSupportUnit, + UseSupportNonFriend = RoguelikeEnableNonfriendSupport, + + InvestmentEnabled = RoguelikeInvestmentEnabled, + InvestmentCount = RoguelikeInvestsCount, + InvestmentStopWhenFull = RoguelikeStopWhenInvestmentFull, + InvestmentWithMoreScore = RoguelikeInvestmentWithMoreScore, + RefreshTraderWithDice = RoguelikeTheme == Theme.Mizuki && RoguelikeRefreshTraderWithDice, + + StopAtFinalBoss = RoguelikeStopAtFinalBoss, + StopAtMaxLevel = RoguelikeStopAtMaxLevel, + + // 刷开局 + CollectibleModeSquad = RoguelikeCollectibleModeSquad, + CollectibleModeShopping = RoguelikeCollectibleModeShopping, + StartWithEliteTwo = RoguelikeStartWithEliteTwo && RoguelikeSquadIsProfessional, + StartWithEliteTwoNonBattle = RoguelikeOnlyStartWithEliteTwo, + + // 月度小队 + MonthlySquadAutoIterate = RoguelikeMonthlySquadAutoIterate, + MonthlySquadCheckComms = RoguelikeMonthlySquadCheckComms, + + // 深入探索 + DeepExplorationAutoIterate = RoguelikeDeepExplorationAutoIterate, + + SamiFirstFloorFoldartal = RoguelikeTheme == Theme.Sami && RoguelikeMode == 4 && Roguelike3FirstFloorFoldartal, + SamiStartFloorFoldartal = Roguelike3FirstFloorFoldartals, + SamiNewSquad2StartingFoldartal = Roguelike3NewSquad2StartingFoldartal && RoguelikeSquadIsFoldartal, + SamiNewSquad2StartingFoldartals = Roguelike3NewSquad2StartingFoldartals.Split(';').Where(i => !string.IsNullOrEmpty(i)).Take(3).ToList(), + + ExpectedCollapsalParadigms = RoguelikeExpectedCollapsalParadigms.Split(';').Where(i => !string.IsNullOrEmpty(i)).ToList(), + StartWithSeed = RoguelikeStartWithSeed && RoguelikeTheme == Theme.Sarkaz && RoguelikeMode == 1 && RoguelikeSquad is "点刺成锭分队" or "后勤分队", + }; + + if (RoguelikeMode == 4 && !RoguelikeOnlyStartWithEliteTwo) + { + var rewardKeys = new Dictionary + { + { "Roguelike@LastReward", "hot_water" }, + { "Roguelike@LastReward2", "shield" }, + { "Roguelike@LastReward3", "ingot" }, + { "Roguelike@LastReward4", "hope" }, + { "Roguelike@LastRewardRand", "random" }, + { "Mizuki@Roguelike@LastReward5", "key" }, + { "Mizuki@Roguelike@LastReward6", "dice" }, + { "Sarkaz@Roguelike@LastReward5", "ideas" }, + }; + var startWithSelect = new JObject(); + foreach (var select in RoguelikeStartWithSelectList) + { + if (rewardKeys.TryGetValue(select, out var paramKey)) + { + task.CollectibleModeStartRewards[paramKey] = true; + } + } + } + + return task.Serialize(); + } } public enum RoguelikeTheme diff --git a/src/MaaWpfGui/Views/UserControl/TaskQueue/RoguelikeSettingsUserControl.xaml b/src/MaaWpfGui/Views/UserControl/TaskQueue/RoguelikeSettingsUserControl.xaml index 23266d9537..0b32f83a11 100644 --- a/src/MaaWpfGui/Views/UserControl/TaskQueue/RoguelikeSettingsUserControl.xaml +++ b/src/MaaWpfGui/Views/UserControl/TaskQueue/RoguelikeSettingsUserControl.xaml @@ -42,9 +42,9 @@ hc:InfoElement.Title="{DynamicResource Strategy}" DisplayMemberPath="Display" IsHitTestVisible="{Binding Path=Idle, Source={x:Static setting:TaskQueueViewModel.TaskSettingDataContext}}" + IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding RoguelikeModeList}" SelectedValue="{Binding RoguelikeMode}" - IsSynchronizedWithCurrentItem="True" SelectedValuePath="Value" /> + Visibility="{c:Binding 'RoguelikeStartWithEliteTwo and RoguelikeMode == 4 and RoguelikeTheme != task:RoguelikeTheme.Phantom'}"> + Text="{Binding Roguelike3FirstFloorFoldartals}" + Visibility="{c:Binding 'Roguelike3FirstFloorFoldartal and RoguelikeMode == 4 and RoguelikeTheme == task:RoguelikeTheme.Sami'}" /> + Visibility="{c:Binding 'Roguelike3NewSquad2StartingFoldartal and RoguelikeMode == 4 and RoguelikeTheme == task:RoguelikeTheme.Sami and RoguelikeSquad == "生活至上分队" '}" /> @@ -277,7 +277,7 @@