Recover legacy campaign saves

This commit is contained in:
2026-07-05 08:58:58 +09:00
parent 5a76eb07ad
commit d92d5f9061
5 changed files with 152 additions and 16 deletions

View File

@@ -18,7 +18,7 @@ try {
await waitForTitle(page);
await page.screenshot({ path: 'dist/verification-save-title-empty.png', fullPage: true });
await page.mouse.click(962, 240);
await startTitleDefaultAction(page);
await advanceUntilBattle(page, 'first-battle-zhuo-commandery');
await page.screenshot({ path: 'dist/verification-save-new-battle.png', fullPage: true });
@@ -31,7 +31,7 @@ try {
await waitForTitle(page);
await page.screenshot({ path: 'dist/verification-save-title-continue.png', fullPage: true });
await page.mouse.click(962, 310);
await startTitleDefaultAction(page);
await waitForBattleReady(page, 'first-battle-zhuo-commandery');
const continuedBattle = await page.evaluate(() => window.__HEROS_DEBUG__?.battle());
if (continuedBattle?.battleOutcome !== null || continuedBattle?.resultVisible !== false || continuedBattle?.turnNumber !== 1) {
@@ -72,10 +72,7 @@ try {
await page.screenshot({ path: 'dist/verification-save-victory-result.png', fullPage: true });
await page.mouse.click(738, 642);
await page.waitForFunction(() => {
const activeScenes = window.__HEROS_DEBUG__?.activeScenes() ?? [];
return activeScenes.includes('CampScene');
}, undefined, { timeout: 90000 });
await advanceUntilCamp(page);
await page.screenshot({ path: 'dist/verification-save-victory-camp.png', fullPage: true });
const campState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
@@ -108,8 +105,14 @@ async function waitForTitle(page) {
}, undefined, { timeout: 90000 });
}
async function startTitleDefaultAction(page) {
await waitForTitle(page);
await page.keyboard.press('Enter');
await page.waitForTimeout(300);
}
async function advanceUntilBattle(page, battleId) {
for (let i = 0; i < 32; i += 1) {
for (let i = 0; i < 180; i += 1) {
const battleReady = await page.evaluate((expectedBattleId) => {
let state;
try {
@@ -121,7 +124,7 @@ async function advanceUntilBattle(page, battleId) {
state?.scene === 'BattleScene' &&
state?.battleId === expectedBattleId &&
state?.battleOutcome === null &&
state?.phase === 'idle' &&
['deployment', 'idle'].includes(state?.phase) &&
state?.mapBackgroundReady === true &&
state?.resultVisible === false
);
@@ -131,11 +134,17 @@ async function advanceUntilBattle(page, battleId) {
return;
}
await page.keyboard.press('Space');
await page.waitForTimeout(220);
const activeScenes = await page.evaluate(() => window.__HEROS_DEBUG__?.activeScenes() ?? []);
await page.keyboard.press(activeScenes.includes('TitleScene') ? 'Enter' : 'Space');
await page.waitForTimeout(240);
}
await waitForBattleReady(page, battleId);
const state = await page.evaluate(() => ({
activeScenes: window.__HEROS_DEBUG__?.activeScenes() ?? [],
battle: window.__HEROS_DEBUG__?.battle(),
camp: window.__HEROS_DEBUG__?.camp()
}));
throw new Error(`Expected to advance into ${battleId}: ${JSON.stringify(state)}`);
}
async function waitForBattleReady(page, battleId) {
@@ -150,7 +159,7 @@ async function waitForBattleReady(page, battleId) {
state?.scene === 'BattleScene' &&
state?.battleId === expectedBattleId &&
state?.battleOutcome === null &&
state?.phase === 'idle' &&
['deployment', 'idle'].includes(state?.phase) &&
state?.mapBackgroundReady === true &&
state?.resultVisible === false
);
@@ -169,6 +178,34 @@ async function waitForBattleOutcome(page, outcome) {
}, outcome, { timeout: 90000 });
}
async function advanceUntilCamp(page) {
for (let i = 0; i < 240; i += 1) {
const state = await page.evaluate(() => ({
activeScenes: window.__HEROS_DEBUG__?.activeScenes() ?? [],
battle: window.__HEROS_DEBUG__?.battle(),
camp: window.__HEROS_DEBUG__?.camp()
}));
if (state.activeScenes.includes('CampScene')) {
return;
}
if (state.activeScenes.includes('BattleScene') && state.battle?.battleOutcome === 'victory' && state.battle?.resultVisible) {
await page.mouse.click(738, 642);
} else {
await page.keyboard.press('Space');
}
await page.waitForTimeout(250);
}
const state = await page.evaluate(() => ({
activeScenes: window.__HEROS_DEBUG__?.activeScenes() ?? [],
battle: window.__HEROS_DEBUG__?.battle(),
camp: window.__HEROS_DEBUG__?.camp()
}));
throw new Error(`Expected victory flow to reach CampScene: ${JSON.stringify(state)}`);
}
async function readCampaignSave(page) {
return page.evaluate(() => {
const read = (key) => {