From 76800de6eee82f7ac929fd1e2f001f517a405c67 Mon Sep 17 00:00:00 2001
From: DismissedLight <1686188646@qq.com>
Date: Sun, 16 Oct 2022 21:53:40 +0800
Subject: [PATCH] separate primary and secondary properties
---
.../Model/Binding/AvatarProperty/Reliquary.cs | 11 +++
.../Service/Abstraction/IHutaoService.cs | 12 +++
.../Factory/SummaryReliquaryFactory.cs | 43 ++++++++-
.../Snap.Hutao/Service/HutaoService.cs | 27 ++++++
.../View/Page/AvatarPropertyPage.xaml | 87 +++++++++++++------
.../Snap.Hutao/Web/Hutao/HomaClient.cs | 16 ++--
.../Model/Converter/ReliquarySetsConverter.cs | 6 +-
7 files changed, 163 insertions(+), 39 deletions(-)
create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IHutaoService.cs
create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/HutaoService.cs
diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/AvatarProperty/Reliquary.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/AvatarProperty/Reliquary.cs
index 36dfa929..dc099768 100644
--- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/AvatarProperty/Reliquary.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/AvatarProperty/Reliquary.cs
@@ -11,8 +11,19 @@ public class Reliquary : EquipBase
///
/// 副属性列表
///
+ [Obsolete]
public List SubProperties { get; set; } = default!;
+ ///
+ /// 初始词条
+ ///
+ public List PrimarySubProperties { get; set; } = default!;
+
+ ///
+ /// 强化词条
+ ///
+ public List SecondarySubProperties { get; set; } = default!;
+
///
/// 评分
///
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IHutaoService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IHutaoService.cs
new file mode 100644
index 00000000..ace86f5d
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/Abstraction/IHutaoService.cs
@@ -0,0 +1,12 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Snap.Hutao.Service.Abstraction;
+
+///
+/// 胡桃 API 服务
+///
+internal interface IHutaoService
+{
+
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryReliquaryFactory.cs b/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryReliquaryFactory.cs
index 56e23005..d6e1644e 100644
--- a/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryReliquaryFactory.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Service/AvatarInfo/Factory/SummaryReliquaryFactory.cs
@@ -7,6 +7,7 @@ using Snap.Hutao.Model.Intrinsic;
using Snap.Hutao.Model.Metadata.Converter;
using Snap.Hutao.Model.Metadata.Reliquary;
using Snap.Hutao.Web.Enka.Model;
+using System.Runtime.InteropServices;
using MetadataReliquary = Snap.Hutao.Model.Metadata.Reliquary.Reliquary;
using MetadataReliquaryAffix = Snap.Hutao.Model.Metadata.Reliquary.ReliquaryAffix;
using ModelAvatarInfo = Snap.Hutao.Web.Enka.Model.AvatarInfo;
@@ -61,6 +62,12 @@ internal class SummaryReliquaryFactory
{
MetadataReliquary reliquary = reliquaries.Single(r => r.Ids.Contains(equip.ItemId));
List subProperty = equip.Reliquary!.AppendPropIdList.Select(id => CreateSubProperty(id)).ToList();
+
+ int affixCount = GetAffixCount(reliquary);
+ Span span = CollectionsMarshal.AsSpan(subProperty);
+ List primary = new(span[..^affixCount].ToArray());
+ List secondary = new(span[^affixCount..].ToArray());
+
ReliquaryLevel relicLevel = reliqueryLevels.Single(r => r.Level == equip.Reliquary!.Level && r.Quality == reliquary.RankLevel);
FightProperty property = idRelicMainPropMap[equip.Reliquary.MainPropId];
@@ -77,11 +84,45 @@ internal class SummaryReliquaryFactory
MainProperty = new(property.GetDescription(), PropertyInfoDescriptor.FormatValue(property, relicLevel.Properties[property])),
// Reliquary
- SubProperties = subProperty,
+ // SubProperties = subProperty,
+ PrimarySubProperties = primary,
+ SecondarySubProperties = secondary,
Score = ScoreReliquary(property, reliquary, relicLevel, subProperty),
};
}
+ private int GetAffixCount(MetadataReliquary reliquary)
+ {
+ return (reliquary.RankLevel, equip.Reliquary!.Level) switch
+ {
+ (ItemQuality.QUALITY_ORANGE, > 20) => 5,
+ (ItemQuality.QUALITY_ORANGE, > 16) => 4,
+ (ItemQuality.QUALITY_ORANGE, > 12) => 3,
+ (ItemQuality.QUALITY_ORANGE, > 8) => 2,
+ (ItemQuality.QUALITY_ORANGE, > 4) => 1,
+ (ItemQuality.QUALITY_ORANGE, _) => 0,
+
+ (ItemQuality.QUALITY_PURPLE, > 16) => 4,
+ (ItemQuality.QUALITY_PURPLE, > 12) => 3,
+ (ItemQuality.QUALITY_PURPLE, > 8) => 2,
+ (ItemQuality.QUALITY_PURPLE, > 4) => 1,
+ (ItemQuality.QUALITY_PURPLE, _) => 0,
+
+ (ItemQuality.QUALITY_BLUE, > 12) => 3,
+ (ItemQuality.QUALITY_BLUE, > 8) => 2,
+ (ItemQuality.QUALITY_BLUE, > 4) => 1,
+ (ItemQuality.QUALITY_BLUE, _) => 0,
+
+ (ItemQuality.QUALITY_GREEN, > 4) => 1,
+ (ItemQuality.QUALITY_GREEN, _) => 0,
+
+ (ItemQuality.QUALITY_WHITE, > 4) => 1,
+ (ItemQuality.QUALITY_WHITE, _) => 0,
+
+ _ => 0,
+ };
+ }
+
private double ScoreReliquary(FightProperty property, MetadataReliquary reliquary, ReliquaryLevel relicLevel, List subProperties)
{
// 沙 杯 头
diff --git a/src/Snap.Hutao/Snap.Hutao/Service/HutaoService.cs b/src/Snap.Hutao/Snap.Hutao/Service/HutaoService.cs
new file mode 100644
index 00000000..2a5b83d2
--- /dev/null
+++ b/src/Snap.Hutao/Snap.Hutao/Service/HutaoService.cs
@@ -0,0 +1,27 @@
+// Copyright (c) DGP Studio. All rights reserved.
+// Licensed under the MIT license.
+
+using Microsoft.Extensions.Caching.Memory;
+using Snap.Hutao.Service.Abstraction;
+using Snap.Hutao.Web.Hutao;
+
+namespace Snap.Hutao.Service;
+
+///
+/// 胡桃 API 服务
+///
+[Injection(InjectAs.Transient)]
+internal class HutaoService : IHutaoService
+{
+ private readonly HomaClient homaClient;
+
+ ///
+ /// 构造一个新的胡桃 API 服务
+ ///
+ /// 胡桃 API 客户端
+ /// 内存缓存
+ public HutaoService(HomaClient homaClient, IMemoryCache memoryCache)
+ {
+ this.homaClient = homaClient;
+ }
+}
\ No newline at end of file
diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml
index 27801951..45890b33 100644
--- a/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml
+++ b/src/Snap.Hutao/Snap.Hutao/View/Page/AvatarPropertyPage.xaml
@@ -520,34 +520,65 @@
Width="80"
Height="80"
Source="{Binding Icon}"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaClient.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaClient.cs
index 66c5a00b..16459662 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaClient.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/HomaClient.cs
@@ -108,14 +108,14 @@ internal class HomaClient
///
/// 异步获取角色使用率
- /// GET /Statistics2/AvatarParticipation
+ /// GET /Statistics/Avatar/UtilizationRate
///
/// 取消令牌
/// 角色出场率
- public async Task> GetAvatarParticipations2Async(CancellationToken token = default)
+ public async Task> GetAvatarUtilizationRatesAsync(CancellationToken token = default)
{
Response>? resp = await httpClient
- .GetFromJsonAsync>>($"{HutaoAPI}/Statistics/Avatar/HoldingRate", token)
+ .GetFromJsonAsync>>($"{HutaoAPI}/Statistics/Avatar/UtilizationRate", token)
.ConfigureAwait(false);
return EnumerableExtension.EmptyIfNull(resp?.Data);
@@ -123,7 +123,7 @@ internal class HomaClient
///
/// 异步获取角色/武器/圣遗物搭配
- /// GET /Statistics/AvatarReliquaryUsage
+ /// GET /Statistics/Avatar/AvatarCollocation
///
/// 取消令牌
/// 角色/武器/圣遗物搭配
@@ -138,14 +138,14 @@ internal class HomaClient
///
/// 异步获取角色命座信息
- /// GET /Statistics/Constellation
+ /// GET /Statistics/Avatar/HoldingRate
///
/// 取消令牌
/// 角色图片列表
- public async Task> GetAvatarConstellationInfosAsync(CancellationToken token = default)
+ public async Task> GetAvatarHoldingRatesAsync(CancellationToken token = default)
{
Response>? resp = await httpClient
- .GetFromJsonAsync>>($"{HutaoAPI}/Statistics/Constellation", token)
+ .GetFromJsonAsync>>($"{HutaoAPI}/Statistics/Avatar/HoldingRate", token)
.ConfigureAwait(false);
return EnumerableExtension.EmptyIfNull(resp?.Data);
@@ -153,7 +153,7 @@ internal class HomaClient
///
/// 异步获取队伍出场次数
- /// GET /Statistics/TeamCombination
+ /// GET /Team/Combination
///
/// 取消令牌
/// 队伍出场列表
diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Model/Converter/ReliquarySetsConverter.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Model/Converter/ReliquarySetsConverter.cs
index 4da2a905..b2e9fd97 100644
--- a/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Model/Converter/ReliquarySetsConverter.cs
+++ b/src/Snap.Hutao/Snap.Hutao/Web/Hutao/Model/Converter/ReliquarySetsConverter.cs
@@ -8,12 +8,14 @@ namespace Snap.Hutao.Web.Hutao.Model.Converter;
///
internal class ReliquarySetsConverter : JsonConverter
{
+ private const char Separator = ',';
+
///
public override ReliquarySets? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.GetString() is string source)
{
- string[] sets = source.Split(';');
+ string[] sets = source.Split(Separator);
return new(sets.Select(set => new ReliquarySet(set)));
}
else
@@ -25,6 +27,6 @@ internal class ReliquarySetsConverter : JsonConverter
///
public override void Write(Utf8JsonWriter writer, ReliquarySets value, JsonSerializerOptions options)
{
- writer.WriteStringValue(string.Join(';', value));
+ writer.WriteStringValue(string.Join(Separator, value));
}
}
\ No newline at end of file