From fa713feea6cdab7d105dd55dbe2a46fc005ed515 Mon Sep 17 00:00:00 2001 From: Lancarus <34369130+Lancarus@users.noreply.github.com> Date: Wed, 28 Feb 2024 13:01:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=B7=E5=BC=80=E5=B1=80=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=A2=9E=E5=8A=A0=E8=90=A8=E7=B1=B3=E8=82=89=E9=B8=BD?= =?UTF-8?q?=E7=94=9F=E6=B4=BB=E9=98=9F=E5=87=B9=E5=AF=86=E6=96=87=E6=9D=BF?= =?UTF-8?q?=20(#8408)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 增加萨米肉鸽凹密文板UI,优化肉鸽部分UI的显示 * feat: 凹开局板子相关逻辑 * perf: 优化相关逻辑 * perf: 传参使用array代替string * style: format --------- Co-authored-by: status102 <102887808+status102@users.noreply.github.com> --- .../roguelike/Sami/encounter_for_deposit.json | 2 +- resource/tasks.json | 23 ++++++ .../Sami@Roguelike@LastRewardChoose.png | Bin 0 -> 4024 bytes src/MaaCore/MaaCore.vcxproj | 2 + src/MaaCore/MaaCore.vcxproj.filters | 6 ++ src/MaaCore/Task/Interface/RoguelikeTask.cpp | 23 +++++- src/MaaCore/Task/Roguelike/RoguelikeConfig.h | 26 ++++--- .../RoguelikeFoldartalStartTaskPlugin.cpp | 69 ++++++++++++++++++ .../RoguelikeFoldartalStartTaskPlugin.h | 21 ++++++ src/MaaWpfGui/Constants/ConfigurationKeys.cs | 2 + src/MaaWpfGui/Main/AsstProxy.cs | 11 ++- src/MaaWpfGui/Res/Localizations/en-us.xaml | 2 + src/MaaWpfGui/Res/Localizations/ja-jp.xaml | 2 + src/MaaWpfGui/Res/Localizations/ko-kr.xaml | 2 + src/MaaWpfGui/Res/Localizations/zh-cn.xaml | 2 + src/MaaWpfGui/Res/Localizations/zh-tw.xaml | 2 + .../ViewModels/UI/SettingsViewModel.cs | 27 +++++++ .../ViewModels/UI/TaskQueueViewModel.cs | 4 +- .../RoguelikeSettingsUserControl.xaml | 22 +++++- 19 files changed, 229 insertions(+), 19 deletions(-) create mode 100644 resource/template/Sami@Roguelike@LastRewardChoose.png create mode 100644 src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.cpp create mode 100644 src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.h diff --git a/resource/roguelike/Sami/encounter_for_deposit.json b/resource/roguelike/Sami/encounter_for_deposit.json index 425fcf3705..3b751ed6d8 100644 --- a/resource/roguelike/Sami/encounter_for_deposit.json +++ b/resource/roguelike/Sami/encounter_for_deposit.json @@ -523,7 +523,7 @@ { "name": "前行的林地", "option_num": 2, - "choose": 2, + "choose": 1, "choice_require": [ { "name": "树上就不能走吗?", diff --git a/resource/tasks.json b/resource/tasks.json index 939df7fae0..ffd04d4137 100644 --- a/resource/tasks.json +++ b/resource/tasks.json @@ -14707,6 +14707,7 @@ ], "next": [ "Sami@Roguelike@FoldartalGain", + "Sami@Roguelike@LastRewardChoose", "Sami@Roguelike@SquadConfirm#next" ] }, @@ -14772,6 +14773,10 @@ "黜", "黜人" ], + [ + "满", + "萨满" + ], [ "\"", "" @@ -14813,6 +14818,10 @@ [ "开始告", "开始宣告" + ], + [ + "^开始宣.*", + "开始宣告" ] ] }, @@ -14951,6 +14960,20 @@ "Sami@Roguelike@LastReward2": {}, "Sami@Roguelike@LastReward3": {}, "Sami@Roguelike@LastReward4": {}, + "Sami@Roguelike@LastRewardChoose": { + "action": "DoNothing", + "template": "Sami@Roguelike@LastRewardChoose.png", + "cache": false, + "roi": [ + 485, + 4, + 368, + 119 + ], + "next": [ + "Sami@Roguelike@SquadConfirm#next" + ] + }, "Sami@Roguelike@LastRewardConfirm": {}, "Sami@Roguelike@LastRewardRand": {}, "Sami@Roguelike@MapObject": { diff --git a/resource/template/Sami@Roguelike@LastRewardChoose.png b/resource/template/Sami@Roguelike@LastRewardChoose.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c46048e0b6fe940e4f204ba326e624917bcae8 GIT binary patch literal 4024 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 Q{33^tj=MNkI0VK27gU!zjsO4v literal 0 HcmV?d00001 diff --git a/src/MaaCore/MaaCore.vcxproj b/src/MaaCore/MaaCore.vcxproj index 2a423e8619..98a2b31cec 100644 --- a/src/MaaCore/MaaCore.vcxproj +++ b/src/MaaCore/MaaCore.vcxproj @@ -93,6 +93,7 @@ + @@ -271,6 +272,7 @@ + diff --git a/src/MaaCore/MaaCore.vcxproj.filters b/src/MaaCore/MaaCore.vcxproj.filters index 90b08de49c..1d0ccc2368 100644 --- a/src/MaaCore/MaaCore.vcxproj.filters +++ b/src/MaaCore/MaaCore.vcxproj.filters @@ -696,6 +696,9 @@ Source\Task\Roguelike + + Source\Task\Roguelike + @@ -1160,5 +1163,8 @@ Source\Task\Roguelike + + Source\Task\Roguelike + \ No newline at end of file diff --git a/src/MaaCore/Task/Interface/RoguelikeTask.cpp b/src/MaaCore/Task/Interface/RoguelikeTask.cpp index ef412e3d41..a0a7fb5737 100644 --- a/src/MaaCore/Task/Interface/RoguelikeTask.cpp +++ b/src/MaaCore/Task/Interface/RoguelikeTask.cpp @@ -12,8 +12,10 @@ #include "Task/Roguelike/RoguelikeDebugTaskPlugin.h" #include "Task/Roguelike/RoguelikeDifficultySelectionTaskPlugin.h" #include "Task/Roguelike/RoguelikeFoldartalGainTaskPlugin.h" +#include "Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.h" #include "Task/Roguelike/RoguelikeFoldartalUseTaskPlugin.h" #include "Task/Roguelike/RoguelikeFormationTaskPlugin.h" +#include "Task/Roguelike/RoguelikeInvestTaskPlugin.h" #include "Task/Roguelike/RoguelikeLastRewardTaskPlugin.h" #include "Task/Roguelike/RoguelikeRecruitTaskPlugin.h" #include "Task/Roguelike/RoguelikeResetTaskPlugin.h" @@ -22,7 +24,6 @@ #include "Task/Roguelike/RoguelikeSkillSelectionTaskPlugin.h" #include "Task/Roguelike/RoguelikeStageEncounterTaskPlugin.h" #include "Task/Roguelike/RoguelikeStrategyChangeTaskPlugin.h" -#include "Task/Roguelike/RoguelikeInvestTaskPlugin.h" #include "Utils/Logger.hpp" @@ -66,6 +67,7 @@ asst::RoguelikeTask::RoguelikeTask(const AsstCallback& callback, Assistant* inst m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); + m_roguelike_task_ptr->register_plugin(m_roguelike_config_ptr); // 这个任务如果卡住会放弃当前的肉鸽并重新开始,所以多添加一点。先这样凑合用 for (int i = 0; i != 100; ++i) { @@ -98,9 +100,26 @@ bool asst::RoguelikeTask::set_params(const json::value& params) // 是否凹指定干员开局直升 m_roguelike_config_ptr->set_start_with_elite_two(params.get("start_with_elite_two", false)); m_roguelike_config_ptr->set_only_start_with_elite_two(params.get("only_start_with_elite_two", false)); + + // 是否生活队凹开局板子 + m_roguelike_config_ptr->set_start_foldartal(params.contains("start_foldartal_list")); + + if (auto opt = params.find("start_foldartal_list"); opt) { + std::vector list; + for (const auto& name : *opt) { + if (std::string name_str = name.as_string(); !name_str.empty()) { + list.emplace_back(name_str); + } + } + if (list.empty()) { + Log.error(__FUNCTION__, "| Empty start_foldartal_list"); + return false; + } + m_roguelike_config_ptr->set_start_foldartal_list(std::move(list)); + } + m_roguelike_config_ptr->set_invest_maximum(params.get("investments_count", INT_MAX)); m_roguelike_config_ptr->set_invest_stop_when_full(params.get("stop_when_investment_full", false)); - // 设置层数选点策略,相关逻辑在 RoguelikeStrategyChangeTaskPlugin { Task.set_task_base(theme + "@Roguelike@Stages", theme + "@Roguelike@Stages_default"); diff --git a/src/MaaCore/Task/Roguelike/RoguelikeConfig.h b/src/MaaCore/Task/Roguelike/RoguelikeConfig.h index b2a623c002..6b1af3b701 100644 --- a/src/MaaCore/Task/Roguelike/RoguelikeConfig.h +++ b/src/MaaCore/Task/Roguelike/RoguelikeConfig.h @@ -51,23 +51,29 @@ namespace asst RoguelikeMode get_mode() const { return m_mode; } void set_difficulty(int difficulty) { m_difficulty = difficulty; } int get_difficulty() const { return m_difficulty; } - void set_start_with_elite_two(bool start_with_elite_two) { m_start_with_elite_two = start_with_elite_two; } + void set_start_with_elite_two(bool value) { m_start_with_elite_two = value; } bool get_start_with_elite_two() const { return m_start_with_elite_two; } void set_only_start_with_elite_two(bool value) { m_only_start_with_elite_two = value; } bool get_only_start_with_elite_two() const { return m_only_start_with_elite_two; } + void set_start_foldartal(bool start_foldartal) { m_start_foldartal = start_foldartal; } + bool get_start_foldartal() const { return m_start_foldartal; } + void set_start_foldartal_list(std::vector string) { m_start_foldartal_list = string; } + std::vector get_start_foldartal_list() const { return m_start_foldartal_list; } void set_invest_maximum(int value) { m_invest_maximum = value; } int get_invest_maximum() const { return m_invest_maximum; } void set_invest_stop_when_full(bool value) { m_invest_stop_when_full = value; } bool get_invest_stop_when_full() const { return m_invest_stop_when_full; } private: - std::string m_theme; // 主题 - RoguelikeMode m_mode = RoguelikeMode::Exp; // 模式 - int m_difficulty = 0; // 难度 - bool m_start_with_elite_two = false; // 在刷开局模式下凹开局干员精二直升 - bool m_only_start_with_elite_two = false; // 只凹开局干员精二直升且不进行作战 - int m_invest_maximum = 0; // 投资次数上限 - bool m_invest_stop_when_full = false; // 存款满了就停止 + std::string m_theme; // 主题 + RoguelikeMode m_mode = RoguelikeMode::Exp; // 模式 + int m_difficulty = 0; // 难度 + bool m_start_with_elite_two = false; // 在刷开局模式下凹开局干员精二直升 + bool m_only_start_with_elite_two = false; // 只凹开局干员精二直升且不进行作战 + bool m_start_foldartal = false; // 生活队凹开局密文板 + std::vector m_start_foldartal_list; // 需要凹的板子 + int m_invest_maximum = 0; // 投资次数上限 + bool m_invest_stop_when_full = false; // 存款满了就停止 /* 以下为每次重置 */ public: @@ -98,8 +104,8 @@ namespace asst int m_recruitment_count = 0; // 招募次数 bool m_recruitment_starts_complete = false; // 开局干员是否已经招募 bool m_recruitment_team_complete = false; // 阵容是否完备 - bool m_trader_no_longer_buy = false; - std::string m_core_char; // 开局干员名 + bool m_trader_no_longer_buy = false; // 不再购买藏品 + std::string m_core_char; // 开局干员名 bool m_team_full_without_rookie = false; bool m_use_support = false; // 开局干员是否为助战干员 bool m_use_nonfriend_support = false; // 是否可以是非好友助战干员 diff --git a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.cpp b/src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.cpp new file mode 100644 index 0000000000..1b6c464af9 --- /dev/null +++ b/src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.cpp @@ -0,0 +1,69 @@ +#include "RoguelikeFoldartalStartTaskPlugin.h" + +#include "Config/TaskData.h" +#include "Status.h" +#include "Task/ProcessTask.h" +#include "Utils/Logger.hpp" + +bool asst::RoguelikeFoldartalStartTaskPlugin::verify(AsstMsg msg, const json::value& details) const +{ + if (msg != AsstMsg::SubTaskStart || details.get("subtask", std::string()) != "ProcessTask") { + return false; + } + + if (!RoguelikeConfig::is_valid_theme(m_config->get_theme())) { + Log.error("Roguelike name doesn't exist!"); + return false; + } + if (m_config->get_theme() != RoguelikeTheme::Sami || m_config->get_difficulty() != INT_MAX || + !m_config->get_start_foldartal()) { + return false; + } + const std::string roguelike_name = m_config->get_theme() + "@"; + const std::string& task = details.get("details", "task", ""); + std::string_view task_view = task; + + if (task_view.starts_with(roguelike_name)) { + task_view.remove_prefix(roguelike_name.length()); + } + if (task_view == "Roguelike@LastRewardChoose") { + return true; + } + else { + return false; + } +} + +bool asst::RoguelikeFoldartalStartTaskPlugin::_run() +{ + LogTraceFunction; + + auto mode = m_config->get_mode(); + bool start_foldartal_checked = check_foldartals(); + + // 没有刷到需要的板子,退出重开 + if (mode == RoguelikeMode::Collectible && !start_foldartal_checked) { + m_config->set_difficulty(0); + Task.set_task_base("Roguelike@LastReward", "Roguelike@LastReward_restart"); + Task.set_task_base("Roguelike@LastReward4", "Roguelike@LastReward_restart"); + } + return true; +} + +bool asst::RoguelikeFoldartalStartTaskPlugin::check_foldartals() +{ + // 用户输入的需要的板子字符串 + const auto& extracted_foldartals = m_config->get_start_foldartal_list(); + const auto& all_foldartal = m_config->get_foldartal(); + + // 查找板子 + for (const auto& foldartal : extracted_foldartals) { + if (std::find(all_foldartal.begin(), all_foldartal.end(), foldartal) == all_foldartal.end()) { + // 如果板子没有找到,返回false + return false; + } + } + + // 如果所有板子都找到了,停止 + return true; +} diff --git a/src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.h b/src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.h new file mode 100644 index 0000000000..eb2a63eb23 --- /dev/null +++ b/src/MaaCore/Task/Roguelike/RoguelikeFoldartalStartTaskPlugin.h @@ -0,0 +1,21 @@ +#pragma once +#include "AbstractRoguelikeTaskPlugin.h" + +namespace asst +{ + class RoguelikeFoldartalStartTaskPlugin : public AbstractRoguelikeTaskPlugin + { + public: + using AbstractRoguelikeTaskPlugin::AbstractRoguelikeTaskPlugin; + virtual ~RoguelikeFoldartalStartTaskPlugin() override = default; + + public: + virtual bool verify(AsstMsg msg, const json::value& details) const override; + + protected: + virtual bool _run() override; + + private: + bool check_foldartals(); + }; +} diff --git a/src/MaaWpfGui/Constants/ConfigurationKeys.cs b/src/MaaWpfGui/Constants/ConfigurationKeys.cs index c3b5988e65..5481fbd37e 100644 --- a/src/MaaWpfGui/Constants/ConfigurationKeys.cs +++ b/src/MaaWpfGui/Constants/ConfigurationKeys.cs @@ -105,6 +105,8 @@ namespace MaaWpfGui.Constants public const string RoguelikeCoreChar = "Roguelike.CoreChar"; public const string RoguelikeStartWithEliteTwo = "Roguelike.RoguelikeStartWithEliteTwo"; public const string RoguelikeOnlyStartWithEliteTwo = "Roguelike.RoguelikeOnlyStartWithEliteTwo"; + public const string Roguelike3NewSquad2StartingFoldartal = "Roguelike.Roguelike3NewSquad2StartingFoldartal"; + public const string Roguelike3NewSquad2StartingFoldartals = "Roguelike.Roguelike3NewSquad2StartingFoldartals"; public const string RoguelikeUseSupportUnit = "Roguelike.RoguelikeUseSupportUnit"; public const string RoguelikeEnableNonfriendSupport = "Roguelike.RoguelikeEnableNonfriendSupport"; public const string RoguelikeDelayAbortUntilCombatComplete = "Roguelike.RoguelikeDelayAbortUntilCombatComplete"; diff --git a/src/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs index b7ba885ab4..f2dc189e50 100644 --- a/src/MaaWpfGui/Main/AsstProxy.cs +++ b/src/MaaWpfGui/Main/AsstProxy.cs @@ -2029,13 +2029,15 @@ namespace MaaWpfGui.Main /// TODO. /// 是否凹开局直升 /// 是否只凹开局直升,不进行作战 + /// 是否在萨米肉鸽生活队凹开局板子 + /// 需要凹的板子,用;连接的字符串 /// 是否core_char使用好友助战 /// 是否允许使用非好友助战 - /// 肉鸽名字。["Phantom", "Mizuki", "Sami"] + /// 肉鸽主题["Phantom", "Mizuki", "Sami"] /// 是否用骰子刷新商店购买特殊商品,目前支持水月肉鸽的指路鳞 /// 是否成功。 public bool AsstAppendRoguelike(int mode, int starts, bool investmentEnabled, bool investmentEnterSecondFloor, int invests, bool stopWhenFull, - string squad, string roles, string coreChar, bool startWithEliteTwo, bool onlyStartWithEliteTwo, bool useSupport, bool enableNonFriendSupport, string theme, bool refreshTraderWithDice) + string squad, string roles, string coreChar, bool startWithEliteTwo, bool onlyStartWithEliteTwo, bool roguelike3NewSquad2StartingFoldartal, string roguelike3NewSquad2StartingFoldartals, bool useSupport, bool enableNonFriendSupport, string theme, bool refreshTraderWithDice) { var taskParams = new JObject { @@ -2069,6 +2071,11 @@ namespace MaaWpfGui.Main taskParams["start_with_elite_two"] = mode == 4 && theme != "Phantom" && startWithEliteTwo; taskParams["only_start_with_elite_two"] = mode == 4 && theme != "Phantom" && startWithEliteTwo && onlyStartWithEliteTwo; + if (mode == 4 && theme == "Sami" && roguelike3NewSquad2StartingFoldartal && roguelike3NewSquad2StartingFoldartals.Length > 0) + { + taskParams["start_foldartal_list"] = new JArray(roguelike3NewSquad2StartingFoldartals.Trim().Split(';').Where(i => !string.IsNullOrEmpty(i)).Take(3)); + } + taskParams["use_support"] = useSupport; taskParams["use_nonfriend_support"] = enableNonFriendSupport; taskParams["refresh_trader_with_dice"] = theme == "Mizuki" && refreshTraderWithDice; diff --git a/src/MaaWpfGui/Res/Localizations/en-us.xaml b/src/MaaWpfGui/Res/Localizations/en-us.xaml index 88238dbb8f..51b7cc1dff 100644 --- a/src/MaaWpfGui/Res/Localizations/en-us.xaml +++ b/src/MaaWpfGui/Res/Localizations/en-us.xaml @@ -115,6 +115,8 @@ The agent entered「{0}」is not in battle_data. Check that the name entered is correct, or check the maa resource version. Repeat for「Starting Operator」Elite 2 Only Repeat for「Starting Operator」Elite 2, No Battle + Select 「Starting Operator」 from support unit list Enable non-friend support Don't abort Auto IS until the end of battle diff --git a/src/MaaWpfGui/Res/Localizations/ja-jp.xaml b/src/MaaWpfGui/Res/Localizations/ja-jp.xaml index 16541e4ff3..1ecba433b0 100644 --- a/src/MaaWpfGui/Res/Localizations/ja-jp.xaml +++ b/src/MaaWpfGui/Res/Localizations/ja-jp.xaml @@ -115,6 +115,8 @@ 入力のスタッフ「{0}」がbattle_dataにありません。入力の名前が正しいか、maaリソースのバージョンをチェックしてください。 「最初のオペレーター」直接昇進 指定オペレーターの昇進招集までリセマラし、戦闘を行わない + 生活队凹开局密文板 + 最多写三个,并用英文分号;隔开 「最初のオペレーター」をサポートから選択 フレンド以外のサポートの使用を許可 戦闘終了まえに「停止」を遅らせる diff --git a/src/MaaWpfGui/Res/Localizations/ko-kr.xaml b/src/MaaWpfGui/Res/Localizations/ko-kr.xaml index 09c31632cd..8996df9387 100644 --- a/src/MaaWpfGui/Res/Localizations/ko-kr.xaml +++ b/src/MaaWpfGui/Res/Localizations/ko-kr.xaml @@ -115,6 +115,8 @@ 입력한 하프「{0}」는 battle_data에 없습니다. 입력한 이름이 올바른지 확인하거나 maa 리소스 버전을 확인하십시오. 시작 오퍼레이터 2정예화까지 반복 시작 오퍼레이터 2정예화까지 반복(전투 X) + 生活队凹开局密文板 + 最多写三个,并用英文分号;隔开 시작 오퍼레이터로 지원 유닛 사용 친구가 아니어도 지원 유닛 사용 정지 시 전투 클리어 후 정지 diff --git a/src/MaaWpfGui/Res/Localizations/zh-cn.xaml b/src/MaaWpfGui/Res/Localizations/zh-cn.xaml index df35584904..0bc3671c50 100644 --- a/src/MaaWpfGui/Res/Localizations/zh-cn.xaml +++ b/src/MaaWpfGui/Res/Localizations/zh-cn.xaml @@ -115,6 +115,8 @@ 输入的干员「{0}」未在 battle_data 中,请检查输入的名称是否正确,或检查 maa 资源版本。 凹「开局干员」直升精二 只凹「开局干员」直升精二,不进行作战 + 生活队凹开局密文板 + 最多写三个,并用英文分号;隔开 「开局干员」使用助战 可以使用非好友助战 在战斗结束前延迟「停止」动作 diff --git a/src/MaaWpfGui/Res/Localizations/zh-tw.xaml b/src/MaaWpfGui/Res/Localizations/zh-tw.xaml index 6d6d9f3259..0b2f231afa 100644 --- a/src/MaaWpfGui/Res/Localizations/zh-tw.xaml +++ b/src/MaaWpfGui/Res/Localizations/zh-tw.xaml @@ -115,6 +115,8 @@ 輸入的幹員「{0}」未在 battle_data 中,請檢查輸入的名稱是否正確,或檢查 maa 資源版本。 凹「開局幹員」直升精二 只凹「開局幹員」直升精二,不進行作戰 + 生活隊凹開局密文板 + 最多寫三個,並用英文分號;隔開 「開局幹員」使用助戰 可以使用非好友助戰 在戰斗結束前延遲「停止」動作 diff --git a/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs b/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs index dedb4d666a..b6ca0e37d2 100644 --- a/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/SettingsViewModel.cs @@ -1987,6 +1987,33 @@ namespace MaaWpfGui.ViewModels.UI } } + private string _roguelike3NewSquad2StartingFoldartal = ConfigurationHelper.GetValue(ConfigurationKeys.Roguelike3NewSquad2StartingFoldartal, false.ToString()); + + /// + /// Gets or sets a value indicating whether core char need start with elite two. + /// + public bool Roguelike3NewSquad2StartingFoldartal + { + get => bool.Parse(_roguelike3NewSquad2StartingFoldartal); + set + { + SetAndNotify(ref _roguelike3NewSquad2StartingFoldartal, value.ToString()); + ConfigurationHelper.SetValue(ConfigurationKeys.Roguelike3NewSquad2StartingFoldartal, value.ToString()); + } + } + + private string _roguelike3NewSquad2StartingFoldartals = ConfigurationHelper.GetValue(ConfigurationKeys.Roguelike3NewSquad2StartingFoldartals, string.Empty); + + public string Roguelike3NewSquad2StartingFoldartals + { + get => _roguelike3NewSquad2StartingFoldartals; + set + { + SetAndNotify(ref _roguelike3NewSquad2StartingFoldartals, value); + ConfigurationHelper.SetValue(ConfigurationKeys.Roguelike3NewSquad2StartingFoldartals, value); + } + } + private string _roguelikeUseSupportUnit = ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeUseSupportUnit, false.ToString()); /// diff --git a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs index fc830e9752..6321b735e8 100644 --- a/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs +++ b/src/MaaWpfGui/ViewModels/UI/TaskQueueViewModel.cs @@ -1393,8 +1393,8 @@ namespace MaaWpfGui.ViewModels.UI mode, Instances.SettingsViewModel.RoguelikeStartsCount, Instances.SettingsViewModel.RoguelikeInvestmentEnabled, Instances.SettingsViewModel.RoguelikeInvestmentEnterSecondFloor, Instances.SettingsViewModel.RoguelikeInvestsCount, Instances.SettingsViewModel.RoguelikeStopWhenInvestmentFull, Instances.SettingsViewModel.RoguelikeSquad, Instances.SettingsViewModel.RoguelikeRoles, DataHelper.GetCharacterByNameOrAlias(Instances.SettingsViewModel.RoguelikeCoreChar)?.Name ?? Instances.SettingsViewModel.RoguelikeCoreChar, - Instances.SettingsViewModel.RoguelikeStartWithEliteTwo, Instances.SettingsViewModel.RoguelikeOnlyStartWithEliteTwo, Instances.SettingsViewModel.RoguelikeUseSupportUnit, - Instances.SettingsViewModel.RoguelikeEnableNonfriendSupport, Instances.SettingsViewModel.RoguelikeTheme, Instances.SettingsViewModel.RoguelikeRefreshTraderWithDice); + Instances.SettingsViewModel.RoguelikeStartWithEliteTwo, Instances.SettingsViewModel.RoguelikeOnlyStartWithEliteTwo, Instances.SettingsViewModel.Roguelike3NewSquad2StartingFoldartal, Instances.SettingsViewModel.Roguelike3NewSquad2StartingFoldartals, + Instances.SettingsViewModel.RoguelikeUseSupportUnit, Instances.SettingsViewModel.RoguelikeEnableNonfriendSupport, Instances.SettingsViewModel.RoguelikeTheme, Instances.SettingsViewModel.RoguelikeRefreshTraderWithDice); } private static bool AppendReclamation() diff --git a/src/MaaWpfGui/Views/UserControl/RoguelikeSettingsUserControl.xaml b/src/MaaWpfGui/Views/UserControl/RoguelikeSettingsUserControl.xaml index 585fbd343c..02a51402bf 100644 --- a/src/MaaWpfGui/Views/UserControl/RoguelikeSettingsUserControl.xaml +++ b/src/MaaWpfGui/Views/UserControl/RoguelikeSettingsUserControl.xaml @@ -123,7 +123,7 @@ + Visibility="{c:Binding 'RoguelikeMode == "4" and RoguelikeTheme != "Phantom" and RoguelikeSquad == "突击战术分队" or RoguelikeSquad == "堡垒战术分队" or RoguelikeSquad == "远程战术分队" or RoguelikeSquad == "破坏战术分队"'}"> - + + + + +