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