Validate sortie role slot alignment

This commit is contained in:
2026-07-05 17:46:20 +09:00
parent 13228f8206
commit 396f372746

View File

@@ -251,6 +251,7 @@ function validateSortie(errors, scenario, classKeys, formationRoles, terrainRule
}
});
const recommendedUnitIds = new Set();
const recommendedRoleByUnitId = new Map();
sortie.recommendedUnits.forEach((recommendation) => {
if (recommendedUnitIds.has(recommendation.unitId)) {
errors.push(`${context}: duplicate recommended unit "${recommendation.unitId}"`);
@@ -267,6 +268,9 @@ function validateSortie(errors, scenario, classKeys, formationRoles, terrainRule
if (recommendation.role && !formationRoles.has(recommendation.role)) {
errors.push(`${context}/${recommendation.unitId}: invalid recommendation role "${recommendation.role}"`);
}
if (recommendation.role) {
recommendedRoleByUnitId.set(recommendation.unitId, recommendation.role);
}
assertNonEmptyString(errors, recommendation.reason, `${context}/${recommendation.unitId}: recommendation reason`);
});
sortie.recommendedClasses.forEach((recommendation) => {
@@ -327,6 +331,12 @@ function validateSortie(errors, scenario, classKeys, formationRoles, terrainRule
if (slot.unitId && !requiredUnitIds.has(slot.unitId) && !recommendedUnitIds.has(slot.unitId)) {
errors.push(`${context}: deployment slot unit "${slot.unitId}" must be required or recommended`);
}
const recommendedRole = slot.unitId ? recommendedRoleByUnitId.get(slot.unitId) : undefined;
if (slot.role && recommendedRole && slot.role !== recommendedRole) {
errors.push(
`${context}: deployment slot unit "${slot.unitId}" role "${slot.role}" does not match recommendation role "${recommendedRole}"`
);
}
if (slot.unitId) {
if (deploymentUnitIds.has(slot.unitId)) {
errors.push(`${context}: duplicate deployment unit slot "${slot.unitId}"`);