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