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 sortieFlowCampaignSteps = extractSortieFlowCampaignSteps(campaignFlowSource);
const sortieFlowNextBattleIds = extractSortieFlowNextBattleIds(campaignFlowSource, battleScenarioIds); const sortieFlowNextBattleIds = extractSortieFlowNextBattleIds(campaignFlowSource, battleScenarioIds);
const sortieFlowTitleBattleIds = extractSortieFlowTitleBattleIds(campaignFlowSource, battleScenarioIds); const sortieFlowTitleBattleIds = extractSortieFlowTitleBattleIds(campaignFlowSource, battleScenarioIds);
const campaignRewardUnlockBattleIds = extractCampaignRewardUnlockBattleIds(battlesSource, battleScenarioIds); const campaignRewardUnlocks = extractCampaignRewardUnlocks(battlesSource, battleScenarioIds);
const sortieFlowDisplayFields = ['eyebrow', 'title', 'description', 'rewardHint']; const sortieFlowDisplayFields = ['eyebrow', 'title', 'description', 'rewardHint'];
const failures = []; 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`); 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); const nextBattleId = sortieFlowNextBattleIds.get(battleId);
assert(battleIds.has(unlockBattleId), `Battle ${battleId} campaign reward unlocks unknown battle id: ${unlockBattleId}`); 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, `Battle ${battleId} campaign reward unlocks ${unlockBattleId} but has no sortie flow next battle`);
assert( assert(
nextBattleId === unlockBattleId, nextBattleId === unlockBattleId,
@@ -253,14 +255,18 @@ function extractSortieFlowAfterBattleIds(source, scenarioIds) {
return entries; return entries;
} }
function extractCampaignRewardUnlockBattleIds(source, scenarioIds) { function extractCampaignRewardUnlocks(source, scenarioIds) {
const entries = new Map(); const entries = new Map();
const declarationPattern = /export const (\w+BattleScenario)\b[\s\S]*?^\};/gm; const declarationPattern = /export const (\w+BattleScenario)\b[\s\S]*?^\};/gm;
for (const match of source.matchAll(declarationPattern)) { for (const match of source.matchAll(declarationPattern)) {
const battleId = scenarioIds.get(match[1]); const battleId = scenarioIds.get(match[1]);
const unlockMatch = /unlockBattleId:\s*'([^']+)'/.exec(match[0]); const unlockMatch = /unlockBattleId:\s*'([^']+)'/.exec(match[0]);
const labelMatch = /unlockLabel:\s*'([^']+)'/.exec(match[0]);
if (battleId && unlockMatch) { if (battleId && unlockMatch) {
entries.set(battleId, unlockMatch[1]); entries.set(battleId, {
battleId: unlockMatch[1],
label: (labelMatch?.[1] ?? '').trim()
});
} }
} }
return entries; return entries;