From 8f5532819a52c5ed565500d2e73def59e175b936 Mon Sep 17 00:00:00 2001 From: mfkvfhpdx Date: Sun, 3 May 2026 22:05:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=B3=E9=94=AE=E7=BC=BA=E5=B0=91=E6=9D=90?= =?UTF-8?q?=E6=96=99=E7=BB=9F=E8=AE=A1=E5=A4=84=E6=AD=A6=E5=99=A8=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=BB=91=E5=AE=9A=E7=9A=84=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Cultivation/CultivationService.cs | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs index 73a19b3..f1f49cd 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs @@ -345,6 +345,13 @@ internal sealed partial class CultivationService : ICultivationService ICultivationRepository cultivationRepository) { ImmutableArray<(CultivateEntry Entry, CultivateItem Item)> pairs = cultivationRepository.GetCultivateEntryItemPairsByProjectId(projectId); + ImmutableArray projectEntries = cultivationRepository.GetCultivateEntryImmutableArrayByProjectId(projectId); + Dictionary entryByInnerId = new(projectEntries.Length); + foreach (ref readonly CultivateEntry e in projectEntries.AsSpan()) + { + entryByInnerId[e.InnerId] = e; + } + Dictionary> unfinishedSegmentsByMaterial = []; foreach ((CultivateEntry entry, CultivateItem item) in pairs.AsSpan()) @@ -354,7 +361,7 @@ internal sealed partial class CultivationService : ICultivationService continue; } - string name = FormatStatisticsConsumerEntryName(entry, context); + string name = FormatStatisticsConsumerEntryName(entry, context, entryByInnerId); string segment = $"{name}×{item.Count}"; ref List? list = ref CollectionsMarshal.GetValueRefOrAddDefault(unfinishedSegmentsByMaterial, item.ItemId, out _); list ??= []; @@ -381,13 +388,39 @@ internal sealed partial class CultivationService : ICultivationService } } - private static string FormatStatisticsConsumerEntryName(CultivateEntry entry, ICultivationMetadataContext context) + private static string FormatStatisticsConsumerEntryName( + CultivateEntry entry, + ICultivationMetadataContext context, + Dictionary entryByInnerId) { return entry.Type switch { CultivateType.AvatarAndSkill => context.GetAvatarItem(entry.Id).Name, - CultivateType.Weapon => context.GetWeaponItem(entry.Id).Name, + CultivateType.Weapon => FormatStatisticsConsumerWeaponEntryName(entry, context, entryByInnerId), _ => Material.Default.Name, }; } + + /// + /// 材料统计右键「未完成」:武器条目在有关联角色条目时展示「角色名·武器名」,否则(含历史无 RelatedEntryId)仅武器名。 + /// + private static string FormatStatisticsConsumerWeaponEntryName( + CultivateEntry entry, + ICultivationMetadataContext context, + Dictionary entryByInnerId) + { + string weaponName = context.GetWeaponItem(entry.Id).Name; + if (entry.RelatedEntryId is not Guid relatedId) + { + return weaponName; + } + + if (!entryByInnerId.TryGetValue(relatedId, out CultivateEntry? related) || related.Type is not CultivateType.AvatarAndSkill) + { + return weaponName; + } + + string avatarName = context.GetAvatarItem(related.Id).Name; + return $"{avatarName}·{weaponName}"; + } } \ No newline at end of file