feat: 分组

This commit is contained in:
uye
2025-06-04 00:55:01 +08:00
parent 97d6851948
commit b77be57543
6 changed files with 277 additions and 132 deletions

View File

@@ -1,162 +1,206 @@
{
"FirstLaunch": {
"Id": "FirstLaunch",
"CustomData": {}
},
"Irreplaceable": {
"Id": "Irreplaceable",
"CustomData": {}
},
"MosquitoLeg": {
"Id": "MosquitoLeg",
"CustomData": {}
},
"PioneerTest": {
"Id": "PioneerTest",
"CustomData": {}
},
"ProblemFeedback": {
"Id": "ProblemFeedback",
"CustomData": {}
},
"RecruitNoSixStar": {
"Id": "RecruitNoSixStar",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"SanityExpire": {
"Id": "SanityExpire",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"SanitySaver1": {
"Id": "SanitySaver1",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"SanitySaver2": {
"Id": "SanitySaver2",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"SanitySaver3": {
"Id": "SanitySaver3",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"SanitySpender1": {
"Id": "SanitySpender1",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"SanitySpender2": {
"Id": "SanitySpender2",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"SanitySpender3": {
"Id": "SanitySpender3",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"MosquitoLeg": {
"Id": "MosquitoLeg",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"PioneerTest": {
"Id": "PioneerTest",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"ScheduleMaster1": {
"Id": "ScheduleMaster1",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"ScheduleMaster2": {
"Id": "ScheduleMaster2",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"SnapshotChallenge10": {
"Id": "SnapshotChallenge10",
"CustomData": {}
},
"SnapshotChallenge100": {
"Id": "SnapshotChallenge100",
"CustomData": {}
},
"SnapshotChallenge400": {
"Id": "SnapshotChallenge400",
"CustomData": {}
},
"SnapshotChallenge800": {
"Id": "SnapshotChallenge800",
"CustomData": {}
},
"SnapshotChallenge999": {
"Id": "SnapshotChallenge999",
"CustomData": {}
"Irreplaceable": {
"Id": "Irreplaceable",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"UseCopilot1": {
"Id": "UseCopilot1",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"UseCopilot2": {
"Id": "UseCopilot2",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"UseCopilot3": {
"Id": "UseCopilot3",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"CongratulationError": {
"Id": "CongratulationError",
"CustomData": {}
"RecruitNoSixStar": {
"Id": "RecruitNoSixStar",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"CustomizationMaster": {
"Id": "CustomizationMaster",
"CustomData": {}
"SnapshotChallenge10": {
"Id": "SnapshotChallenge10",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"MapOutdated": {
"Id": "MapOutdated",
"CustomData": {}
"SnapshotChallenge100": {
"Id": "SnapshotChallenge100",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"Martian": {
"Id": "Martian",
"CustomData": {}
"SnapshotChallenge400": {
"Id": "SnapshotChallenge400",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"MirrorChyanCdkError": {
"Id": "MirrorChyanCdkError",
"CustomData": {}
},
"MirrorChyanFirstUse": {
"Id": "MirrorChyanFirstUse",
"CustomData": {}
"ProblemFeedback": {
"Id": "ProblemFeedback",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"OverLimitAgent": {
"Id": "OverLimitAgent",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"PeekScreen": {
"Id": "PeekScreen",
"CustomData": {}
"MirrorChyanCdkError": {
"Id": "MirrorChyanCdkError",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"MirrorChyanFirstUse": {
"Id": "MirrorChyanFirstUse",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"PioneerDebug": {
"Id": "PioneerDebug",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"PioneerSuperTest": {
"Id": "PioneerSuperTest",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"MapOutdated": {
"Id": "MapOutdated",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"CustomizationMaster": {
"Id": "CustomizationMaster",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"Martian": {
"Id": "Martian",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"PeekScreen": {
"Id": "PeekScreen",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"QuickCloser": {
"Id": "QuickCloser",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"RealGacha": {
"Id": "RealGacha",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"RecruitNoSixStarStreak": {
"Id": "RecruitNoSixStarStreak",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"Rules": {
"Id": "Rules",
"CustomData": {}
"SnapshotChallenge800": {
"Id": "SnapshotChallenge800",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"SnapshotChallenge999": {
"Id": "SnapshotChallenge999",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"TacticalRetreat": {
"Id": "TacticalRetreat",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"CongratulationError": {
"Id": "CongratulationError",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"UnexpectedCrash": {
"Id": "UnexpectedCrash",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"Rules": {
"Id": "Rules",
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"VersionClick": {
"Id": "VersionClick",
"CustomData": {}
"CustomData": {},
"MedalColor": "#FF6B4C2B"
},
"Lucky": {
"Id": "Lucky",
"MedalColor": "#FF6B4C2B"
}
}

View File

@@ -72,5 +72,43 @@ namespace MaaWpfGui.Constants
/// </summary>
Undivided = 1,
}
public enum AchievementCategory
{
/// <summary>
/// 基础使用类
/// </summary>
BasicUsage,
/// <summary>
/// 功能探索类
/// </summary>
FeatureExploration,
/// <summary>
/// 自动战斗
/// </summary>
AutoBattle,
/// <summary>
/// 搞笑/梗类成就
/// </summary>
Humor,
/// <summary>
/// BUG 相关
/// </summary>
BugRelated,
/// <summary>
/// 彩蛋类
/// </summary>
EasterEgg,
/// <summary>
/// 超级稀有!
/// </summary>
Rare,
}
}
}

View File

@@ -21,8 +21,8 @@ using HandyControl.Controls;
using HandyControl.Data;
using MaaWpfGui.Constants;
using MaaWpfGui.Models;
using Newtonsoft.Json.Linq;
using Stylet;
using static MaaWpfGui.Constants.Enums;
namespace MaaWpfGui.Helper
{
@@ -82,6 +82,7 @@ namespace MaaWpfGui.Helper
Achievements = _achievements
.OrderByDescending(kv => kv.Value.IsUnlocked) // 已解锁优先
.ThenBy(kv => kv.Value.IsHidden) // 隐藏排后面
.ThenBy(kv => kv.Value.Category) // 按类别分组
.ThenBy(kv => kv.Value.Id) // 最后按 Id
.ToDictionary(kv => kv.Key, kv => kv.Value);
@@ -135,7 +136,7 @@ namespace MaaWpfGui.Helper
Message = $"{LocalizationHelper.GetString("AchievementCelebrate")}: {achievement.Title}\n{achievement.Description}",
StaysOpen = staysOpen,
IconKey = "HangoverGeometry",
IconBrushKey = achievement.IsHidden ? "HiddenMedalBrush" : "NormalMedalBrush",
IconBrushKey = $"AchievementBrush.{achievement.Category}",
};
ShowInfo(growlInfo);
}
@@ -253,73 +254,99 @@ namespace MaaWpfGui.Helper
public Achievement? Get(string id) => _achievements.GetValueOrDefault(id);
#region
private static Achievement BasicUsage(string id, int? target = null, bool isHidden = false)
=> new() { Id = id, Target = target, IsHidden = isHidden, Category = AchievementCategory.BasicUsage };
private static Achievement FeatureExploration(string id, int? target = null, bool isHidden = false)
=> new() { Id = id, Target = target, IsHidden = isHidden, Category = AchievementCategory.FeatureExploration };
private static Achievement AutoBattle(string id, int? target = null, bool isHidden = false)
=> new() { Id = id, Target = target, IsHidden = isHidden, Category = AchievementCategory.AutoBattle };
private static Achievement Humor(string id, int? target = null, bool isHidden = false)
=> new() { Id = id, Target = target, IsHidden = isHidden, Category = AchievementCategory.Humor };
private static Achievement BugRelated(string id, int? target = null, bool isHidden = false)
=> new() { Id = id, Target = target, IsHidden = isHidden, Category = AchievementCategory.BugRelated };
private static Achievement EasterEgg(string id, int? target = null, bool isHidden = false)
=> new() { Id = id, Target = target, IsHidden = isHidden, Category = AchievementCategory.EasterEgg };
private static Achievement Rare(string id, int? target = null, bool isHidden = false)
=> new() { Id = id, Target = target, IsHidden = isHidden, Category = AchievementCategory.Rare };
#endregion
private readonly Achievement[] _allAchievements =
[
#region 基础使用类
new() { Id = AchievementIds.SanitySpender1, Target = 10 }, // 刷理智次数
new() { Id = AchievementIds.SanitySpender2, Target = 100 },
new() { Id = AchievementIds.SanitySpender3, Target = 1000 },
BasicUsage(id: AchievementIds.SanitySpender1, target: 10), // 刷理智次数
BasicUsage(id: AchievementIds.SanitySpender2, target: 100),
BasicUsage(id: AchievementIds.SanitySpender3, target: 1000),
new() { Id = AchievementIds.SanitySaver1, Target = 1 }, // 刷理智次数
new() { Id = AchievementIds.SanitySaver2, Target = 10 },
new() { Id = AchievementIds.SanitySaver3, Target = 50 },
BasicUsage(id: AchievementIds.SanitySaver1, target: 1), // 刷理智次数
BasicUsage(id: AchievementIds.SanitySaver2, target: 10),
BasicUsage(id: AchievementIds.SanitySaver3, target: 50),
new() { Id = AchievementIds.FirstLaunch }, // 首次启动
new() { Id = AchievementIds.SanityExpire, Target = 8 }, // 单次消耗 8 瓶快过期的理智药
new() { Id = AchievementIds.OverLimitAgent, Target = 100, IsHidden = true }, // 单次代理 100 关
BasicUsage(id: AchievementIds.FirstLaunch), // 首次启动
BasicUsage(id: AchievementIds.SanityExpire, target: 8), // 单次消耗 8 瓶快过期的理智药
BasicUsage(id: AchievementIds.OverLimitAgent, target: 100, isHidden: true), // 单次代理 100 关
#endregion
#region 功能探索类
new() { Id = AchievementIds.ScheduleMaster1, Target = 1 }, // 定时执行
new() { Id = AchievementIds.ScheduleMaster2, Target = 100 },
FeatureExploration(id: AchievementIds.ScheduleMaster1, target: 1), // 定时执行
FeatureExploration(id: AchievementIds.ScheduleMaster2, target: 100),
new() { Id = AchievementIds.MirrorChyanFirstUse, IsHidden = true }, // 第一次成功使用 MirrorChyan 下载
new() { Id = AchievementIds.MirrorChyanCdkError, IsHidden = true }, // MirrorChyan CDK 错误
FeatureExploration(id: AchievementIds.MirrorChyanFirstUse, isHidden: true), // 第一次成功使用 MirrorChyan 下载
FeatureExploration(id: AchievementIds.MirrorChyanCdkError, isHidden: true), // MirrorChyan CDK 错误
new() { Id = AchievementIds.PioneerTest }, // 将 MAA 更新至公测版
new() { Id = AchievementIds.PioneerSuperTest, IsHidden = true }, // 将 MAA 更新至内测版(隐藏)
new() { Id = AchievementIds.PioneerDebug, IsHidden = true }, // 使用未发布版本的 MAA隐藏
FeatureExploration(id: AchievementIds.PioneerTest), // 将 MAA 更新至公测版
FeatureExploration(id: AchievementIds.PioneerSuperTest, isHidden: true), // 将 MAA 更新至内测版(隐藏)
FeatureExploration(id: AchievementIds.PioneerDebug, isHidden: true), // 使用未发布版本的 MAA隐藏
new() { Id = AchievementIds.MosquitoLeg, Target = 5 }, // 使用「借助战打 OF-1」功能超过5次
FeatureExploration(id: AchievementIds.MosquitoLeg, target: 5), // 使用「借助战打 OF-1」功能超过5次
#endregion
#region 自动战斗
new() { Id = AchievementIds.UseCopilot1, Target = 1 }, // 自动战斗
new() { Id = AchievementIds.UseCopilot2, Target = 10 },
new() { Id = AchievementIds.UseCopilot3, Target = 100 },
AutoBattle(id: AchievementIds.UseCopilot1, target: 1), // 自动战斗
AutoBattle(id: AchievementIds.UseCopilot2, target: 10),
AutoBattle(id: AchievementIds.UseCopilot3, target: 100),
new() { Id = AchievementIds.MapOutdated, IsHidden = true }, // 提示需要更新地图资源
new() { Id = AchievementIds.Irreplaceable }, // 自动编队缺少至少两名干员
AutoBattle(id: AchievementIds.MapOutdated, isHidden: true), // 提示需要更新地图资源
AutoBattle(id: AchievementIds.Irreplaceable), // 自动编队缺少至少两名干员
#endregion
#region 搞笑/梗类成就
new() { Id = AchievementIds.SnapshotChallenge999, IsHidden = true }, // 平均截图用时超过 800ms高 ping 战士)
new() { Id = AchievementIds.SnapshotChallenge800, IsHidden = true }, // 平均截图用时在 400ms 到 800ms 之间(是不是有点太慢了)
new() { Id = AchievementIds.SnapshotChallenge400 }, // 平均截图用时小于 400ms截图挑战 · Normal
new() { Id = AchievementIds.SnapshotChallenge100 }, // 平均截图用时小于 100ms截图挑战 · Fast
new() { Id = AchievementIds.SnapshotChallenge10 }, // 平均截图用时小于 10ms截图挑战 · Ultra
Humor(id: AchievementIds.SnapshotChallenge999, isHidden: true), // 平均截图用时超过 800ms高 ping 战士)
Humor(id: AchievementIds.SnapshotChallenge800, isHidden: true), // 平均截图用时在 400ms 到 800ms 之间(是不是有点太慢了)
Humor(id: AchievementIds.SnapshotChallenge400), // 平均截图用时小于 400ms截图挑战 · Normal
Humor(id: AchievementIds.SnapshotChallenge100), // 平均截图用时小于 100ms截图挑战 · Fast
Humor(id: AchievementIds.SnapshotChallenge10), // 平均截图用时小于 10ms截图挑战 · Ultra
new() { Id = AchievementIds.QuickCloser, IsHidden = true }, // 快速关闭弹窗
new() { Id = AchievementIds.TacticalRetreat, IsHidden = true }, // 停止任务
new() { Id = AchievementIds.RealGacha, IsHidden = true }, // 真正的抽卡
new() { Id = AchievementIds.PeekScreen, IsHidden = true }, // 窥屏
new() { Id = AchievementIds.CustomizationMaster, IsHidden = true }, // 自定义背景
new() { Id = AchievementIds.Martian, IsHidden = true }, // 90 天没更新
new() { Id = AchievementIds.RecruitNoSixStar, Target = 100 }, // 公招中累计 100 次没出现六星tag
new() { Id = AchievementIds.RecruitNoSixStarStreak, Target = 100, IsHidden = true }, // 公招中连续 100 次没出现六星tag
Humor(id: AchievementIds.QuickCloser, isHidden: true), // 快速关闭弹窗
Humor(id: AchievementIds.TacticalRetreat, isHidden: true), // 停止任务
Humor(id: AchievementIds.RealGacha, isHidden: true), // 真正的抽卡
Humor(id: AchievementIds.PeekScreen, isHidden: true), // 窥屏
Humor(id: AchievementIds.CustomizationMaster, isHidden: true), // 自定义背景
Humor(id: AchievementIds.Martian, isHidden: true), // 90 天没更新
Humor(id: AchievementIds.RecruitNoSixStar, target: 100), // 公招中累计 100 次没出现六星tag
Humor(id: AchievementIds.RecruitNoSixStarStreak, target: 100, isHidden: true), // 公招中连续 100 次没出现六星tag
#endregion
#region BUG 相关
new() { Id = AchievementIds.CongratulationError, IsHidden = true }, // 喜报
new() { Id = AchievementIds.UnexpectedCrash, IsHidden = true }, // 不速之客
new() { Id = AchievementIds.ProblemFeedback }, // 问题反馈
BugRelated(id: AchievementIds.CongratulationError, isHidden: true), // 喜报
BugRelated(id: AchievementIds.UnexpectedCrash, isHidden: true), // 不速之客
BugRelated(id: AchievementIds.ProblemFeedback), // 问题反馈
#endregion
#region 彩蛋类
new() { Id = AchievementIds.Rules, IsHidden = true }, // 我会一直注视着你
new() { Id = AchievementIds.VersionClick, IsHidden = true }, // 这也能点?
new() { Id = AchievementIds.Lucky, IsHidden = true }, // 启动 MAA 时有极小概率触发
EasterEgg(id: AchievementIds.Rules, isHidden: true), // 我会一直注视着你
EasterEgg(id: AchievementIds.VersionClick, isHidden: true), // 这也能点?
Rare(id: AchievementIds.Lucky, isHidden: true), // 启动 MAA 时有极小概率触发
#endregion
];

View File

@@ -17,6 +17,7 @@ using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Media;
using MaaWpfGui.Constants;
using MaaWpfGui.Helper;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -72,14 +73,34 @@ namespace MaaWpfGui.Models
[JsonIgnore]
public int? Target { get; set; } = null; // 可选目标值
[JsonIgnore]
public Enums.AchievementCategory Category { get; set; } // 分组
[JsonIgnore]
public bool IsRare => Category == Enums.AchievementCategory.Rare;
[JsonIgnore]
public SolidColorBrush MedalBrush
{
get
{
var key = !IsUnlocked ? "LockedMedalBrush"
: IsHidden ? "HiddenMedalBrush"
: "NormalMedalBrush";
string key;
if (IsRare)
{
key = "AchievementBrush.Rare";
}
else if (!IsUnlocked)
{
key = "LockedMedalBrush";
}
else if (IsHidden)
{
key = "HiddenMedalBrush";
}
else
{
key = $"AchievementBrush.{Category}";
}
if (Application.Current.Resources[key] is SolidColorBrush brush)
{

View File

@@ -52,6 +52,14 @@
<!-- 未解锁 -->
<SolidColorBrush x:Key="LockedMedalBrush" Color="#4B3118" />
<SolidColorBrush x:Key="AchievementBrush.BasicUsage" Color="#90CAF9" />
<SolidColorBrush x:Key="AchievementBrush.FeatureExploration" Color="#A5D6A7" />
<SolidColorBrush x:Key="AchievementBrush.AutoBattle" Color="#FFCC80" />
<SolidColorBrush x:Key="AchievementBrush.Humor" Color="#CE93D8" />
<SolidColorBrush x:Key="AchievementBrush.BugRelated" Color="#EF9A9A" />
<SolidColorBrush x:Key="AchievementBrush.EasterEgg" Color="#FFF176" />
<SolidColorBrush x:Key="AchievementBrush.Rare" Color="#F48FB1" />
<!-- MdXaml Brush -->
<SolidColorBrush x:Key="MdXamlBackground" Color="#2d2d30" />
<SolidColorBrush x:Key="MdXamlCodeBackground" Color="#161b22" />

View File

@@ -31,6 +31,13 @@
<SolidColorBrush x:Key="HiddenMedalBrush" Color="#D4AF37" />
<!-- 未解锁 -->
<SolidColorBrush x:Key="LockedMedalBrush" Color="#6B4C2B" />
<SolidColorBrush x:Key="AchievementBrush.BasicUsage" Color="#42A5F5" />
<SolidColorBrush x:Key="AchievementBrush.FeatureExploration" Color="#66BB6A" />
<SolidColorBrush x:Key="AchievementBrush.AutoBattle" Color="#FFA726" />
<SolidColorBrush x:Key="AchievementBrush.Humor" Color="#AB47BC" />
<SolidColorBrush x:Key="AchievementBrush.BugRelated" Color="#EF5350" />
<SolidColorBrush x:Key="AchievementBrush.EasterEgg" Color="#FFEB3B" />
<SolidColorBrush x:Key="AchievementBrush.Rare" Color="#EC407A" />
<!-- MdXaml Brush -->
<SolidColorBrush x:Key="MdXamlBackground" Color="#ffffff" />