Add critical cell reparse comparison review
This commit is contained in:
@@ -290,7 +290,14 @@ public sealed class LookupService(IDbContextFactory<RolemasterDbContext> dbConte
|
||||
item => item.Id == resultId && item.CriticalTable.Slug == normalizedSlug,
|
||||
cancellationToken);
|
||||
|
||||
return result is null ? null : CreateCellEditorResponse(result);
|
||||
if (result is null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var currentState = CreateCurrentEditorState(result);
|
||||
var generatedContent = await ParseCriticalCellContentAsync(dbContext, result.CriticalTableId, currentState.RawCellText, cancellationToken);
|
||||
return CreateCellEditorResponse(result, currentState, generatedContent.ValidationErrors, CreateComparisonState(generatedContent));
|
||||
}
|
||||
|
||||
public async Task<CriticalCellEditorResponse?> ReparseCriticalCellAsync(
|
||||
@@ -322,7 +329,7 @@ public sealed class LookupService(IDbContextFactory<RolemasterDbContext> dbConte
|
||||
var content = SharedParsing.CriticalCellTextParser.Parse(currentState.RawCellText, affixLegend);
|
||||
var generatedState = CreateGeneratedEditorState(content);
|
||||
var mergedState = MergeGeneratedState(currentState, generatedState);
|
||||
return CreateCellEditorResponse(result, mergedState, content.ValidationErrors);
|
||||
return CreateCellEditorResponse(result, mergedState, content.ValidationErrors, CreateComparisonState(content));
|
||||
}
|
||||
|
||||
public async Task<CriticalCellEditorResponse?> UpdateCriticalCellAsync(
|
||||
@@ -363,7 +370,8 @@ public sealed class LookupService(IDbContextFactory<RolemasterDbContext> dbConte
|
||||
|
||||
await dbContext.SaveChangesAsync(cancellationToken);
|
||||
|
||||
return CreateCellEditorResponse(result, request, []);
|
||||
var generatedContent = await ParseCriticalCellContentAsync(dbContext, result.CriticalTableId, request.RawCellText, cancellationToken);
|
||||
return CreateCellEditorResponse(result, request, generatedContent.ValidationErrors, CreateComparisonState(generatedContent));
|
||||
}
|
||||
|
||||
private static IReadOnlyList<CriticalTableLegendEntry> BuildLegend(IReadOnlyList<CriticalTableCellDetail> cells)
|
||||
@@ -424,16 +432,11 @@ public sealed class LookupService(IDbContextFactory<RolemasterDbContext> dbConte
|
||||
effect.SourceType,
|
||||
effect.SourceText);
|
||||
|
||||
private static CriticalCellEditorResponse CreateCellEditorResponse(CriticalResult result)
|
||||
{
|
||||
var state = CreateCurrentEditorState(result);
|
||||
return CreateCellEditorResponse(result, state, []);
|
||||
}
|
||||
|
||||
private static CriticalCellEditorResponse CreateCellEditorResponse(
|
||||
CriticalResult result,
|
||||
CriticalCellUpdateRequest state,
|
||||
IReadOnlyList<string> validationMessages)
|
||||
IReadOnlyList<string> validationMessages,
|
||||
CriticalCellComparisonState? generatedState)
|
||||
{
|
||||
var snapshotJson = CriticalCellEditorSnapshot.FromRequest(state).ToJson();
|
||||
|
||||
@@ -459,7 +462,8 @@ public sealed class LookupService(IDbContextFactory<RolemasterDbContext> dbConte
|
||||
state.AreBranchesOverridden,
|
||||
validationMessages.ToList(),
|
||||
state.Effects.ToList(),
|
||||
state.Branches.ToList());
|
||||
state.Branches.ToList(),
|
||||
generatedState);
|
||||
}
|
||||
|
||||
private static CriticalBranchLookupResponse CreateBranchLookupResponse(CriticalBranch branch) =>
|
||||
@@ -521,6 +525,18 @@ public sealed class LookupService(IDbContextFactory<RolemasterDbContext> dbConte
|
||||
.ToList());
|
||||
}
|
||||
|
||||
private static CriticalCellComparisonState CreateComparisonState(SharedParsing.CriticalCellParseContent content) =>
|
||||
new(
|
||||
content.DescriptionText,
|
||||
content.Effects
|
||||
.Select(CreateEffectLookupResponse)
|
||||
.ToList(),
|
||||
content.Branches
|
||||
.OrderBy(branch => branch.SortOrder)
|
||||
.Select(CreateBranchLookupResponse)
|
||||
.ToList(),
|
||||
content.ValidationErrors.ToList());
|
||||
|
||||
private static CriticalEffectEditorItem CreateEffectEditorItem(CriticalEffect effect, string originKey) =>
|
||||
new(
|
||||
effect.EffectCode,
|
||||
@@ -806,6 +822,33 @@ public sealed class LookupService(IDbContextFactory<RolemasterDbContext> dbConte
|
||||
SourceText = NormalizeOptionalText(effect.SourceText)
|
||||
};
|
||||
|
||||
private static CriticalEffectLookupResponse CreateEffectLookupResponse(SharedParsing.ParsedCriticalEffect effect) =>
|
||||
new(
|
||||
effect.EffectCode,
|
||||
effect.Target,
|
||||
effect.ValueInteger,
|
||||
effect.ValueExpression,
|
||||
effect.DurationRounds,
|
||||
effect.PerRound,
|
||||
effect.Modifier,
|
||||
effect.BodyPart,
|
||||
effect.IsPermanent,
|
||||
effect.SourceType,
|
||||
effect.SourceText);
|
||||
|
||||
private static CriticalBranchLookupResponse CreateBranchLookupResponse(SharedParsing.ParsedCriticalBranch branch) =>
|
||||
new(
|
||||
branch.BranchKind,
|
||||
branch.ConditionKey,
|
||||
branch.ConditionText,
|
||||
branch.DescriptionText,
|
||||
branch.RawAffixText,
|
||||
branch.Effects
|
||||
.Select(CreateEffectLookupResponse)
|
||||
.ToList(),
|
||||
branch.RawText,
|
||||
branch.SortOrder);
|
||||
|
||||
private static string ResolveParseStatus(
|
||||
IReadOnlyList<SharedParsing.ParsedCriticalEffect> effects,
|
||||
IReadOnlyList<SharedParsing.ParsedCriticalBranch> branches) =>
|
||||
@@ -876,6 +919,16 @@ public sealed class LookupService(IDbContextFactory<RolemasterDbContext> dbConte
|
||||
supportsPowerPointModifier);
|
||||
}
|
||||
|
||||
private static async Task<SharedParsing.CriticalCellParseContent> ParseCriticalCellContentAsync(
|
||||
RolemasterDbContext dbContext,
|
||||
int tableId,
|
||||
string rawCellText,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var affixLegend = await BuildSharedAffixLegendAsync(dbContext, tableId, cancellationToken);
|
||||
return SharedParsing.CriticalCellTextParser.Parse(rawCellText, affixLegend);
|
||||
}
|
||||
|
||||
private static bool IsLegendSymbolEffectCode(string effectCode) =>
|
||||
effectCode is CriticalEffectCodes.MustParryRounds
|
||||
or CriticalEffectCodes.NoParryRounds
|
||||
|
||||
Reference in New Issue
Block a user