separate primary and secondary properties

This commit is contained in:
DismissedLight
2022-10-16 21:53:40 +08:00
parent 72b660119f
commit 76800de6ee
7 changed files with 163 additions and 39 deletions

View File

@@ -11,8 +11,19 @@ public class Reliquary : EquipBase
/// <summary>
/// 副属性列表
/// </summary>
[Obsolete]
public List<ReliquarySubProperty> SubProperties { get; set; } = default!;
/// <summary>
/// 初始词条
/// </summary>
public List<ReliquarySubProperty> PrimarySubProperties { get; set; } = default!;
/// <summary>
/// 强化词条
/// </summary>
public List<ReliquarySubProperty> SecondarySubProperties { get; set; } = default!;
/// <summary>
/// 评分
/// </summary>

View File

@@ -0,0 +1,12 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
namespace Snap.Hutao.Service.Abstraction;
/// <summary>
/// 胡桃 API 服务
/// </summary>
internal interface IHutaoService
{
}

View File

@@ -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<ReliquarySubProperty> subProperty = equip.Reliquary!.AppendPropIdList.Select(id => CreateSubProperty(id)).ToList();
int affixCount = GetAffixCount(reliquary);
Span<ReliquarySubProperty> span = CollectionsMarshal.AsSpan(subProperty);
List<ReliquarySubProperty> primary = new(span[..^affixCount].ToArray());
List<ReliquarySubProperty> 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<ReliquarySubProperty> subProperties)
{
// 沙 杯 头

View File

@@ -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;
/// <summary>
/// 胡桃 API 服务
/// </summary>
[Injection(InjectAs.Transient)]
internal class HutaoService : IHutaoService
{
private readonly HomaClient homaClient;
/// <summary>
/// 构造一个新的胡桃 API 服务
/// </summary>
/// <param name="homaClient">胡桃 API 客户端</param>
/// <param name="memoryCache">内存缓存</param>
public HutaoService(HomaClient homaClient, IMemoryCache memoryCache)
{
this.homaClient = homaClient;
}
}

View File

@@ -520,34 +520,65 @@
Width="80"
Height="80"
Source="{Binding Icon}"/>
<ItemsControl
VerticalAlignment="Stretch"
Grid.Row="2"
ItemsSource="{Binding SubProperties}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<cwucont:UniformGrid
Columns="2"
Rows="5"
ColumnSpacing="16"
Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Padding="2" MinWidth="152" Opacity="{Binding Opacity}">
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock
Text="{Binding Name}"/>
<TextBlock
Text="{Binding Value}"
HorizontalAlignment="Right"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="16"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ItemsControl
MinWidth="156"
Grid.Column="0"
VerticalAlignment="Stretch"
ItemsSource="{Binding PrimarySubProperties}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<cwucont:UniformGrid
Columns="1"
Rows="5"
Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Padding="2" Opacity="{Binding Opacity}">
<TextBlock
Text="{Binding Name}"/>
<TextBlock
Text="{Binding Value}"
HorizontalAlignment="Right"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl
MinWidth="156"
Grid.Column="2"
VerticalAlignment="Stretch"
ItemsSource="{Binding SecondarySubProperties}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<cwucont:UniformGrid
Columns="1"
Rows="5"
Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Padding="2" Opacity="{Binding Opacity}">
<TextBlock
Text="{Binding Name}"/>
<TextBlock
Text="{Binding Value}"
HorizontalAlignment="Right"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
<Rectangle Height="1" Grid.Row="3" Margin="0,6" Opacity="0.8">
<Rectangle.Fill>

View File

@@ -108,14 +108,14 @@ internal class HomaClient
/// <summary>
/// 异步获取角色使用率
/// GET /Statistics2/AvatarParticipation
/// GET /Statistics/Avatar/UtilizationRate
/// </summary>
/// <param name="token">取消令牌</param>
/// <returns>角色出场率</returns>
public async Task<IEnumerable<AvatarUsageRank>> GetAvatarParticipations2Async(CancellationToken token = default)
public async Task<IEnumerable<AvatarUsageRank>> GetAvatarUtilizationRatesAsync(CancellationToken token = default)
{
Response<IEnumerable<AvatarUsageRank>>? resp = await httpClient
.GetFromJsonAsync<Response<IEnumerable<AvatarUsageRank>>>($"{HutaoAPI}/Statistics/Avatar/HoldingRate", token)
.GetFromJsonAsync<Response<IEnumerable<AvatarUsageRank>>>($"{HutaoAPI}/Statistics/Avatar/UtilizationRate", token)
.ConfigureAwait(false);
return EnumerableExtension.EmptyIfNull(resp?.Data);
@@ -123,7 +123,7 @@ internal class HomaClient
/// <summary>
/// 异步获取角色/武器/圣遗物搭配
/// GET /Statistics/AvatarReliquaryUsage
/// GET /Statistics/Avatar/AvatarCollocation
/// </summary>
/// <param name="token">取消令牌</param>
/// <returns>角色/武器/圣遗物搭配</returns>
@@ -138,14 +138,14 @@ internal class HomaClient
/// <summary>
/// 异步获取角色命座信息
/// GET /Statistics/Constellation
/// GET /Statistics/Avatar/HoldingRate
/// </summary>
/// <param name="token">取消令牌</param>
/// <returns>角色图片列表</returns>
public async Task<IEnumerable<AvatarConstellationInfo>> GetAvatarConstellationInfosAsync(CancellationToken token = default)
public async Task<IEnumerable<AvatarConstellationInfo>> GetAvatarHoldingRatesAsync(CancellationToken token = default)
{
Response<IEnumerable<AvatarConstellationInfo>>? resp = await httpClient
.GetFromJsonAsync<Response<IEnumerable<AvatarConstellationInfo>>>($"{HutaoAPI}/Statistics/Constellation", token)
.GetFromJsonAsync<Response<IEnumerable<AvatarConstellationInfo>>>($"{HutaoAPI}/Statistics/Avatar/HoldingRate", token)
.ConfigureAwait(false);
return EnumerableExtension.EmptyIfNull(resp?.Data);
@@ -153,7 +153,7 @@ internal class HomaClient
/// <summary>
/// 异步获取队伍出场次数
/// GET /Statistics/TeamCombination
/// GET /Team/Combination
/// </summary>
/// <param name="token">取消令牌</param>
/// <returns>队伍出场列表</returns>

View File

@@ -8,12 +8,14 @@ namespace Snap.Hutao.Web.Hutao.Model.Converter;
/// </summary>
internal class ReliquarySetsConverter : JsonConverter<ReliquarySets>
{
private const char Separator = ',';
/// <inheritdoc/>
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<ReliquarySets>
/// <inheritdoc/>
public override void Write(Utf8JsonWriter writer, ReliquarySets value, JsonSerializerOptions options)
{
writer.WriteStringValue(string.Join(';', value));
writer.WriteStringValue(string.Join(Separator, value));
}
}