From 13228f82069ea65c3fd4973d5c5cb6a3c63022dc Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sun, 5 Jul 2026 17:43:13 +0900 Subject: [PATCH] Validate recommended class availability --- scripts/verify-battle-scenario-data.mjs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/verify-battle-scenario-data.mjs b/scripts/verify-battle-scenario-data.mjs index 42e269f..893ddaf 100644 --- a/scripts/verify-battle-scenario-data.mjs +++ b/scripts/verify-battle-scenario-data.mjs @@ -272,10 +272,17 @@ function validateSortie(errors, scenario, classKeys, formationRoles, terrainRule sortie.recommendedClasses.forEach((recommendation) => { assertNonEmptyString(errors, recommendation.label, `${context}: recommended class label`); assertNonEmptyString(errors, recommendation.reason, `${context}/${recommendation.label}: recommended class reason`); + const recommendedClassKeys = Array.isArray(recommendation.classKeys) ? recommendation.classKeys : []; if (!Array.isArray(recommendation.classKeys) || recommendation.classKeys.length === 0) { errors.push(`${context}/${recommendation.label}: recommended class must include at least one classKey`); } - recommendation.classKeys.forEach((classKey) => { + const availableRecommendedUnits = scenario.units.filter( + (unit) => unit.faction === 'ally' && !excludedUnitIds.has(unit.id) && recommendedClassKeys.includes(unit.classKey) + ); + if (availableRecommendedUnits.length === 0) { + errors.push(`${context}/${recommendation.label}: recommended class has no available allied unit`); + } + recommendedClassKeys.forEach((classKey) => { if (!classKeys.has(classKey)) { errors.push(`${context}: recommended class "${recommendation.label}" references unknown classKey "${classKey}"`); }