mirror of
https://github.com/wangdage12/Snap.Hutao.git
synced 2026-07-31 04:10:25 +08:00
当角色满,而武器未满时。使武器也能关联上角色
This commit is contained in:
+41
@@ -0,0 +1,41 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace Snap.Hutao.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class AddCultivateEntryAssociationOnly : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropForeignKey(
|
||||||
|
name: "FK_cultivate_entries_cultivate_entries_RelatedEntryId",
|
||||||
|
table: "cultivate_entries");
|
||||||
|
|
||||||
|
migrationBuilder.AddForeignKey(
|
||||||
|
name: "FK_cultivate_entries_cultivate_entries_RelatedEntryId",
|
||||||
|
table: "cultivate_entries",
|
||||||
|
column: "RelatedEntryId",
|
||||||
|
principalTable: "cultivate_entries",
|
||||||
|
principalColumn: "InnerId");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropForeignKey(
|
||||||
|
name: "FK_cultivate_entries_cultivate_entries_RelatedEntryId",
|
||||||
|
table: "cultivate_entries");
|
||||||
|
|
||||||
|
migrationBuilder.AddForeignKey(
|
||||||
|
name: "FK_cultivate_entries_cultivate_entries_RelatedEntryId",
|
||||||
|
table: "cultivate_entries",
|
||||||
|
column: "RelatedEntryId",
|
||||||
|
principalTable: "cultivate_entries",
|
||||||
|
principalColumn: "InnerId",
|
||||||
|
onDelete: ReferentialAction.SetNull);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -77,6 +77,11 @@ internal sealed partial class CultivationService : ICultivationService
|
|||||||
foreach (ref readonly CultivateEntry entry in entries.AsSpan())
|
foreach (ref readonly CultivateEntry entry in entries.AsSpan())
|
||||||
{
|
{
|
||||||
ImmutableArray<CultivateItem> items = cultivationRepository.GetCultivateItemImmutableArrayByEntryId(entry.InnerId);
|
ImmutableArray<CultivateItem> items = cultivationRepository.GetCultivateItemImmutableArrayByEntryId(entry.InnerId);
|
||||||
|
if (IsHiddenAssociationOnlyAvatarEntry(entry, items.Length))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ImmutableArray<CultivateItemView>.Builder entryItems = ImmutableArray.CreateBuilder<CultivateItemView>(items.Length);
|
ImmutableArray<CultivateItemView>.Builder entryItems = ImmutableArray.CreateBuilder<CultivateItemView>(items.Length);
|
||||||
|
|
||||||
foreach (ref readonly CultivateItem cultivateItem in items.AsSpan())
|
foreach (ref readonly CultivateItem cultivateItem in items.AsSpan())
|
||||||
@@ -267,6 +272,34 @@ internal sealed partial class CultivationService : ICultivationService
|
|||||||
return cultivationRepository.TryGetAvatarCultivateEntryInnerId(projects.CurrentItem.InnerId, avatarId);
|
return cultivationRepository.TryGetAvatarCultivateEntryInnerId(projects.CurrentItem.InnerId, avatarId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async ValueTask<Guid?> EnsureAvatarAssociationStubAsync(uint avatarId, LevelInformation levelInformation)
|
||||||
|
{
|
||||||
|
IAdvancedDbCollectionView<CultivateProject> projects = await GetProjectCollectionAsync().ConfigureAwait(false);
|
||||||
|
if (!await EnsureCurrentProjectAsync(projects).ConfigureAwait(false))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ArgumentNullException.ThrowIfNull(projects.CurrentItem);
|
||||||
|
|
||||||
|
await taskContext.SwitchToBackgroundAsync();
|
||||||
|
|
||||||
|
Guid projectId = projects.CurrentItem.InnerId;
|
||||||
|
if (cultivationRepository.TryGetAvatarCultivateEntryInnerId(projectId, avatarId) is Guid existing)
|
||||||
|
{
|
||||||
|
return existing;
|
||||||
|
}
|
||||||
|
|
||||||
|
CultivateEntry entry = CultivateEntry.From(projectId, CultivateType.AvatarAndSkill, avatarId);
|
||||||
|
cultivationRepository.AddCultivateEntry(entry);
|
||||||
|
|
||||||
|
CultivateEntryLevelInformation level = CultivateEntryLevelInformation.From(entry.InnerId, CultivateType.AvatarAndSkill, levelInformation);
|
||||||
|
cultivationRepository.AddLevelInformation(level);
|
||||||
|
|
||||||
|
entryCollectionCache.TryRemove(projectId, out _);
|
||||||
|
return entry.InnerId;
|
||||||
|
}
|
||||||
|
|
||||||
public async ValueTask<ProjectAddResultKind> TryAddProjectAsync(CultivateProject project)
|
public async ValueTask<ProjectAddResultKind> TryAddProjectAsync(CultivateProject project)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(project.Name))
|
if (string.IsNullOrWhiteSpace(project.Name))
|
||||||
@@ -483,4 +516,25 @@ internal sealed partial class CultivationService : ICultivationService
|
|||||||
string avatarName = context.GetAvatarItem(related.Id).Name;
|
string avatarName = context.GetAvatarItem(related.Id).Name;
|
||||||
return $"{avatarName}·{weaponName}";
|
return $"{avatarName}·{weaponName}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 无材料的「已满配」角色占位行不在养成列表展示(仍为武器的 RelatedEntryId 解析目标)。
|
||||||
|
/// </summary>
|
||||||
|
private static bool IsHiddenAssociationOnlyAvatarEntry(CultivateEntry entry, int cultivateItemCount)
|
||||||
|
{
|
||||||
|
if (entry.Type is not CultivateType.AvatarAndSkill || cultivateItemCount != 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (entry.LevelInformation is not CultivateEntryLevelInformation li)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return li.AvatarLevelFrom == li.AvatarLevelTo
|
||||||
|
&& li.SkillALevelFrom == li.SkillALevelTo
|
||||||
|
&& li.SkillELevelFrom == li.SkillELevelTo
|
||||||
|
&& li.SkillQLevelFrom == li.SkillQLevelTo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -29,6 +29,12 @@ internal interface ICultivationService
|
|||||||
|
|
||||||
ValueTask<Guid?> TryGetAvatarCultivateEntryInnerIdAsync(uint avatarId);
|
ValueTask<Guid?> TryGetAvatarCultivateEntryInnerIdAsync(uint avatarId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 当前计划中尚无该角色的养成条目时,插入一条无材料行的角色占位条目(等级信息与 delta 一致),供武器 RelatedEntryId 关联。
|
||||||
|
/// 若已存在角色条目则返回其 InnerId。
|
||||||
|
/// </summary>
|
||||||
|
ValueTask<Guid?> EnsureAvatarAssociationStubAsync(uint avatarId, LevelInformation levelInformation);
|
||||||
|
|
||||||
void SaveCultivateItem(CultivateItemView item);
|
void SaveCultivateItem(CultivateItemView item);
|
||||||
|
|
||||||
ValueTask<ProjectAddResultKind> TryAddProjectAsync(CultivateProject project);
|
ValueTask<ProjectAddResultKind> TryAddProjectAsync(CultivateProject project);
|
||||||
|
|||||||
@@ -364,6 +364,16 @@ internal sealed partial class AvatarPropertyViewModel : Abstraction.ViewModel, I
|
|||||||
relatedAvatarEntryId = await scopeContext.CultivationService.TryGetAvatarCultivateEntryInnerIdAsync(options.Delta.AvatarId).ConfigureAwait(false);
|
relatedAvatarEntryId = await scopeContext.CultivationService.TryGetAvatarCultivateEntryInnerIdAsync(options.Delta.AvatarId).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (relatedAvatarEntryId is null && avatarSave.Kind is ConsumptionSaveResultKind.NoItem)
|
||||||
|
{
|
||||||
|
relatedAvatarEntryId = await scopeContext.CultivationService.TryGetAvatarCultivateEntryInnerIdAsync(options.Delta.AvatarId).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (relatedAvatarEntryId is null && !consumption.WeaponConsume.IsEmpty)
|
||||||
|
{
|
||||||
|
relatedAvatarEntryId = await scopeContext.CultivationService.EnsureAvatarAssociationStubAsync(options.Delta.AvatarId, levelInformation).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
InputConsumption weaponInput = new()
|
InputConsumption weaponInput = new()
|
||||||
{
|
{
|
||||||
Type = CultivateType.Weapon,
|
Type = CultivateType.Weapon,
|
||||||
|
|||||||
Reference in New Issue
Block a user