From 2011381c4865d6704039e5e3203c92cd7c050867 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sun, 5 Jul 2026 18:04:25 +0900 Subject: [PATCH] Require visible unlock reward labels --- scripts/verify-campaign-flow-data.mjs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/scripts/verify-campaign-flow-data.mjs b/scripts/verify-campaign-flow-data.mjs index 0a951c9..583e206 100644 --- a/scripts/verify-campaign-flow-data.mjs +++ b/scripts/verify-campaign-flow-data.mjs @@ -16,7 +16,7 @@ const sortieFlowAfterBattleIds = extractSortieFlowAfterBattleIds(campaignFlowSou const sortieFlowCampaignSteps = extractSortieFlowCampaignSteps(campaignFlowSource); const sortieFlowNextBattleIds = extractSortieFlowNextBattleIds(campaignFlowSource, battleScenarioIds); const sortieFlowTitleBattleIds = extractSortieFlowTitleBattleIds(campaignFlowSource, battleScenarioIds); -const campaignRewardUnlockBattleIds = extractCampaignRewardUnlockBattleIds(battlesSource, battleScenarioIds); +const campaignRewardUnlocks = extractCampaignRewardUnlocks(battlesSource, battleScenarioIds); const sortieFlowDisplayFields = ['eyebrow', 'title', 'description', 'rewardHint']; const failures = []; @@ -104,9 +104,11 @@ for (const flowKey of sortieFlowKeys) { assert(/\bunavailableNotice\s*:/.test(flowBody), `Non-battle sortie flow ${flowKey} must provide an unavailableNotice for repeat clicks`); } -for (const [battleId, unlockBattleId] of campaignRewardUnlockBattleIds.entries()) { +for (const [battleId, unlock] of campaignRewardUnlocks.entries()) { + const { battleId: unlockBattleId, label } = unlock; const nextBattleId = sortieFlowNextBattleIds.get(battleId); assert(battleIds.has(unlockBattleId), `Battle ${battleId} campaign reward unlocks unknown battle id: ${unlockBattleId}`); + assert(label.length > 0, `Battle ${battleId} campaign reward unlock ${unlockBattleId} must provide a visible unlockLabel`); assert(nextBattleId, `Battle ${battleId} campaign reward unlocks ${unlockBattleId} but has no sortie flow next battle`); assert( nextBattleId === unlockBattleId, @@ -253,14 +255,18 @@ function extractSortieFlowAfterBattleIds(source, scenarioIds) { return entries; } -function extractCampaignRewardUnlockBattleIds(source, scenarioIds) { +function extractCampaignRewardUnlocks(source, scenarioIds) { const entries = new Map(); const declarationPattern = /export const (\w+BattleScenario)\b[\s\S]*?^\};/gm; for (const match of source.matchAll(declarationPattern)) { const battleId = scenarioIds.get(match[1]); const unlockMatch = /unlockBattleId:\s*'([^']+)'/.exec(match[0]); + const labelMatch = /unlockLabel:\s*'([^']+)'/.exec(match[0]); if (battleId && unlockMatch) { - entries.set(battleId, unlockMatch[1]); + entries.set(battleId, { + battleId: unlockMatch[1], + label: (labelMatch?.[1] ?? '').trim() + }); } } return entries;