From 167ac2d2d5f32ebf91ecde4177d50f8554fe1b37 Mon Sep 17 00:00:00 2001
From: uye <99072975+ABA2396@users.noreply.github.com>
Date: Thu, 31 Jul 2025 15:04:13 +0800
Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=88=90=E5=B0=B1?=
=?UTF-8?q?=E6=8E=92=E5=BA=8F=E4=B8=8E=E6=8F=8F=E8=BF=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/MaaWpfGui/Constants/AchievementIds.cs | 9 ++
.../Helper/AchievementTrackerHelper.cs | 128 +++++++++---------
src/MaaWpfGui/Main/AsstProxy.cs | 4 +-
src/MaaWpfGui/Models/Achievement.cs | 7 +-
src/MaaWpfGui/Res/Localizations/zh-cn.xaml | 62 ++++-----
5 files changed, 113 insertions(+), 97 deletions(-)
diff --git a/src/MaaWpfGui/Constants/AchievementIds.cs b/src/MaaWpfGui/Constants/AchievementIds.cs
index 83629ef537..badcb950de 100644
--- a/src/MaaWpfGui/Constants/AchievementIds.cs
+++ b/src/MaaWpfGui/Constants/AchievementIds.cs
@@ -31,8 +31,12 @@ namespace MaaWpfGui.Constants
public const string RoguelikeGamePass1 = "RoguelikeGamePass1";
public const string RoguelikeGamePass2 = "RoguelikeGamePass2";
public const string RoguelikeGamePass3 = "RoguelikeGamePass3";
+
+ public const string RoguelikeGroup = "Roguelike";
public const string RoguelikeRetreat = "RoguelikeRetreat";
public const string RoguelikeGoldMax = "RoguelikeGoldMax";
+
+ public const string RoguelikeNGroup = "RoguelikeN";
public const string RoguelikeN04 = "RoguelikeN04";
public const string RoguelikeN08 = "RoguelikeN08";
public const string RoguelikeN12 = "RoguelikeN12";
@@ -50,11 +54,13 @@ namespace MaaWpfGui.Constants
public const string ScheduleMaster1 = "ScheduleMaster1";
public const string ScheduleMaster2 = "ScheduleMaster2";
+ public const string MirrorChyanGroup = "MirrorChyan";
public const string MirrorChyanFirstUse = "MirrorChyanFirstUse";
public const string MirrorChyanCdkError = "MirrorChyanCdkError";
public const string MosquitoLeg = "MosquitoLeg";
+ public const string PioneerGroup = "Pioneer";
public const string Pioneer1 = "Pioneer1";
public const string Pioneer2 = "Pioneer2";
public const string Pioneer3 = "Pioneer3";
@@ -89,9 +95,11 @@ namespace MaaWpfGui.Constants
public const string TacticalRetreat = "TacticalRetreat";
public const string Martian = "Martian";
+ public const string RecruitGroup = "Recruit";
public const string RecruitNoSixStar = "RecruitNoSixStar";
public const string RecruitNoSixStarStreak = "RecruitNoSixStarStreak";
+ public const string SnapshotChallengeGroup = "SnapshotChallenge"; // 累计型成就
public const string SnapshotChallenge1 = "SnapshotChallenge1"; // 999
public const string SnapshotChallenge2 = "SnapshotChallenge2"; // 800
public const string SnapshotChallenge3 = "SnapshotChallenge3"; // 400
@@ -133,6 +141,7 @@ namespace MaaWpfGui.Constants
public const string VersionClick = "VersionClick";
public const string Lucky = "Lucky";
+ public const string LoginGroup = "Login";
public const string AprilFools = "AprilFools";
public const string MidnightLaunch = "MidnightLaunch";
public const string LunarNewYear = "LunarNewYear";
diff --git a/src/MaaWpfGui/Helper/AchievementTrackerHelper.cs b/src/MaaWpfGui/Helper/AchievementTrackerHelper.cs
index 94673fd1ee..526cf24f57 100644
--- a/src/MaaWpfGui/Helper/AchievementTrackerHelper.cs
+++ b/src/MaaWpfGui/Helper/AchievementTrackerHelper.cs
@@ -139,8 +139,9 @@ namespace MaaWpfGui.Helper
{
Achievements = _achievements
.OrderByDescending(kv => kv.Value.IsUnlocked) // 已解锁优先
- .ThenBy(kv => !kv.Value.IsNewUnlock) // 新解锁的排前面
+ .ThenByDescending(kv => kv.Value.IsNewUnlock) // 新解锁的排前面
.ThenBy(kv => kv.Value.Category) // 按类别分组
+ .ThenBy(kv => kv.Value.Group)
.ThenBy(kv => kv.Value.Id) // 最后按 Id
.ToDictionary(kv => kv.Key, kv => kv.Value);
}
@@ -306,7 +307,7 @@ namespace MaaWpfGui.Helper
public void AddProgressToGroup(string groupPrefix, int amount = 1)
{
- foreach (var achievement in _achievements.Values.Where(achievement => achievement.Id.StartsWith(groupPrefix)))
+ foreach (var achievement in _achievements.Values.Where(achievement => achievement.Group == groupPrefix))
{
AddProgress(achievement.Id, amount);
}
@@ -326,7 +327,7 @@ namespace MaaWpfGui.Helper
public void SetProgressToGroup(string groupPrefix, int progress)
{
- foreach (var achievement in _achievements.Values.Where(achievement => achievement.Id.StartsWith(groupPrefix)))
+ foreach (var achievement in _achievements.Values.Where(achievement => achievement.Group == groupPrefix))
{
SetProgress(achievement.Id, progress);
}
@@ -371,26 +372,26 @@ namespace MaaWpfGui.Helper
#region 工厂函数
- private static Achievement BasicUsage(string id, int? target = null, bool isHidden = false, bool isRare = false)
- => new() { Id = id, Target = target ?? default, IsHidden = isHidden, Category = AchievementCategory.BasicUsage, IsRare = isRare };
+ private static Achievement BasicUsage(string id, string group = "", int? target = null, bool isHidden = false, bool isRare = false)
+ => new() { Id = id, Group = group, Target = target ?? 0, IsHidden = isHidden, Category = AchievementCategory.BasicUsage, IsRare = isRare };
- private static Achievement FeatureExploration(string id, int? target = null, bool isHidden = false, bool isRare = false)
- => new() { Id = id, Target = target ?? default, IsHidden = isHidden, Category = AchievementCategory.FeatureExploration, IsRare = isRare };
+ private static Achievement FeatureExploration(string id, string group = "", int? target = null, bool isHidden = false, bool isRare = false)
+ => new() { Id = id, Group = group, Target = target ?? 0, IsHidden = isHidden, Category = AchievementCategory.FeatureExploration, IsRare = isRare };
- private static Achievement AutoBattle(string id, int? target = null, bool isHidden = false, bool isRare = false)
- => new() { Id = id, Target = target ?? default, IsHidden = isHidden, Category = AchievementCategory.AutoBattle, IsRare = isRare };
+ private static Achievement AutoBattle(string id, string group = "", int? target = null, bool isHidden = false, bool isRare = false)
+ => new() { Id = id, Group = group, Target = target ?? 0, IsHidden = isHidden, Category = AchievementCategory.AutoBattle, IsRare = isRare };
- private static Achievement Humor(string id, int? target = null, bool isHidden = false, bool isRare = false)
- => new() { Id = id, Target = target ?? default, IsHidden = isHidden, Category = AchievementCategory.Humor, IsRare = isRare };
+ private static Achievement Humor(string id, string group = "", int? target = null, bool isHidden = false, bool isRare = false)
+ => new() { Id = id, Group = group, Target = target ?? 0, IsHidden = isHidden, Category = AchievementCategory.Humor, IsRare = isRare };
- private static Achievement BugRelated(string id, int? target = null, bool isHidden = false, bool isRare = false)
- => new() { Id = id, Target = target ?? default, IsHidden = isHidden, Category = AchievementCategory.BugRelated, IsRare = isRare };
+ private static Achievement BugRelated(string id, string group = "", int? target = null, bool isHidden = false, bool isRare = false)
+ => new() { Id = id, Group = group, Target = target ?? 0, IsHidden = isHidden, Category = AchievementCategory.BugRelated, IsRare = isRare };
- private static Achievement Behavior(string id, int? target = null, bool isHidden = false, bool isRare = false)
- => new() { Id = id, Target = target ?? default, IsHidden = isHidden, Category = AchievementCategory.Behavior, IsRare = isRare };
+ private static Achievement Behavior(string id, string group = "", int? target = null, bool isHidden = false, bool isRare = false)
+ => new() { Id = id, Group = group, Target = target ?? 0, IsHidden = isHidden, Category = AchievementCategory.Behavior, IsRare = isRare };
- private static Achievement EasterEgg(string id, int? target = null, bool isHidden = false, bool isRare = false)
- => new() { Id = id, Target = target ?? default, IsHidden = isHidden, Category = AchievementCategory.EasterEgg, IsRare = isRare };
+ private static Achievement EasterEgg(string id, string group = "", int? target = null, bool isHidden = false, bool isRare = false)
+ => new() { Id = id, Group = group, Target = target ?? 0, IsHidden = isHidden, Category = AchievementCategory.EasterEgg, IsRare = isRare };
#endregion
@@ -398,73 +399,76 @@ namespace MaaWpfGui.Helper
[
#region 基础使用类
- BasicUsage(id: AchievementIds.SanitySpender1, target: 10), // 刷理智次数
- BasicUsage(id: AchievementIds.SanitySpender2, target: 100),
- BasicUsage(id: AchievementIds.SanitySpender3, target: 1000),
+ BasicUsage(id: AchievementIds.SanitySpender1, group: AchievementIds.SanitySpenderGroup, target: 10), // 刷理智次数
+ BasicUsage(id: AchievementIds.SanitySpender2, group: AchievementIds.SanitySpenderGroup, target: 100),
+ BasicUsage(id: AchievementIds.SanitySpender3, group: AchievementIds.SanitySpenderGroup, target: 1000),
- BasicUsage(id: AchievementIds.SanitySaver1, target: 1), // 使用理智药数
- BasicUsage(id: AchievementIds.SanitySaver2, target: 10),
- BasicUsage(id: AchievementIds.SanitySaver3, target: 50),
+ BasicUsage(id: AchievementIds.SanitySaver1, group: AchievementIds.SanitySaverGroup, target: 1), // 使用理智药数
+ BasicUsage(id: AchievementIds.SanitySaver2, group: AchievementIds.SanitySaverGroup, target: 10),
+ BasicUsage(id: AchievementIds.SanitySaver3, group: AchievementIds.SanitySaverGroup, target: 50),
+
+ BasicUsage(id: AchievementIds.RoguelikeGamePass1, group: AchievementIds.RoguelikeGamePassGroup, target: 1), // 使用牛牛通关肉鸽
+ BasicUsage(id: AchievementIds.RoguelikeGamePass2, group: AchievementIds.RoguelikeGamePassGroup, target: 5),
+ BasicUsage(id: AchievementIds.RoguelikeGamePass3, group: AchievementIds.RoguelikeGamePassGroup, target: 10),
+
+ BasicUsage(id: AchievementIds.RoguelikeN04, group: AchievementIds.RoguelikeNGroup), // 肉鸽 难度 通关
+ BasicUsage(id: AchievementIds.RoguelikeN08, group: AchievementIds.RoguelikeNGroup),
+ BasicUsage(id: AchievementIds.RoguelikeN12, group: AchievementIds.RoguelikeNGroup),
+ BasicUsage(id: AchievementIds.RoguelikeN15, group: AchievementIds.RoguelikeNGroup, isRare: true),
+
+ BasicUsage(id: AchievementIds.RoguelikeRetreat, group: AchievementIds.RoguelikeGroup, target: 100), // 牛牛放弃探索 100 次
+ BasicUsage(id: AchievementIds.RoguelikeGoldMax, group: AchievementIds.RoguelikeGroup, target: 999), // 肉鸽源石锭到达 999
BasicUsage(id: AchievementIds.FirstLaunch), // 首次启动
BasicUsage(id: AchievementIds.SanityExpire, target: 8), // 单次消耗 8 瓶快过期的理智药
BasicUsage(id: AchievementIds.OverLimitAgent, target: 100, isHidden: true), // 单次代理 100 关
-
- BasicUsage(id: AchievementIds.RoguelikeGamePass1, target: 1), // 使用牛牛通关肉鸽
- BasicUsage(id: AchievementIds.RoguelikeGamePass2, target: 5),
- BasicUsage(id: AchievementIds.RoguelikeGamePass3, target: 10),
- BasicUsage(id: AchievementIds.RoguelikeRetreat, target: 100), // 牛牛放弃探索 100 次
- BasicUsage(id: AchievementIds.RoguelikeGoldMax, target: 999), // 肉鸽源石锭到达 999
- BasicUsage(id: AchievementIds.RoguelikeN04), // 肉鸽 难度 通关
- BasicUsage(id: AchievementIds.RoguelikeN08),
- BasicUsage(id: AchievementIds.RoguelikeN12),
- BasicUsage(id: AchievementIds.RoguelikeN15, isRare: true),
#endregion
#region 功能探索类
- FeatureExploration(id: AchievementIds.ScheduleMaster1, target: 1), // 定时执行
- FeatureExploration(id: AchievementIds.ScheduleMaster2, target: 100),
+ FeatureExploration(id: AchievementIds.ScheduleMaster1, group: AchievementIds.ScheduleMasterGroup, target: 1), // 定时执行
+ FeatureExploration(id: AchievementIds.ScheduleMaster2, group: AchievementIds.ScheduleMasterGroup, target: 100),
- FeatureExploration(id: AchievementIds.MirrorChyanFirstUse, isHidden: true), // 第一次成功使用 MirrorChyan 下载
- FeatureExploration(id: AchievementIds.MirrorChyanCdkError, isHidden: true), // MirrorChyan CDK 错误
+ FeatureExploration(id: AchievementIds.MirrorChyanFirstUse, group: AchievementIds.MirrorChyanGroup, isHidden: true), // 第一次成功使用 MirrorChyan 下载
+ FeatureExploration(id: AchievementIds.MirrorChyanCdkError, group: AchievementIds.MirrorChyanGroup, isHidden: true), // MirrorChyan CDK 错误
- FeatureExploration(id: AchievementIds.Pioneer1), // 将 MAA 更新至公测版
- FeatureExploration(id: AchievementIds.Pioneer2, isHidden: true), // 将 MAA 更新至内测版(隐藏)
- FeatureExploration(id: AchievementIds.Pioneer3, isHidden: true), // 使用未发布版本的 MAA(隐藏)
+ FeatureExploration(id: AchievementIds.Pioneer1, group: AchievementIds.PioneerGroup), // 将 MAA 更新至公测版
+ FeatureExploration(id: AchievementIds.Pioneer2, group: AchievementIds.PioneerGroup, isHidden: true), // 将 MAA 更新至内测版(隐藏)
+ FeatureExploration(id: AchievementIds.Pioneer3, group: AchievementIds.PioneerGroup, isHidden: true), // 使用未发布版本的 MAA(隐藏)
FeatureExploration(id: AchievementIds.MosquitoLeg, target: 5), // 使用「借助战打 OF-1」功能超过 5 次
-
FeatureExploration(id: AchievementIds.RealGacha, isHidden: true), // 真正的抽卡
FeatureExploration(id: AchievementIds.PeekScreen, isHidden: true), // 窥屏
FeatureExploration(id: AchievementIds.CustomizationMaster, isHidden: true), // 自定义背景
#endregion
#region 自动战斗
- AutoBattle(id: AchievementIds.UseCopilot1, target: 1), // 自动战斗
- AutoBattle(id: AchievementIds.UseCopilot2, target: 10),
- AutoBattle(id: AchievementIds.UseCopilot3, target: 100),
- AutoBattle(id: AchievementIds.CopilotLikeGiven1, target: 1), // 点赞 1 次
- AutoBattle(id: AchievementIds.CopilotLikeGiven2, target: 10), // 点赞 10 次
- AutoBattle(id: AchievementIds.CopilotLikeGiven3, target: 50), // 点赞 50 次
- AutoBattle(id: AchievementIds.CopilotError), // 代理作战出现失误
+ AutoBattle(id: AchievementIds.UseCopilot1, group: AchievementIds.UseCopilotGroup, target: 1), // 自动战斗
+ AutoBattle(id: AchievementIds.UseCopilot2, group: AchievementIds.UseCopilotGroup, target: 10),
+ AutoBattle(id: AchievementIds.UseCopilot3, group: AchievementIds.UseCopilotGroup, target: 100),
+ AutoBattle(id: AchievementIds.CopilotLikeGiven1, group: AchievementIds.CopilotLikeGroup, target: 1), // 点赞 1 次
+ AutoBattle(id: AchievementIds.CopilotLikeGiven2, group: AchievementIds.CopilotLikeGroup, target: 10), // 点赞 10 次
+ AutoBattle(id: AchievementIds.CopilotLikeGiven3, group: AchievementIds.CopilotLikeGroup, target: 50), // 点赞 50 次
+
+ AutoBattle(id: AchievementIds.CopilotError), // 代理作战出现失误
AutoBattle(id: AchievementIds.MapOutdated, isHidden: true), // 提示需要更新地图资源
AutoBattle(id: AchievementIds.Irreplaceable, isHidden: true), // 自动编队缺少至少两名干员
#endregion
#region 搞笑/梗类成就
- Humor(id: AchievementIds.SnapshotChallenge1, isHidden: true), // 平均截图用时超过 800ms(高 ping 战士)
- Humor(id: AchievementIds.SnapshotChallenge2, isHidden: true), // 平均截图用时在 400ms 到 800ms 之间(是不是有点太慢了)
- Humor(id: AchievementIds.SnapshotChallenge3), // 平均截图用时小于 400ms(截图挑战 · Normal)
- Humor(id: AchievementIds.SnapshotChallenge4), // 平均截图用时小于 100ms(截图挑战 · Fast)
- Humor(id: AchievementIds.SnapshotChallenge5), // 平均截图用时小于 10ms(截图挑战 · Ultra)
- Humor(id: AchievementIds.SnapshotChallenge6, isHidden: true, isRare: true), // 平均截图用时小于 5ms
+ Humor(id: AchievementIds.SnapshotChallenge1, group: AchievementIds.SnapshotChallengeGroup, isHidden: true), // 平均截图用时超过 800ms(高 ping 战士)
+ Humor(id: AchievementIds.SnapshotChallenge2, group: AchievementIds.SnapshotChallengeGroup, isHidden: true), // 平均截图用时在 400ms 到 800ms 之间(是不是有点太慢了)
+ Humor(id: AchievementIds.SnapshotChallenge3, group: AchievementIds.SnapshotChallengeGroup), // 平均截图用时小于 400ms(截图挑战 · Normal)
+ Humor(id: AchievementIds.SnapshotChallenge4, group: AchievementIds.SnapshotChallengeGroup), // 平均截图用时小于 100ms(截图挑战 · Fast)
+ Humor(id: AchievementIds.SnapshotChallenge5, group: AchievementIds.SnapshotChallengeGroup), // 平均截图用时小于 10ms(截图挑战 · Ultra)
+ Humor(id: AchievementIds.SnapshotChallenge6, group: AchievementIds.SnapshotChallengeGroup, isHidden: true, isRare: true), // 平均截图用时小于 5ms
Humor(id: AchievementIds.QuickCloser, isHidden: true), // 快速关闭弹窗
Humor(id: AchievementIds.TacticalRetreat), // 停止任务
Humor(id: AchievementIds.Martian, isHidden: true), // 90 天没更新
- Humor(id: AchievementIds.RecruitNoSixStar, target: 500), // 公招中累计 500 次没出现六星tag
- Humor(id: AchievementIds.RecruitNoSixStarStreak, target: 500, isHidden: true), // 公招中连续 500 次没出现六星tag
+
+ Humor(id: AchievementIds.RecruitNoSixStar, group: AchievementIds.RecruitGroup, target: 500), // 公招中累计 500 次没出现六星tag
+ Humor(id: AchievementIds.RecruitNoSixStarStreak, group: AchievementIds.RecruitGroup, target: 500, isHidden: true), // 公招中连续 500 次没出现六星tag
#endregion
#region BUG 相关
@@ -481,18 +485,18 @@ namespace MaaWpfGui.Helper
Behavior(id: AchievementIds.TaskStartCancel, isHidden: true), // 在开始任务后马上又停止
Behavior(id: AchievementIds.AfkWatcher), // 窗口尺寸最小化后长时间不操作
- Behavior(id: AchievementIds.UseDaily1, target: 7), // 连续使用时间
- Behavior(id: AchievementIds.UseDaily2, target: 30),
- Behavior(id: AchievementIds.UseDaily3, target: 365, isRare: true),
+ Behavior(id: AchievementIds.UseDaily1, group: AchievementIds.UseDailyGroup, target: 7), // 连续使用时间
+ Behavior(id: AchievementIds.UseDaily2, group: AchievementIds.UseDailyGroup, target: 30),
+ Behavior(id: AchievementIds.UseDaily3, group: AchievementIds.UseDailyGroup, target: 365, isRare: true),
#endregion
#region 彩蛋类
EasterEgg(id: AchievementIds.Rules, isHidden: true), // 我会一直注视着你
EasterEgg(id: AchievementIds.VersionClick, isHidden: true), // 这也能点?
- EasterEgg(id: AchievementIds.AprilFools, isHidden: true), // 愚人节
- EasterEgg(id: AchievementIds.MidnightLaunch, isHidden: true), // 0~4 点
- EasterEgg(id: AchievementIds.LunarNewYear, isHidden: true), // 春节
+ EasterEgg(id: AchievementIds.AprilFools, AchievementIds.LoginGroup, isHidden: true), // 愚人节
+ EasterEgg(id: AchievementIds.MidnightLaunch, AchievementIds.LoginGroup, isHidden: true), // 0~4 点
+ EasterEgg(id: AchievementIds.LunarNewYear, AchievementIds.LoginGroup, isHidden: true), // 春节
EasterEgg(id: AchievementIds.Lucky, isHidden: true, isRare: true), // 启动 MAA 时有极小概率触发
#endregion
diff --git a/src/MaaWpfGui/Main/AsstProxy.cs b/src/MaaWpfGui/Main/AsstProxy.cs
index 87dacb3eac..2972cea86d 100644
--- a/src/MaaWpfGui/Main/AsstProxy.cs
+++ b/src/MaaWpfGui/Main/AsstProxy.cs
@@ -945,7 +945,7 @@ namespace MaaWpfGui.Main
}
Instances.CopilotViewModel.AddLog(LocalizationHelper.GetString("CompleteCombat"), UiLogColor.Info);
- AchievementTrackerHelper.Instance.AddProgressToGroup(AchievementIds.UseCopilotGroup, 1);
+ AchievementTrackerHelper.Instance.AddProgressToGroup(AchievementIds.UseCopilotGroup);
}
break;
@@ -1464,7 +1464,7 @@ namespace MaaWpfGui.Main
case "EndOfActionThenStop":
TaskQueueViewModel.MallTask.LastCreditFightTaskTime = DateTime.UtcNow.ToYjDate().ToFormattedString();
Instances.TaskQueueViewModel.AddLog(LocalizationHelper.GetString("CompleteTask") + LocalizationHelper.GetString("CreditFight"));
- AchievementTrackerHelper.Instance.AddProgressToGroup(AchievementIds.MosquitoLeg, 1);
+ AchievementTrackerHelper.Instance.AddProgress(AchievementIds.MosquitoLeg);
break;
case "VisitLimited" or "VisitNextBlack":
TaskQueueViewModel.MallTask.LastCreditVisitFriendsTime = DateTime.UtcNow.ToYjDate().ToFormattedString();
diff --git a/src/MaaWpfGui/Models/Achievement.cs b/src/MaaWpfGui/Models/Achievement.cs
index 13d1afd2b0..28cee2ad11 100644
--- a/src/MaaWpfGui/Models/Achievement.cs
+++ b/src/MaaWpfGui/Models/Achievement.cs
@@ -68,10 +68,10 @@ namespace MaaWpfGui.Models
public bool CanShow => !IsHidden || IsUnlocked;
[JsonIgnore]
- public bool IsProgressive => Target != default;
+ public bool IsProgressive => Target != 0;
[JsonIgnore]
- public int Target { get; set; } = default; // 可选目标值
+ public int Target { get; set; } = 0; // 可选目标值
[JsonIgnore]
public AchievementCategory Category { get; set; } // 分组
@@ -82,6 +82,9 @@ namespace MaaWpfGui.Models
[JsonIgnore]
public bool IsVisibleInSearch { get; set; } = true;
+ [JsonIgnore]
+ public string Group { get; set; } = string.Empty;
+
[JsonIgnore]
public string MedalBrushKey
{
diff --git a/src/MaaWpfGui/Res/Localizations/zh-cn.xaml b/src/MaaWpfGui/Res/Localizations/zh-cn.xaml
index 38e0a738dd..976ccee37b 100644
--- a/src/MaaWpfGui/Res/Localizations/zh-cn.xaml
+++ b/src/MaaWpfGui/Res/Localizations/zh-cn.xaml
@@ -1188,11 +1188,11 @@ C:\\leidian\\LDPlayer9。\n
窥屏
喜欢盯着看是吧.jpg
- 使用一次牛牛监控
+ 使用一次{key=Peep}
喜报
- 我的MAA怎么用不了了?
- 触发过MAA的报错
+ 我的 MMA 怎么用不了了?
+ 触发过 MAA 的报错
不速之客
你触发了未知的领域。
@@ -1200,11 +1200,11 @@ C:\\leidian\\LDPlayer9。\n
自定义达人
咱就是二次元!
- 更换一次背景图片
+ 更换一次{key=BackgroundImage}
真正的抽卡
不是模拟抽卡吗?怎么真抽了???
- 使用一次牛牛抽卡
+ 使用一次{key=Gacha}
初来乍到
欢迎使用 MaaAssistantArknights.
@@ -1216,7 +1216,7 @@ C:\\leidian\\LDPlayer9。\n
严重错讠
我会一直注视着你。
- MAA员工守则
+ MAA 员工守则
这也能点?
这是什么?版本号,点一下。
@@ -1224,43 +1224,43 @@ C:\\leidian\\LDPlayer9。\n
精打细算
每点理智都用得恰到好处。
- 使用理智回复功能 1 次
+ 使用 「{key=UseSanityPotion}」 功能回复理智 1 次
补给大师
你对药剂的使用炉火纯青。
- 使用理智回复功能 10 次
+ 使用 「{key=UseSanityPotion}」 功能回复理智 10 次
永动机
你的理智似乎永远用不完。
- 使用理智回复功能 50 次
+ 使用 「{key=UseSanityPotion}」 功能回复理智 50 次
××管理大师
更有效的规划。
- 定时执行 1 次
+ {key=ScheduleSettings} 1 次
泛用型自动化解决方案0.3.2.9f2
您已熟知 PRTS 的自动化部署。
- 定时执行 100 次
+ {key=ScheduleSettings} 100 次
要过期了
赶紧冲哇!!!
- 使用「无限吃 48 小时内过期的理智药」,单次任务使用 8 瓶及以上临期理智药
+ 使用「{key=UseExpiringMedicine}」,单次任务使用 8 瓶及以上临期理智药
超限代理
你进行了一次能将大道磨灭的代理任务。
- 在单次任务中,进行超过 100 次代理指挥作战
+ 在单次 「{key=Combat}」 任务中,进行超过 100 次代理指挥作战
Mirror~~☆
- 是 Mirror酱!我们有救了!
- 初次成功使用 Mirror酱
+ 是 {key=MirrorChyan}!我们有救了!
+ 初次成功使用 {key=MirrorChyan}
这……对吗?
谁偷吃了我的字母饼干?
- Mirror酱 CDK 填写错误
+ {key=MirrorChyan} CDK 填写错误
隐患勘察
一定要杜绝的是,来自内部的风险。
- 进行一次问题反馈
+ 进行一次{key=IssueReport}
急急国王
我知道你很急,但你先别急。
@@ -1280,11 +1280,11 @@ C:\\leidian\\LDPlayer9。\n
玄学无效
事已至此,先睡觉吧。
- 公招中累计 500 次没出现六星 tag
+ 「{key=Recruiting}」 中累计 500 次没出现六星 tag
一定是 MAA 干的!
乆乆乆乆乆乆乆乆乆乆!
- 公招中连续 500 次没出现六星 tag
+ 「{key=Recruiting}」 中连续 500 次没出现六星 tag
蚊子腿也是肉!
您深刻理解了积少成多的道理。
@@ -1292,11 +1292,11 @@ C:\\leidian\\LDPlayer9。\n
测试先锋
您率先体验了处于测试中的版本。
- 将 MAA 更新至公测版
+ 将 MAA 更新至{key=UpdateCheckBeta}
超级测试先锋
- 您使用了最新的测试版本(出现任何新的问题请前往问题反馈!)
- 将 MAA 更新至内测版
+ 您使用了最新的测试版本(出现任何新的问题请前往{key=IssueReport}!)
+ 将 MAA 更新至{key=UpdateCheckNightly}
DEBUG 急先锋
能下到这个版本的都不是一般人。
@@ -1348,19 +1348,19 @@ C:\\leidian\\LDPlayer9。\n
初抵终点
只要能到达...那个地方...
- 使用牛牛通关肉鸽 1 次
+ 使用 「{key=AutoRoguelike}」 通关肉鸽 1 次
再临终点
这条道路我已走过多次。
- 使用牛牛通关肉鸽 5 次
+ 使用 「{key=AutoRoguelike}」 通关肉鸽 5 次
终点常客
闭着眼睛都能走到这。
- 使用牛牛通关肉鸽 10 次
+ 使用 「{key=AutoRoguelike}」 通关肉鸽 10 次
失败是成功之母
终有一天,我们会到达成功的彼岸,失败是成功的阶梯。
- 牛牛放弃探索 100 次
+ 「{key=AutoRoguelike}」 放弃探索 100 次
满了满了
坎诺特,把你店里最贵的端出来!
@@ -1392,7 +1392,7 @@ C:\\leidian\\LDPlayer9。\n
全勤先锋
你,已经成为博士的替身了。
- 开始任务能连续在线超过 3 小时
+ 开始任务后连续在线超过 3 小时
天天打卡
连续签到七天,可惜没有奖励。
@@ -1420,19 +1420,19 @@ C:\\leidian\\LDPlayer9。\n
简简单单
这种难度难不倒我。
- 使用牛牛通关任意肉鸽 N4 及以上难度
+ 使用 「{key=AutoRoguelike}」 通关任意肉鸽 N4 及以上难度
挑战困难
勇敢牛牛不怕困难。
- 使用牛牛通关任意肉鸽 N8 及以上难度
+ 使用 「{key=AutoRoguelike}」 通关任意肉鸽 N8 及以上难度
超越人类
比一般人玩的都好。
- 使用牛牛通关任意肉鸽 N12 及以上难度
+ 使用 「{key=AutoRoguelike}」 通关任意肉鸽 N12 及以上难度
仙术杯选手
仙术牛牛真仙术。
- 使用牛牛通关任意肉鸽 N15 及以上难度
+ 使用 「{key=AutoRoguelike}」 通关任意肉鸽 N15 及以上难度