feat: add spoiler-safe campaign objective journal

This commit is contained in:
2026-07-28 11:05:57 +09:00
parent a67cfbfbe3
commit 91607cfd4c
16 changed files with 5116 additions and 220 deletions

View File

@@ -1348,7 +1348,7 @@ async function setupBattle(page, battle) {
return (
state?.scene === 'BattleScene' &&
state?.battleId === battleId &&
(state?.phase === 'deployment' || state?.phase === 'idle') &&
state?.phase === 'deployment' &&
state?.mapBackgroundReady === true
);
},
@@ -1536,7 +1536,7 @@ async function setupCumulativeBattle(page, battle, firstBattle, route) {
return (
state?.scene === 'BattleScene' &&
state?.battleId === battleId &&
(state?.phase === 'deployment' || state?.phase === 'idle') &&
state?.phase === 'deployment' &&
state?.mapBackgroundReady === true
);
},
@@ -1649,7 +1649,9 @@ async function startDeploymentIfNeeded(page, battleId) {
}, battleId);
if (state?.phase !== 'deployment') {
return;
throw new Error(
`Expected ${battleId} to expose deployment before battle start: ${JSON.stringify(state)}`
);
}
await clickBattleDeploymentStart(page);
@@ -1844,6 +1846,20 @@ async function enterCampaignCampFromBattleResult(page, battle, route) {
settlement = await page.evaluate(() => window.__HEROS_DEBUG__?.battle()?.resultSettlement);
}
await page.waitForFunction(
() => {
const resultSettlement = window.__HEROS_DEBUG__?.battle()?.resultSettlement;
return (
resultSettlement?.status === 'complete' &&
resultSettlement?.cta?.interactive === true &&
resultSettlement?.cta?.bounds
);
},
undefined,
{ timeout: 30000 }
);
settlement = await page.evaluate(() => window.__HEROS_DEBUG__?.battle()?.resultSettlement);
const expectedDestination = 'victory-story';
if (settlement?.cta?.destination !== expectedDestination) {
throw new Error(
@@ -1915,6 +1931,21 @@ async function enterFinalCampFromBattleResult(page) {
);
settlement = await page.evaluate(() => window.__HEROS_DEBUG__?.battle()?.resultSettlement);
}
await page.waitForFunction(
() => {
const resultSettlement = window.__HEROS_DEBUG__?.battle()?.resultSettlement;
return (
resultSettlement?.status === 'complete' &&
resultSettlement?.cta?.interactive === true &&
resultSettlement?.cta?.bounds
);
},
undefined,
{ timeout: 30000 }
);
settlement = await page.evaluate(() => window.__HEROS_DEBUG__?.battle()?.resultSettlement);
if (settlement?.cta?.destination !== 'victory-story') {
throw new Error(`Final victory must continue through its aftermath before the final camp: ${JSON.stringify(settlement)}`);
}