Require visible unlock reward labels

This commit is contained in:
2026-07-05 18:04:25 +09:00
parent 4a7bca0f61
commit 2011381c48

View File

@@ -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;