rft: Wpf肉鸽任务序列化 (#12124)

* rft(wpf): 肉鸽任务序列化

* perf: 部分参数设置简化
This commit is contained in:
status102
2025-03-14 16:25:38 +08:00
committed by GitHub
parent 1c0a7cefc6
commit afe4a2e6db
6 changed files with 398 additions and 285 deletions

View File

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

View File

@@ -2180,199 +2180,6 @@ namespace MaaWpfGui.Main
return AsstSetTaskParamsWithEncoding(id, taskParams);
}
/// <summary>
/// 无限刷肉鸽。
/// </summary>
/// <param name="mode">
/// 模式。可用值包括:
/// <list type="bullet">
/// <item>
/// <term><c>0</c></term>
/// <description>刷蜡烛,尽可能稳定地打更多层数。</description>
/// </item>
/// <item>
/// <term><c>1</c></term>
/// <description>刷源石锭,第一层投资完就退出。</description>
/// </item>
/// <item>
/// <term><c>2</c></term>
/// <description><b>【即将弃用】</b>两者兼顾,投资过后再退出,没有投资就继续往后打。</description>
/// </item>
/// <item>
/// <term><c>3</c></term>
/// <description><b>【开发中】</b>尝试通关,尽可能打的远。</description>
/// </item>
/// </list>
/// </param>
/// <param name="difficulty">刷投资的目标难度/其他模式的选择难度</param>
/// <param name="starts">开始探索次数。</param>
/// <param name="investmentEnabled">是否投资源石锭</param>
/// <param name="investmentWithMoreScore">投资时候刷更多分</param>
/// <param name="collectibleModeShopping">刷开局模式是否购物</param>
/// <param name="invests">投资源石锭次数。</param>
/// <param name="stopWhenFull">投资满了自动停止任务。</param>
/// <param name="collectibleModeSquad">烧水时使用的分队</param>
/// <param name="squad">开局分队</param>
/// <param name="roles">开局职业组</param>
/// <param name="coreChar">开局干员名</param>
/// <param name="startWithEliteTwo">是否凹开局直升</param>
/// <param name="onlyStartWithEliteTwo">是否只凹开局直升,不进行作战</param>
/// <param name="startWithSelectList">需要刷的开局</param>
/// <param name="roguelike3FirstFloorFoldartal">凹第一层远见板子</param>
/// <param name="roguelike3StartFloorFoldartal">需要凹的板子</param>
/// <param name="roguelike3NewSquad2StartingFoldartal">是否在萨米肉鸽生活队凹开局板子</param>
/// <param name="roguelike3NewSquad2StartingFoldartals">需要凹的板子,用;连接的字符串</param>
/// <param name="roguelikeExpectedCollapsalParadigms">sami 刷坍缩专用,需要刷的坍缩列表</param>
/// <param name="useSupport">是否core_char使用好友助战</param>
/// <param name="enableNonFriendSupport">是否允许使用非好友助战</param>
/// <param name="theme">肉鸽主题["Phantom", "Mizuki", "Sami", "Sarkaz"]</param>
/// <param name="refreshTraderWithDice">是否用骰子刷新商店购买特殊商品,目前支持水月肉鸽的指路鳞</param>
/// <param name="stopAtFinalBoss">是否在五层BOSS前停下来</param>
/// <param name="monthlySquadAutoIterate">是否启动月度小队自动切换</param>
/// <param name="monthlySquadCheckComms">是否将月度小队通信也作为切换依据</param>
/// <param name="deepExplorationAutoIterate">是否启动深入调查自动切换</param>
/// <param name="stopAtMaxLevel">是否在满级时停止任务</param>
/// <param name="startWithSeed">是否使用刷钱种子</param>
/// <returns>是否成功。</returns>
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<string> 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<string, string>
{
{ "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;
}
/// <summary>
/// 公招识别。
/// </summary>

View File

@@ -0,0 +1,281 @@
// <copyright file="AsstRoguelikeTask.cs" company="MaaAssistantArknights">
// 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
// </copyright>
#nullable enable
using System.Collections.Generic;
using MaaWpfGui.Services;
using MaaWpfGui.ViewModels.UserControl.TaskQueue;
using Newtonsoft.Json.Linq;
namespace MaaWpfGui.Models.AsstTasks;
/// <summary>
/// 肉鸽任务
/// </summary>
public class AsstRoguelikeTask : AsstBaseTask
{
public override AsstTaskType TaskType => AsstTaskType.Roguelike;
/// <summary>
/// Gets or sets 模式。可用值包括:
/// <list type="bullet">
/// <item>
/// <term><c>0</c></term>
/// <description>刷蜡烛,尽可能稳定地打更多层数。</description>
/// </item>
/// <item>
/// <term><c>1</c></term>
/// <description>刷源石锭,第一层投资完就退出。</description>
/// </item>
/// <item>
/// <term><c>2</c></term>
/// <description><b>【即将弃用】</b>两者兼顾,投资过后再退出,没有投资就继续往后打。</description>
/// </item>
/// <item>
/// <term><c>3</c></term>
/// <description><b>【开发中】</b>尝试通关,尽可能打的远。</description>
/// </item>
/// </list>
/// </summary>
public int Mode { get; set; }
/// <summary>
/// Gets or sets 刷投资的目标难度/其他模式的选择难度
/// </summary>
public int Difficulty { get; set; }
/// <summary>
/// Gets or sets 开始探索次数
/// </summary>
public int Starts { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 是否投资源石锭
/// </summary>
public bool InvestmentEnabled { get; set; }
/// <summary>
/// Gets or sets 投资源石锭次数
/// </summary>
public int InvestmentCount { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 投资时候刷更多分
/// </summary>
public bool InvestmentWithMoreScore { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 投资满了自动停止任务
/// </summary>
public bool InvestmentStopWhenFull { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 刷开局模式是否购物
/// </summary>
public bool CollectibleModeShopping { get; set; }
/// <summary>
/// Gets or sets 烧水时使用的分队
/// </summary>
public string CollectibleModeSquad { get; set; } = string.Empty;
/// <summary>
/// Gets or sets 开局分队
/// </summary>
public string Squad { get; set; } = string.Empty;
/// <summary>
/// Gets or sets 开局职业组
/// </summary>
public string Roles { get; set; } = string.Empty;
/// <summary>
/// Gets or sets 开局干员名
/// </summary>
public string CoreChar { get; set; } = string.Empty;
/// <summary>
/// Gets or sets a value indicating whether 是否凹开局直升
/// </summary>
public bool StartWithEliteTwo { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 是否只凹开局直升,不进行作战
/// </summary>
public bool StartWithEliteTwoNonBattle { get; set; }
/// <summary>
/// Gets or sets 需要刷的开局
/// </summary>
public Dictionary<string, bool> CollectibleModeStartRewards { get; set; } = [];
/// <summary>
/// Gets or sets a value indicating whether 凹第一层远见板子
/// </summary>
public bool SamiFirstFloorFoldartal { get; set; }
/// <summary>
/// Gets or sets 需要凹的板子
/// </summary>
public string SamiStartFloorFoldartal { get; set; } = string.Empty;
/// <summary>
/// Gets or sets a value indicating whether 是否在萨米肉鸽生活队凹开局板子
/// </summary>
public bool SamiNewSquad2StartingFoldartal { get; set; }
/// <summary>
/// Gets or sets 需要凹的板子
/// </summary>
public List<string> SamiNewSquad2StartingFoldartals { get; set; } = [];
/// <summary>
/// Gets or sets 萨米刷坍缩专用,需要刷的坍缩列表
/// </summary>
public List<string> ExpectedCollapsalParadigms { get; set; } = [];
/// <summary>
/// Gets or sets a value indicating whether 是否core_char使用好友助战
/// </summary>
public bool UseSupport { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 是否允许使用非好友助战
/// </summary>
public bool UseSupportNonFriend { get; set; }
/// <summary>
/// Gets or sets 肉鸽主题
/// </summary>
public RoguelikeTheme Theme { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 是否用骰子刷新商店购买特殊商品,目前支持水月肉鸽的指路鳞
/// </summary>
public bool RefreshTraderWithDice { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 是否启动月度小队自动切换
/// </summary>
public bool MonthlySquadAutoIterate { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 是否将月度小队通信也作为切换依据
/// </summary>
public bool MonthlySquadCheckComms { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 是否启动深入调查自动切换
/// </summary>
public bool DeepExplorationAutoIterate { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 是否在五层BOSS前停下来
/// </summary>
public bool StopAtFinalBoss { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 是否在满级时停止任务
/// </summary>
public bool StopAtMaxLevel { get; set; }
/// <summary>
/// Gets or sets a value indicating whether 是否使用刷钱种子
/// </summary>
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);
}
}

View File

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

View File

@@ -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
/// <summary>
/// Gets or sets a value indicating whether core char need start with elite two.
/// </summary>
public bool RoguelikeStartWithEliteTwoRaw
public bool RoguelikeStartWithEliteTwo
{
get => _roguelikeStartWithEliteTwo;
set
@@ -456,11 +452,6 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel
}
}
/// <summary>
/// Gets a value indicating whether core char need start with elite two.
/// </summary>
public bool RoguelikeStartWithEliteTwo => _roguelikeStartWithEliteTwo && RoguelikeSquadIsProfessional;
private bool _roguelikeOnlyStartWithEliteTwo = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.RoguelikeOnlyStartWithEliteTwo, bool.FalseString));
/// <summary>
@@ -479,7 +470,7 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel
/// <summary>
/// Gets a value indicating whether only need with elite two's core char.
/// </summary>
public bool RoguelikeOnlyStartWithEliteTwo => _roguelikeOnlyStartWithEliteTwo && RoguelikeStartWithEliteTwo;
public bool RoguelikeOnlyStartWithEliteTwo => _roguelikeOnlyStartWithEliteTwo && _roguelikeStartWithEliteTwo && RoguelikeSquadIsProfessional;
public static Dictionary<string, string> 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<string, string>(s, RoguelikeStartWithAllDict[s]))
@@ -511,14 +502,14 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel
}
}
public List<string> RoguelikeStartWithSelectList => (RoguelikeMode == 4 && !RoguelikeOnlyStartWithEliteTwo) ? _roguelikeStartWithSelectListRaw.Cast<KeyValuePair<string, string>>().Select(pair => pair.Key).ToList() : [];
public List<string> RoguelikeStartWithSelectList => _roguelikeStartWithSelectListRaw.Cast<KeyValuePair<string, string>>().Select(pair => pair.Key).ToList();
private bool _roguelike3FirstFloorFoldartal = Convert.ToBoolean(ConfigurationHelper.GetValue(ConfigurationKeys.Roguelike3FirstFloorFoldartal, bool.FalseString));
/// <summary>
/// Gets or sets a value indicating whether core char need start with elite two.
/// </summary>
public bool Roguelike3FirstFloorFoldartalRaw
public bool Roguelike3FirstFloorFoldartal
{
get => _roguelike3FirstFloorFoldartal;
set
@@ -528,20 +519,16 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel
}
}
/// <summary>
/// Gets a value indicating whether core char need start with elite two.
/// </summary>
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
/// <summary>
/// Gets or sets a value indicating whether core char need start with elite two.
/// </summary>
public bool Roguelike3NewSquad2StartingFoldartalRaw
public bool Roguelike3NewSquad2StartingFoldartal
{
get => _roguelike3NewSquad2StartingFoldartal;
set
@@ -560,24 +547,20 @@ public class RoguelikeSettingsUserControlModel : TaskViewModel
}
}
/// <summary>
/// Gets a value indicating whether core char need start with elite two.
/// </summary>
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();
/// <summary>
/// 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);
/// <summary>
/// Gets or sets the start count of roguelike.
/// </summary>
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);
/// <summary>
/// Gets or sets the invests count of roguelike.
/// </summary>
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));
/// <summary>
/// Gets or sets a value indicating whether start with seed when investing in Sarkaz.
/// </summary>
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<string, string>
{
{ "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

View File

@@ -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" />
<hc:ComboBox
Margin="0,5"
@@ -153,7 +153,7 @@
Visibility="{c:Binding 'RoguelikeTheme == task:RoguelikeTheme.Mizuki'}" />
<CheckBox
Margin="0,10"
IsChecked="{Binding RoguelikeStartWithEliteTwoRaw}"
IsChecked="{Binding RoguelikeStartWithEliteTwo}"
Visibility="{c:Binding 'RoguelikeMode == 4 and RoguelikeTheme != task:RoguelikeTheme.Phantom and RoguelikeSquad == &quot;突击战术分队&quot; or RoguelikeSquad == &quot;堡垒战术分队&quot; or RoguelikeSquad == &quot;远程战术分队&quot; or RoguelikeSquad == &quot;破坏战术分队&quot;'}">
<TextBlock
Block.TextAlignment="Left"
@@ -163,7 +163,7 @@
<CheckBox
Margin="0,10"
IsChecked="{Binding RoguelikeOnlyStartWithEliteTwoRaw}"
Visibility="{c:Binding 'RoguelikeStartWithEliteTwoRaw and RoguelikeMode == 4 and RoguelikeTheme != task:RoguelikeTheme.Phantom'}">
Visibility="{c:Binding 'RoguelikeStartWithEliteTwo and RoguelikeMode == 4 and RoguelikeTheme != task:RoguelikeTheme.Phantom'}">
<TextBlock
Block.TextAlignment="Left"
Text="{DynamicResource RoguelikeOnlyStartWithEliteTwo}"
@@ -180,7 +180,7 @@
Visibility="{c:Binding 'RoguelikeMode == 4 and !RoguelikeOnlyStartWithEliteTwoRaw'}" />
<CheckBox
Margin="0,10"
IsChecked="{Binding Roguelike3FirstFloorFoldartalRaw}"
IsChecked="{Binding Roguelike3FirstFloorFoldartal}"
Visibility="{c:Binding 'RoguelikeMode == 4 and RoguelikeTheme == task:RoguelikeTheme.Sami'}">
<TextBlock
Block.TextAlignment="Left"
@@ -191,11 +191,11 @@
IsReadOnly="{c:Binding !Idle,
Source={x:Static setting:TaskQueueViewModel.TaskSettingDataContext}}"
Style="{StaticResource TextBoxExtend}"
Text="{Binding Roguelike3StartFloorFoldartal, UpdateSourceTrigger=LostFocus}"
Visibility="{c:Binding 'Roguelike3FirstFloorFoldartalRaw and RoguelikeMode == 4 and RoguelikeTheme == task:RoguelikeTheme.Sami'}" />
Text="{Binding Roguelike3FirstFloorFoldartals}"
Visibility="{c:Binding 'Roguelike3FirstFloorFoldartal and RoguelikeMode == 4 and RoguelikeTheme == task:RoguelikeTheme.Sami'}" />
<CheckBox
Margin="0,10"
IsChecked="{Binding Roguelike3NewSquad2StartingFoldartalRaw}"
IsChecked="{Binding Roguelike3NewSquad2StartingFoldartal}"
Visibility="{c:Binding 'RoguelikeMode == 4 and RoguelikeTheme == task:RoguelikeTheme.Sami and RoguelikeSquad == &quot;生活至上分队&quot; '}">
<TextBlock
Block.TextAlignment="Left"
@@ -205,14 +205,14 @@
<TextBox
IsReadOnly="{c:Binding !Idle,
Source={x:Static setting:TaskQueueViewModel.TaskSettingDataContext}}"
Text="{Binding Roguelike3NewSquad2StartingFoldartals, UpdateSourceTrigger=LostFocus}"
Text="{Binding Roguelike3NewSquad2StartingFoldartals}"
ToolTip="{DynamicResource Roguelike3NewSquad2StartingFoldartalTip}"
Visibility="{c:Binding 'Roguelike3NewSquad2StartingFoldartalRaw and RoguelikeMode == 4 and RoguelikeTheme == task:RoguelikeTheme.Sami and RoguelikeSquad == &quot;生活至上分队&quot; '}" />
Visibility="{c:Binding 'Roguelike3NewSquad2StartingFoldartal and RoguelikeMode == 4 and RoguelikeTheme == task:RoguelikeTheme.Sami and RoguelikeSquad == &quot;生活至上分队&quot; '}" />
<hc:TextBox
hc:InfoElement.Title="{DynamicResource RoguelikeCollapseList}"
IsReadOnly="{c:Binding !Idle,
Source={x:Static setting:TaskQueueViewModel.TaskSettingDataContext}}"
Text="{Binding RoguelikeExpectedCollapsalParadigms, UpdateSourceTrigger=LostFocus}"
Text="{Binding RoguelikeExpectedCollapsalParadigms}"
ToolTip="{DynamicResource RoguelikeCollapseListTip}"
Visibility="{c:Binding 'RoguelikeMode == 5'}" />
<CheckBox Margin="0,10" IsChecked="{Binding RoguelikeUseSupportUnit}">
@@ -277,7 +277,7 @@
</CheckBox>
<!--<CheckBox
Margin="0,10"
IsChecked="{Binding RoguelikeStartWithSeedRaw}"
IsChecked="{Binding RoguelikeStartWithSeed}"
Visibility="{c:Binding 'RoguelikeMode == 1 and RoguelikeTheme == task:RoguelikeTheme.Sarkaz and (RoguelikeSquad == &quot;点刺成锭分队&quot; or RoguelikeSquad == &quot;后勤分队&quot;)'}">
<TextBlock
Block.TextAlignment="Left"