diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/GoalType.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/GoalType.cs
new file mode 100644
index 00000000..2daac6e0
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/GoalType.cs
@@ -0,0 +1,14 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Model.Metadata.Tower;
+
+[Localization]
+internal enum GoalType
+{
+ [LocalizationKey(nameof(SH.ModelMetadataTowerGoalTypeDefeatMonsters))]
+ DefeatMonsters,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerGoalTypeDefendTarget))]
+ DefendTarget,
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerFloor.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerFloor.cs
index 15f482d6..5618080e 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerFloor.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerFloor.cs
@@ -31,7 +31,7 @@ internal sealed class TowerFloor
public string Background { get; set; } = default!;
///
- /// 描述
+ /// 地脉紊乱
///
public List Descriptions { get; set; } = default!;
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerLevel.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerLevel.cs
index 40f3ddc6..24c4604d 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerLevel.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerLevel.cs
@@ -35,8 +35,28 @@ internal sealed class TowerLevel
///
public List FirstMonsters { get; set; } = default!;
+ ///
+ /// 上半怪物波次
+ ///
+ public List FirstWaves { get; set; } = default!;
+
+ ///
+ /// 上半造物
+ ///
+ public NameDescription? FirstGadget { get; set; }
+
///
/// 下半怪物预览
///
- public List SecondMonsters { get; set; } = default!;
+ public List? SecondMonsters { get; set; }
+
+ ///
+ /// 下半怪物波次
+ ///
+ public List SecondWaves { get; set; } = default!;
+
+ ///
+ /// 下半造物
+ ///
+ public NameDescription? SecondGadget { get; set; }
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerMonster.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerMonster.cs
new file mode 100644
index 00000000..4a522d80
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerMonster.cs
@@ -0,0 +1,29 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Model.Primitive;
+
+namespace Snap.Hutao.Model.Metadata.Tower;
+
+internal sealed class TowerMonster
+{
+ ///
+ /// 怪物关系Id
+ ///
+ public MonsterRelationshipId Id { get; set; }
+
+ ///
+ /// 个数
+ ///
+ public uint Count { get; set; }
+
+ ///
+ /// 是否攻击镇石
+ ///
+ public bool AttackMonolith { get; set; }
+
+ ///
+ /// 特殊词条
+ ///
+ public List? Affixes { get; set; }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerWave.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerWave.cs
new file mode 100644
index 00000000..ef00235f
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/TowerWave.cs
@@ -0,0 +1,24 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Model.Primitive;
+
+namespace Snap.Hutao.Model.Metadata.Tower;
+
+internal sealed class TowerWave
+{
+ ///
+ /// 波次类型
+ ///
+ public WaveType Type { get; set; }
+
+ ///
+ /// 额外描述
+ ///
+ public string? Description { get; set; }
+
+ ///
+ /// 分波怪物
+ ///
+ public List Monsters { get; set; } = default!;
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/WaveType.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/WaveType.cs
new file mode 100644
index 00000000..ee91c985
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Tower/WaveType.cs
@@ -0,0 +1,85 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Model.Metadata.Tower;
+
+///
+/// 第二波:击败所有怪物,下一波才会出现
+/// D组:不同的组同时在场,各自分波独立
+/// D组第一波:不同的组同时在场,各自分波独立
+///
+[Localization]
+internal enum WaveType
+{
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeIndependent))]
+ Independent = 0,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeWave1))]
+ Wave1 = 1,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeWave2))]
+ Wave2 = 2,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeWave3))]
+ Wave3 = 3,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeWave4))]
+ Wave4 = 4,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupA))]
+ GroupA = 10,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupAWave1))]
+ GroupAWave1 = 11,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupAWave2))]
+ GroupAWave2 = 12,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupAWave3))]
+ GroupAWave3 = 13,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupB))]
+ GroupB = 20,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupBWave1))]
+ GroupBWave1 = 21,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupBWave2))]
+ GroupBWave2 = 22,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupBWave3))]
+ GroupBWave3 = 23,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupC))]
+ GroupC = 30,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupCWave1))]
+ GroupCWave1 = 31,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupCWave2))]
+ GroupCWave2 = 32,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupCWave3))]
+ GroupCWave3 = 33,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupD))]
+ GroupD = 40,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupDWave1))]
+ GroupDWave1 = 41,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupDWave2))]
+ GroupDWave2 = 42,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeGroupDWave3))]
+ GroupDWave3 = 43,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeSuppressed))]
+ Suppressed = 99,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeAdditional))]
+ Additional = 999,
+
+ [LocalizationKey(nameof(SH.ModelMetadataTowerWaveTypeWave1Additional))]
+ Wave1Additional = 1999,
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/NameDescription.cs b/src/Snap.Hutao/Snap.Hutao/Model/NameDescription.cs
similarity index 95%
rename from src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/NameDescription.cs
rename to src/Snap.Hutao/Snap.Hutao/Model/NameDescription.cs
index 33947aa8..457d88e4 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/NameDescription.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/NameDescription.cs
@@ -1,7 +1,7 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
-namespace Snap.Hutao.ViewModel.AvatarProperty;
+namespace Snap.Hutao.Model;
///
/// 名称与描述
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs
index 14483218..2a5f979f 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs
@@ -861,6 +861,240 @@ namespace Snap.Hutao.Resource.Localization {
}
}
+ ///
+ /// 查找类似 打怪 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerGoalTypeDefeatMonsters {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerGoalTypeDefeatMonsters", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 守塔 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerGoalTypeDefendTarget {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerGoalTypeDefendTarget", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 附加 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeAdditional {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeAdditional", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 A组:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupA {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupA", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 A组第一波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupAWave1 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupAWave1", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 A组第二波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupAWave2 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupAWave2", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 A组第三波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupAWave3 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupAWave3", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 B组:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupB {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupB", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 B组第一波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupBWave1 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupBWave1", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 B组第二波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupBWave2 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupBWave2", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 B组第三波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupBWave3 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupBWave3", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 C组:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupC {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupC", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 C组第一波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupCWave1 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupCWave1", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 C组第二波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupCWave2 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupCWave2", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 C组第三波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupCWave3 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupCWave3", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 D组:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupD {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupD", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 D组第一波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupDWave1 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupDWave1", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 D组第二波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupDWave2 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupDWave2", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 D组第三波:不同的组同时在场,各自分波独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeGroupDWave3 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeGroupDWave3", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 与其他怪物独立 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeIndependent {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeIndependent", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 暂时没有分波信息 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeSuppressed {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeSuppressed", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 第一波:击败所有怪物,下一波才会出现 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeWave1 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeWave1", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 第一波附加:为第一波补充怪物 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeWave1Additional {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeWave1Additional", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 第二波:击败所有怪物,下一波才会出现 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeWave2 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeWave2", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 第三波:击败所有怪物,下一波才会出现 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeWave3 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeWave3", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 第四波:击败所有怪物,下一波才会出现 的本地化字符串。
+ ///
+ internal static string ModelMetadataTowerWaveTypeWave4 {
+ get {
+ return ResourceManager.GetString("ModelMetadataTowerWaveTypeWave4", resourceCulture);
+ }
+ }
+
///
/// 查找类似 请更新角色橱窗数据 的本地化字符串。
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
index 45e997e1..eaa6b75d 100644
--- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
+++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx
@@ -413,6 +413,84 @@
武器强化素材
Need EXACT same string in game
+
+ 打怪
+
+
+ 守塔
+
+
+ 附加
+
+
+ A组:不同的组同时在场,各自分波独立
+
+
+ A组第一波:不同的组同时在场,各自分波独立
+
+
+ A组第二波:不同的组同时在场,各自分波独立
+
+
+ A组第三波:不同的组同时在场,各自分波独立
+
+
+ B组:不同的组同时在场,各自分波独立
+
+
+ B组第一波:不同的组同时在场,各自分波独立
+
+
+ B组第二波:不同的组同时在场,各自分波独立
+
+
+ B组第三波:不同的组同时在场,各自分波独立
+
+
+ C组:不同的组同时在场,各自分波独立
+
+
+ C组第一波:不同的组同时在场,各自分波独立
+
+
+ C组第二波:不同的组同时在场,各自分波独立
+
+
+ C组第三波:不同的组同时在场,各自分波独立
+
+
+ D组:不同的组同时在场,各自分波独立
+
+
+ D组第一波:不同的组同时在场,各自分波独立
+
+
+ D组第二波:不同的组同时在场,各自分波独立
+
+
+ D组第三波:不同的组同时在场,各自分波独立
+
+
+ 与其他怪物独立
+
+
+ 暂时没有分波信息
+
+
+ 第一波:击败所有怪物,下一波才会出现
+
+
+ 第一波附加:为第一波补充怪物
+
+
+ 第二波:击败所有怪物,下一波才会出现
+
+
+ 第三波:击败所有怪物,下一波才会出现
+
+
+ 第四波:击败所有怪物,下一波才会出现
+
请更新角色橱窗数据
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryAvatarFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryAvatarFactory.cs
index 7991f7e3..1cbb6c09 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryAvatarFactory.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryAvatarFactory.cs
@@ -6,7 +6,6 @@ using Snap.Hutao.Model.Intrinsic;
using Snap.Hutao.Model.Intrinsic.Format;
using Snap.Hutao.Model.Metadata.Converter;
using Snap.Hutao.Model.Primitive;
-using Snap.Hutao.ViewModel.AvatarProperty;
using Snap.Hutao.Web.Enka.Model;
using EntityAvatarInfo = Snap.Hutao.Model.Entity.AvatarInfo;
using MetadataAvatar = Snap.Hutao.Model.Metadata.Avatar.Avatar;
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataService.cs
index f89a0878..cb40f184 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataService.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataService.cs
@@ -2,15 +2,6 @@
// Licensed under the MIT license.
using Snap.Hutao.Core.DependencyInjection.Abstraction;
-using Snap.Hutao.Model.Intrinsic;
-using Snap.Hutao.Model.Metadata;
-using Snap.Hutao.Model.Metadata.Achievement;
-using Snap.Hutao.Model.Metadata.Avatar;
-using Snap.Hutao.Model.Metadata.Item;
-using Snap.Hutao.Model.Metadata.Monster;
-using Snap.Hutao.Model.Metadata.Reliquary;
-using Snap.Hutao.Model.Metadata.Weapon;
-using Snap.Hutao.Model.Primitive;
namespace Snap.Hutao.Service.Metadata;
@@ -18,222 +9,15 @@ namespace Snap.Hutao.Service.Metadata;
/// 元数据服务
///
[HighQuality]
-[SuppressMessage("", "SA1124")]
-internal interface IMetadataService : ICastService
+internal interface IMetadataService : ICastService,
+ IMetadataServiceRawData,
+ IMetadataServiceIdDataMap,
+ IMetadataServiceNameDataMap,
+ IMetadataServiceNameLevelCurveMap
{
///
/// 异步初始化服务,尝试更新元数据
///
/// 初始化是否成功
ValueTask InitializeAsync();
-
- #region RawData
-
- ///
- /// 异步获取成就列表
- ///
- /// 取消令牌
- /// 成就列表
- ValueTask> GetAchievementsAsync(CancellationToken token = default);
-
- ///
- /// 异步获取成就分类列表
- ///
- /// 取消令牌
- /// 成就分类列表
- ValueTask> GetAchievementGoalsAsync(CancellationToken token = default);
-
- ///
- /// 异步获取角色突破列表
- ///
- /// 取消令牌
- /// 角色突破列表
- ValueTask> GetAvatarPromotesAsync(CancellationToken token = default);
-
- ///
- /// 异步获取角色列表
- ///
- /// 取消令牌
- /// 角色列表
- ValueTask> GetAvatarsAsync(CancellationToken token = default);
-
- ///
- /// 异步获取卡池配置列表
- ///
- /// 取消令牌
- /// 卡池配置列表
- ValueTask> GetGachaEventsAsync(CancellationToken token = default);
-
- ///
- /// 异步获取材料列表
- ///
- /// 取消令牌
- /// 材料列表
- ValueTask> GetMaterialsAsync(CancellationToken token = default);
-
- ///
- /// 异步获取怪物列表
- ///
- /// 取消令牌
- /// 怪物列表
- ValueTask> GetMonstersAsync(CancellationToken token = default);
-
- ///
- /// 异步获取圣遗物列表
- ///
- /// 取消令牌
- /// 圣遗物列表
- ValueTask> GetReliquariesAsync(CancellationToken token = default);
-
- ///
- /// 异步获取圣遗物强化属性列表
- ///
- /// 取消令牌
- /// 圣遗物强化属性列表
- ValueTask> GetReliquarySubAffixesAsync(CancellationToken token = default);
-
- ///
- /// 异步获取圣遗物等级数据
- ///
- /// 取消令牌
- /// 圣遗物等级数据
- ValueTask> GetReliquaryLevelsAsync(CancellationToken token = default);
-
- ///
- /// 异步获取圣遗物主属性强化属性列表
- ///
- /// 取消令牌
- /// 圣遗物强化属性列表
- ValueTask> GetReliquaryMainAffixesAsync(CancellationToken token = default);
-
- ///
- /// 异步获取圣遗物套装
- ///
- /// 取消令牌
- /// 圣遗物套装列表
- ValueTask> GetReliquarySetsAsync(CancellationToken token = default);
-
- ///
- /// 异步获取武器突破列表
- ///
- /// 取消令牌
- /// 武器突破列表
- ValueTask> GetWeaponPromotesAsync(CancellationToken token = default);
-
- ///
- /// 异步获取武器列表
- ///
- /// 取消令牌
- /// 武器列表
- ValueTask> GetWeaponsAsync(CancellationToken token = default);
- #endregion
-
- #region IdDataMap
-
- ///
- /// 异步获取装备被动Id到圣遗物套装的映射
- ///
- /// 取消令牌
- /// 装备被动Id到圣遗物套装的映射
- ValueTask> GetEquipAffixIdToReliquarySetMapAsync(CancellationToken token = default);
-
- ValueTask> GetExtendedEquipAffixIdToReliquarySetMapAsync(CancellationToken token = default);
-
- ///
- /// 异步获取成就映射
- ///
- /// 取消令牌
- /// 成就映射
- ValueTask> GetIdToAchievementMapAsync(CancellationToken token = default);
-
- ///
- /// 异步获取Id到角色的字典
- ///
- /// 取消令牌
- /// Id到角色的字典
- ValueTask> GetIdToAvatarMapAsync(CancellationToken token = default);
-
- ///
- /// 异步获取显示与材料映射
- ///
- /// 取消令牌
- /// 显示与材料映射
- ValueTask> GetIdToDisplayItemAndMaterialMapAsync(CancellationToken token = default);
-
- ///
- /// 异步获取Id到材料的字典
- ///
- /// 取消令牌
- /// Id到材料的字典
- ValueTask> GetIdToMaterialMapAsync(CancellationToken token = default(CancellationToken));
-
- ///
- /// 异步获取Id到圣遗物权重的映射
- ///
- /// 取消令牌
- /// Id到圣遗物权重的字典
- ValueTask> GetIdToReliquaryAffixWeightMapAsync(CancellationToken token = default);
-
- ///
- /// 异步获取ID到圣遗物副词条的字典
- ///
- /// 取消令牌
- /// 字典
- ValueTask> GetIdToReliquarySubAffixMapAsync(CancellationToken token = default);
-
- ///
- /// 异步获取圣遗物主词条Id与属性的字典
- ///
- /// 取消令牌
- /// 字典
- ValueTask> GetIdToReliquaryMainPropertyMapAsync(CancellationToken token = default);
-
- ///
- /// 异步获取ID到武器的字典
- ///
- /// 取消令牌
- /// Id到武器的字典
- ValueTask> GetIdToWeaponMapAsync(CancellationToken token = default);
- #endregion
-
- #region NameDataMap
-
- ///
- /// 异步获取名称到角色的字典
- ///
- /// 取消令牌
- /// 名称到角色的字典
- ValueTask> GetNameToAvatarMapAsync(CancellationToken token = default);
-
- ///
- /// 异步获取名称到武器的字典
- ///
- /// 取消令牌
- /// 名称到武器的字典
- ValueTask> GetNameToWeaponMapAsync(CancellationToken token = default);
- #endregion
-
- #region LevelCurveMap
-
- ///
- /// 异步获取等级角色曲线映射
- ///
- /// 取消令牌
- /// 等级角色曲线映射
- ValueTask>> GetLevelToAvatarCurveMapAsync(CancellationToken token = default);
-
- ///
- /// 异步获取等级怪物曲线映射
- ///
- /// 取消令牌
- /// 等级怪物曲线映射
- ValueTask>> GetLevelToMonsterCurveMapAsync(CancellationToken token = default);
-
- ///
- /// 异步获取等级武器曲线映射
- ///
- /// 取消令牌
- /// 等级武器曲线映射
- ValueTask>> GetLevelToWeaponCurveMapAsync(CancellationToken token = default);
- #endregion
}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceIdDataMap.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceIdDataMap.cs
new file mode 100644
index 00000000..c9a0fc28
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceIdDataMap.cs
@@ -0,0 +1,79 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Model.Intrinsic;
+using Snap.Hutao.Model.Metadata.Avatar;
+using Snap.Hutao.Model.Metadata.Item;
+using Snap.Hutao.Model.Metadata.Reliquary;
+using Snap.Hutao.Model.Metadata.Weapon;
+using Snap.Hutao.Model.Primitive;
+
+namespace Snap.Hutao.Service.Metadata;
+
+internal interface IMetadataServiceIdDataMap
+{
+ ///
+ /// 异步获取装备被动Id到圣遗物套装的映射
+ ///
+ /// 取消令牌
+ /// 装备被动Id到圣遗物套装的映射
+ ValueTask> GetEquipAffixIdToReliquarySetMapAsync(CancellationToken token = default);
+
+ ValueTask> GetExtendedEquipAffixIdToReliquarySetMapAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取成就映射
+ ///
+ /// 取消令牌
+ /// 成就映射
+ ValueTask> GetIdToAchievementMapAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取Id到角色的字典
+ ///
+ /// 取消令牌
+ /// Id到角色的字典
+ ValueTask> GetIdToAvatarMapAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取显示与材料映射
+ ///
+ /// 取消令牌
+ /// 显示与材料映射
+ ValueTask> GetIdToDisplayItemAndMaterialMapAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取Id到材料的字典
+ ///
+ /// 取消令牌
+ /// Id到材料的字典
+ ValueTask> GetIdToMaterialMapAsync(CancellationToken token = default(CancellationToken));
+
+ ///
+ /// 异步获取Id到圣遗物权重的映射
+ ///
+ /// 取消令牌
+ /// Id到圣遗物权重的字典
+ ValueTask> GetIdToReliquaryAffixWeightMapAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取ID到圣遗物副词条的字典
+ ///
+ /// 取消令牌
+ /// 字典
+ ValueTask> GetIdToReliquarySubAffixMapAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取圣遗物主词条Id与属性的字典
+ ///
+ /// 取消令牌
+ /// 字典
+ ValueTask> GetIdToReliquaryMainPropertyMapAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取ID到武器的字典
+ ///
+ /// 取消令牌
+ /// Id到武器的字典
+ ValueTask> GetIdToWeaponMapAsync(CancellationToken token = default);
+}
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceNameDataMap.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceNameDataMap.cs
new file mode 100644
index 00000000..7577d4ed
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceNameDataMap.cs
@@ -0,0 +1,24 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Model.Metadata.Avatar;
+using Snap.Hutao.Model.Metadata.Weapon;
+
+namespace Snap.Hutao.Service.Metadata;
+
+internal interface IMetadataServiceNameDataMap
+{
+ ///
+ /// 异步获取名称到角色的字典
+ ///
+ /// 取消令牌
+ /// 名称到角色的字典
+ ValueTask> GetNameToAvatarMapAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取名称到武器的字典
+ ///
+ /// 取消令牌
+ /// 名称到武器的字典
+ ValueTask> GetNameToWeaponMapAsync(CancellationToken token = default);
+}
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceNameLevelCurveMap.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceNameLevelCurveMap.cs
new file mode 100644
index 00000000..c715e79a
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceNameLevelCurveMap.cs
@@ -0,0 +1,31 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Model.Intrinsic;
+using Snap.Hutao.Model.Primitive;
+
+namespace Snap.Hutao.Service.Metadata;
+
+internal interface IMetadataServiceNameLevelCurveMap
+{
+ ///
+ /// 异步获取等级角色曲线映射
+ ///
+ /// 取消令牌
+ /// 等级角色曲线映射
+ ValueTask>> GetLevelToAvatarCurveMapAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取等级怪物曲线映射
+ ///
+ /// 取消令牌
+ /// 等级怪物曲线映射
+ ValueTask>> GetLevelToMonsterCurveMapAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取等级武器曲线映射
+ ///
+ /// 取消令牌
+ /// 等级武器曲线映射
+ ValueTask>> GetLevelToWeaponCurveMapAsync(CancellationToken token = default);
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceRawData.cs b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceRawData.cs
new file mode 100644
index 00000000..864f8b6a
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Metadata/IMetadataServiceRawData.cs
@@ -0,0 +1,113 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Snap.Hutao.Model.Metadata;
+using Snap.Hutao.Model.Metadata.Achievement;
+using Snap.Hutao.Model.Metadata.Avatar;
+using Snap.Hutao.Model.Metadata.Item;
+using Snap.Hutao.Model.Metadata.Monster;
+using Snap.Hutao.Model.Metadata.Reliquary;
+using Snap.Hutao.Model.Metadata.Weapon;
+
+namespace Snap.Hutao.Service.Metadata;
+
+internal interface IMetadataServiceRawData
+{
+ ///
+ /// 异步获取成就列表
+ ///
+ /// 取消令牌
+ /// 成就列表
+ ValueTask> GetAchievementsAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取成就分类列表
+ ///
+ /// 取消令牌
+ /// 成就分类列表
+ ValueTask> GetAchievementGoalsAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取角色突破列表
+ ///
+ /// 取消令牌
+ /// 角色突破列表
+ ValueTask> GetAvatarPromotesAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取角色列表
+ ///
+ /// 取消令牌
+ /// 角色列表
+ ValueTask> GetAvatarsAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取卡池配置列表
+ ///
+ /// 取消令牌
+ /// 卡池配置列表
+ ValueTask> GetGachaEventsAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取材料列表
+ ///
+ /// 取消令牌
+ /// 材料列表
+ ValueTask> GetMaterialsAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取怪物列表
+ ///
+ /// 取消令牌
+ /// 怪物列表
+ ValueTask> GetMonstersAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取圣遗物列表
+ ///
+ /// 取消令牌
+ /// 圣遗物列表
+ ValueTask> GetReliquariesAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取圣遗物强化属性列表
+ ///
+ /// 取消令牌
+ /// 圣遗物强化属性列表
+ ValueTask> GetReliquarySubAffixesAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取圣遗物等级数据
+ ///
+ /// 取消令牌
+ /// 圣遗物等级数据
+ ValueTask> GetReliquaryLevelsAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取圣遗物主属性强化属性列表
+ ///
+ /// 取消令牌
+ /// 圣遗物强化属性列表
+ ValueTask> GetReliquaryMainAffixesAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取圣遗物套装
+ ///
+ /// 取消令牌
+ /// 圣遗物套装列表
+ ValueTask> GetReliquarySetsAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取武器突破列表
+ ///
+ /// 取消令牌
+ /// 武器突破列表
+ ValueTask> GetWeaponPromotesAsync(CancellationToken token = default);
+
+ ///
+ /// 异步获取武器列表
+ ///
+ /// 取消令牌
+ /// 武器列表
+ ValueTask> GetWeaponsAsync(CancellationToken token = default);
+}
diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/WeaponView.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/WeaponView.cs
index 40d9f156..8bfb46c7 100644
--- a/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/WeaponView.cs
+++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/AvatarProperty/WeaponView.cs
@@ -1,6 +1,7 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
+using Snap.Hutao.Model;
using Snap.Hutao.Model.Calculable;
using Snap.Hutao.Model.Primitive;