Add Chengdu surrender chapter
This commit is contained in:
@@ -1736,7 +1736,7 @@ try {
|
||||
if (
|
||||
progressTabState?.activeTab !== 'progress' ||
|
||||
progressTabState.campaignProgress?.completedKnown !== 17 ||
|
||||
progressTabState.campaignProgress?.totalKnown !== 32 ||
|
||||
progressTabState.campaignProgress?.totalKnown !== 33 ||
|
||||
progressTabState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
|
||||
progressTabState.campaignProgress?.latestBattleTitle !== '융중 방문로' ||
|
||||
progressTabState.campaignProgress?.nextBattleTitle !== '박망파 매복전'
|
||||
@@ -1888,7 +1888,7 @@ try {
|
||||
if (
|
||||
postBowangProgressState?.activeTab !== 'progress' ||
|
||||
postBowangProgressState.campaignProgress?.completedKnown !== 18 ||
|
||||
postBowangProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postBowangProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postBowangProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
|
||||
postBowangProgressState.campaignProgress?.latestBattleTitle !== '박망파 매복전' ||
|
||||
postBowangProgressState.campaignProgress?.nextBattleTitle !== '장판파 피난로'
|
||||
@@ -2026,7 +2026,7 @@ try {
|
||||
if (
|
||||
postChangbanProgressState?.activeTab !== 'progress' ||
|
||||
postChangbanProgressState.campaignProgress?.completedKnown !== 19 ||
|
||||
postChangbanProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postChangbanProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postChangbanProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
|
||||
postChangbanProgressState.campaignProgress?.latestBattleTitle !== '장판파 피난로' ||
|
||||
postChangbanProgressState.campaignProgress?.nextBattleTitle !== '강동 사절로'
|
||||
@@ -2164,7 +2164,7 @@ try {
|
||||
if (
|
||||
postJiangdongProgressState?.activeTab !== 'progress' ||
|
||||
postJiangdongProgressState.campaignProgress?.completedKnown !== 20 ||
|
||||
postJiangdongProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postJiangdongProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postJiangdongProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
|
||||
postJiangdongProgressState.campaignProgress?.latestBattleTitle !== '강동 사절로' ||
|
||||
postJiangdongProgressState.campaignProgress?.nextBattleTitle !== '적벽 전초전'
|
||||
@@ -2304,7 +2304,7 @@ try {
|
||||
if (
|
||||
postRedCliffsProgressState?.activeTab !== 'progress' ||
|
||||
postRedCliffsProgressState.campaignProgress?.completedKnown !== 21 ||
|
||||
postRedCliffsProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postRedCliffsProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postRedCliffsProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
|
||||
postRedCliffsProgressState.campaignProgress?.latestBattleTitle !== '적벽 전초전' ||
|
||||
postRedCliffsProgressState.campaignProgress?.nextBattleTitle !== '적벽 화공전'
|
||||
@@ -2444,7 +2444,7 @@ try {
|
||||
if (
|
||||
postFireAttackProgressState?.activeTab !== 'progress' ||
|
||||
postFireAttackProgressState.campaignProgress?.completedKnown !== 22 ||
|
||||
postFireAttackProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postFireAttackProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postFireAttackProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postFireAttackProgressState.campaignProgress?.latestBattleTitle !== '적벽 화공전' ||
|
||||
postFireAttackProgressState.campaignProgress?.nextBattleTitle !== '형주 남부 진입전'
|
||||
@@ -2587,7 +2587,7 @@ try {
|
||||
if (
|
||||
postJingzhouProgressState?.activeTab !== 'progress' ||
|
||||
postJingzhouProgressState.campaignProgress?.completedKnown !== 23 ||
|
||||
postJingzhouProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postJingzhouProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postJingzhouProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postJingzhouProgressState.campaignProgress?.latestBattleTitle !== '형주 남부 진입전' ||
|
||||
postJingzhouProgressState.campaignProgress?.nextBattleTitle !== '계양 설득전'
|
||||
@@ -2729,7 +2729,7 @@ try {
|
||||
if (
|
||||
postGuiyangProgressState?.activeTab !== 'progress' ||
|
||||
postGuiyangProgressState.campaignProgress?.completedKnown !== 24 ||
|
||||
postGuiyangProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postGuiyangProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postGuiyangProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postGuiyangProgressState.campaignProgress?.latestBattleTitle !== '계양 설득전' ||
|
||||
postGuiyangProgressState.campaignProgress?.nextBattleTitle !== '무릉 산길 확보전'
|
||||
@@ -2872,7 +2872,7 @@ try {
|
||||
if (
|
||||
postWulingProgressState?.activeTab !== 'progress' ||
|
||||
postWulingProgressState.campaignProgress?.completedKnown !== 25 ||
|
||||
postWulingProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postWulingProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postWulingProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postWulingProgressState.campaignProgress?.latestBattleTitle !== '무릉 산길 확보전' ||
|
||||
postWulingProgressState.campaignProgress?.nextBattleTitle !== '장사 노장 대면전'
|
||||
@@ -3021,7 +3021,7 @@ try {
|
||||
if (
|
||||
postChangshaProgressState?.activeTab !== 'progress' ||
|
||||
postChangshaProgressState.campaignProgress?.completedKnown !== 26 ||
|
||||
postChangshaProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postChangshaProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postChangshaProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postChangshaProgressState.campaignProgress?.latestBattleTitle !== '장사 노장 대면전' ||
|
||||
postChangshaProgressState.campaignProgress?.nextBattleTitle !== '익주 원군로'
|
||||
@@ -3166,7 +3166,7 @@ try {
|
||||
if (
|
||||
postYizhouProgressState?.activeTab !== 'progress' ||
|
||||
postYizhouProgressState.campaignProgress?.completedKnown !== 27 ||
|
||||
postYizhouProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postYizhouProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postYizhouProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postYizhouProgressState.campaignProgress?.latestBattleTitle !== '익주 원군로' ||
|
||||
postYizhouProgressState.campaignProgress?.nextBattleTitle !== '부수관 진입전'
|
||||
@@ -3313,7 +3313,7 @@ try {
|
||||
if (
|
||||
postFuPassProgressState?.activeTab !== 'progress' ||
|
||||
postFuPassProgressState.campaignProgress?.completedKnown !== 28 ||
|
||||
postFuPassProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postFuPassProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postFuPassProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postFuPassProgressState.campaignProgress?.latestBattleTitle !== '부수관 진입전' ||
|
||||
postFuPassProgressState.campaignProgress?.nextBattleTitle !== '낙성 외곽전'
|
||||
@@ -3462,7 +3462,7 @@ try {
|
||||
if (
|
||||
postLuoProgressState?.activeTab !== 'progress' ||
|
||||
postLuoProgressState.campaignProgress?.completedKnown !== 29 ||
|
||||
postLuoProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postLuoProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postLuoProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postLuoProgressState.campaignProgress?.latestBattleTitle !== '낙성 외곽전' ||
|
||||
postLuoProgressState.campaignProgress?.nextBattleTitle !== '낙봉파 매복전'
|
||||
@@ -3608,7 +3608,7 @@ try {
|
||||
if (
|
||||
postLuofengProgressState?.activeTab !== 'progress' ||
|
||||
postLuofengProgressState.campaignProgress?.completedKnown !== 30 ||
|
||||
postLuofengProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postLuofengProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postLuofengProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postLuofengProgressState.campaignProgress?.latestBattleTitle !== '낙봉파 매복전' ||
|
||||
postLuofengProgressState.campaignProgress?.nextBattleTitle !== '낙성 본성 공략'
|
||||
@@ -3760,7 +3760,7 @@ try {
|
||||
if (
|
||||
postLuoMainProgressState?.activeTab !== 'progress' ||
|
||||
postLuoMainProgressState.campaignProgress?.completedKnown !== 31 ||
|
||||
postLuoMainProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postLuoMainProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postLuoMainProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postLuoMainProgressState.campaignProgress?.latestBattleTitle !== '낙성 본성 공략' ||
|
||||
postLuoMainProgressState.campaignProgress?.nextBattleTitle !== '면죽관 압박전'
|
||||
@@ -3913,15 +3913,169 @@ try {
|
||||
if (
|
||||
postMianzhuProgressState?.activeTab !== 'progress' ||
|
||||
postMianzhuProgressState.campaignProgress?.completedKnown !== 32 ||
|
||||
postMianzhuProgressState.campaignProgress?.totalKnown !== 32 ||
|
||||
postMianzhuProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postMianzhuProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postMianzhuProgressState.campaignProgress?.latestBattleTitle !== '면죽관 압박전' ||
|
||||
postMianzhuProgressState.campaignProgress?.nextBattleTitle !== '준비 중'
|
||||
postMianzhuProgressState.campaignProgress?.nextBattleTitle !== '성도 항복 권고전'
|
||||
) {
|
||||
throw new Error(`Expected post-Mianzhu progress tab to complete Mianzhu pressure and pause before Chengdu surrender: ${JSON.stringify(postMianzhuProgressState?.campaignProgress)}`);
|
||||
throw new Error(`Expected post-Mianzhu progress tab to complete Mianzhu pressure and open Chengdu surrender: ${JSON.stringify(postMianzhuProgressState?.campaignProgress)}`);
|
||||
}
|
||||
await page.screenshot({ path: 'dist/verification-post-mianzhu-progress.png', fullPage: true });
|
||||
|
||||
await page.mouse.click(1120, 38);
|
||||
await page.waitForTimeout(180);
|
||||
const chengduSortieState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
|
||||
if (
|
||||
!chengduSortieState?.sortieVisible ||
|
||||
!chengduSortieState.sortiePlan?.objectiveLine?.includes('성도 항복 권고전') ||
|
||||
!chengduSortieState.sortieRoster?.some((unit) => unit.id === 'li-yan' && unit.recruited && unit.recommended) ||
|
||||
!chengduSortieState.sortieRoster?.some((unit) => unit.id === 'zhuge-liang' && unit.recruited && unit.recommended) ||
|
||||
!chengduSortieState.sortieRoster?.some((unit) => unit.id === 'fa-zheng' && unit.recruited && unit.recommended) ||
|
||||
!chengduSortieState.sortieRoster?.some((unit) => unit.id === 'yan-yan' && unit.recruited && unit.recommended) ||
|
||||
!chengduSortieState.sortieRoster?.some((unit) => unit.id === 'wu-yi' && unit.recruited && unit.recommended) ||
|
||||
chengduSortieState.sortieRoster?.some((unit) => unit.id === 'huang-quan') ||
|
||||
chengduSortieState.sortieRoster?.length < 18 ||
|
||||
chengduSortieState.sortiePlan?.maxCount !== 6
|
||||
) {
|
||||
throw new Error(`Expected Mianzhu camp sortie prep to target Chengdu surrender with Li Yan selectable and Huang Quan absent before victory: ${JSON.stringify(chengduSortieState)}`);
|
||||
}
|
||||
assertSortieTacticalRoster(chengduSortieState, [
|
||||
'liu-bei',
|
||||
'guan-yu',
|
||||
'zhang-fei',
|
||||
'jian-yong',
|
||||
'mi-zhu',
|
||||
'sun-qian',
|
||||
'zhao-yun',
|
||||
'zhuge-liang',
|
||||
'ma-liang',
|
||||
'yi-ji',
|
||||
'gong-zhi',
|
||||
'huang-zhong',
|
||||
'wei-yan',
|
||||
'pang-tong',
|
||||
'fa-zheng',
|
||||
'wu-yi',
|
||||
'yan-yan',
|
||||
'li-yan'
|
||||
]);
|
||||
|
||||
const chengduPriorityUnits = ['li-yan', 'zhuge-liang', 'fa-zheng', 'yan-yan', 'wu-yi'];
|
||||
for (const unitId of chengduPriorityUnits) {
|
||||
const currentSortieState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
|
||||
if (!currentSortieState.sortieRoster?.some((unit) => unit.id === unitId && unit.selected)) {
|
||||
const removable = currentSortieState.sortieRoster?.find(
|
||||
(unit) => unit.selected && unit.id !== 'liu-bei' && !chengduPriorityUnits.includes(unit.id)
|
||||
);
|
||||
if (removable) {
|
||||
await clickSortieRosterUnit(page, removable.id);
|
||||
}
|
||||
await clickSortieRosterUnit(page, unitId);
|
||||
}
|
||||
}
|
||||
|
||||
const chengduSortieReadyState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
|
||||
if (
|
||||
!chengduPriorityUnits.every((unitId) =>
|
||||
chengduSortieReadyState.sortieRoster?.some((unit) => unit.id === unitId && unit.selected)
|
||||
) ||
|
||||
chengduSortieReadyState.sortiePlan?.selectedCount !== 6 ||
|
||||
chengduSortieReadyState.sortiePlan?.recommendedSelectedCount < 6
|
||||
) {
|
||||
throw new Error(`Expected Chengdu surrender sortie to deploy Li Yan, Zhuge Liang, Fa Zheng, Yan Yan, and Wu Yi while preserving six-officer pressure: ${JSON.stringify(chengduSortieReadyState)}`);
|
||||
}
|
||||
await page.screenshot({ path: 'dist/verification-chengdu-sortie.png', fullPage: true });
|
||||
|
||||
await page.mouse.click(1068, 646);
|
||||
await page.waitForFunction(() => {
|
||||
const activeScenes = window.__HEROS_DEBUG__?.activeScenes() ?? [];
|
||||
return activeScenes.includes('StoryScene');
|
||||
});
|
||||
await page.screenshot({ path: 'dist/verification-chengdu-story.png', fullPage: true });
|
||||
|
||||
for (let i = 0; i < 50; i += 1) {
|
||||
const enteredThirtyThirdBattle = await page.evaluate(() => {
|
||||
const state = window.__HEROS_DEBUG__?.battle();
|
||||
return state?.scene === 'BattleScene' && state?.battleId === 'thirty-third-battle-chengdu-surrender';
|
||||
});
|
||||
if (enteredThirtyThirdBattle) {
|
||||
break;
|
||||
}
|
||||
await page.keyboard.press('Space');
|
||||
await page.waitForTimeout(320);
|
||||
}
|
||||
await page.waitForFunction(() => {
|
||||
const state = window.__HEROS_DEBUG__?.battle();
|
||||
return state?.scene === 'BattleScene' && state?.battleId === 'thirty-third-battle-chengdu-surrender' && state?.battleOutcome === null && state?.phase === 'idle';
|
||||
});
|
||||
await page.screenshot({ path: 'dist/verification-thirty-third-battle.png', fullPage: true });
|
||||
|
||||
const thirtyThirdBattleState = await page.evaluate(() => window.__HEROS_DEBUG__?.battle());
|
||||
const thirtyThirdEnemies = thirtyThirdBattleState.units.filter((unit) => unit.faction === 'enemy');
|
||||
const thirtyThirdAllies = thirtyThirdBattleState.units.filter((unit) => unit.faction === 'ally');
|
||||
const thirtyThirdEnemyBehaviors = new Set(thirtyThirdEnemies.map((unit) => unit.ai));
|
||||
if (
|
||||
thirtyThirdBattleState.camera?.mapWidth !== 66 ||
|
||||
thirtyThirdBattleState.camera?.mapHeight !== 48 ||
|
||||
thirtyThirdBattleState.victoryConditionLabel !== '황권 방어선 격파' ||
|
||||
thirtyThirdEnemies.length < 26 ||
|
||||
!thirtyThirdEnemyBehaviors.has('aggressive') ||
|
||||
!thirtyThirdEnemyBehaviors.has('guard') ||
|
||||
!thirtyThirdEnemyBehaviors.has('hold') ||
|
||||
!thirtyThirdEnemies.some((unit) => unit.id === 'chengdu-final-leader-huang-quan') ||
|
||||
!thirtyThirdEnemies.some((unit) => unit.id === 'chengdu-final-officer-a') ||
|
||||
!thirtyThirdAllies.some((unit) => unit.id === 'li-yan') ||
|
||||
!thirtyThirdAllies.some((unit) => unit.id === 'zhuge-liang') ||
|
||||
!thirtyThirdAllies.some((unit) => unit.id === 'fa-zheng') ||
|
||||
!thirtyThirdAllies.some((unit) => unit.id === 'yan-yan') ||
|
||||
!thirtyThirdAllies.some((unit) => unit.id === 'wu-yi') ||
|
||||
thirtyThirdAllies.some((unit) => unit.id === 'huang-quan')
|
||||
) {
|
||||
throw new Error(`Expected thirty-third battle to use Chengdu surrender map, Huang Quan objective, Li Yan first sortie, selected allied officers, and mixed AI: ${JSON.stringify(thirtyThirdBattleState)}`);
|
||||
}
|
||||
|
||||
await page.evaluate(() => window.__HEROS_DEBUG__?.forceBattleOutcome('victory'));
|
||||
await page.waitForFunction(() => {
|
||||
const state = window.__HEROS_DEBUG__?.battle();
|
||||
return state?.battleOutcome === 'victory' && state?.phase === 'resolved' && state?.resultVisible === true;
|
||||
});
|
||||
|
||||
await page.mouse.click(738, 642);
|
||||
await page.waitForFunction(() => {
|
||||
const activeScenes = window.__HEROS_DEBUG__?.activeScenes() ?? [];
|
||||
return activeScenes.includes('CampScene');
|
||||
});
|
||||
|
||||
const thirtyThirdCampState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
|
||||
if (
|
||||
thirtyThirdCampState?.campBattleId !== 'thirty-third-battle-chengdu-surrender' ||
|
||||
thirtyThirdCampState.campTitle !== '성도 항복 후 군영' ||
|
||||
thirtyThirdCampState.availableDialogueIds?.length !== 3 ||
|
||||
!thirtyThirdCampState.availableDialogueIds.every((id) => id.endsWith('chengdu')) ||
|
||||
thirtyThirdCampState.availableVisitIds?.length !== 2 ||
|
||||
!thirtyThirdCampState.campaign?.roster?.some((unit) => unit.id === 'huang-quan') ||
|
||||
!thirtyThirdCampState.sortieRoster?.some((unit) => unit.id === 'huang-quan' && unit.recruited) ||
|
||||
thirtyThirdCampState.rosterCollection?.total < 19
|
||||
) {
|
||||
throw new Error(`Expected thirty-third camp to recruit Huang Quan and expose Chengdu dialogue/visit sets: ${JSON.stringify(thirtyThirdCampState)}`);
|
||||
}
|
||||
await page.screenshot({ path: 'dist/verification-chengdu-camp.png', fullPage: true });
|
||||
|
||||
await page.mouse.click(966, 38);
|
||||
await page.waitForTimeout(180);
|
||||
const postChengduProgressState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
|
||||
if (
|
||||
postChengduProgressState?.activeTab !== 'progress' ||
|
||||
postChengduProgressState.campaignProgress?.completedKnown !== 33 ||
|
||||
postChengduProgressState.campaignProgress?.totalKnown !== 33 ||
|
||||
postChengduProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
|
||||
postChengduProgressState.campaignProgress?.latestBattleTitle !== '성도 항복 권고전' ||
|
||||
postChengduProgressState.campaignProgress?.nextBattleTitle !== '준비 중'
|
||||
) {
|
||||
throw new Error(`Expected post-Chengdu progress tab to complete Yi Province capture and pause before Shu-Han foundation: ${JSON.stringify(postChengduProgressState?.campaignProgress)}`);
|
||||
}
|
||||
await page.screenshot({ path: 'dist/verification-post-chengdu-progress.png', fullPage: true });
|
||||
|
||||
await page.evaluate(() => {
|
||||
const game = window.__HEROS_GAME__;
|
||||
game?.scene.stop('CampScene');
|
||||
@@ -3940,7 +4094,7 @@ try {
|
||||
return activeScenes.includes('CampScene');
|
||||
});
|
||||
|
||||
console.log(`Verified title-to-thirty-second-battle flow, recruited officer sortie selection, Ma Liang, Yi Ji, Gong Zhi, Huang Zhong, Wei Yan, Pang Tong, Fa Zheng, Wu Yi, Yan Yan, Li Yan joins, Luofeng, Luo main gate, and Mianzhu battles, result states, and debug API at ${targetUrl}`);
|
||||
console.log(`Verified title-to-thirty-third-battle flow, recruited officer sortie selection, Ma Liang, Yi Ji, Gong Zhi, Huang Zhong, Wei Yan, Pang Tong, Fa Zheng, Wu Yi, Yan Yan, Li Yan, Huang Quan joins, Luofeng, Luo main gate, Mianzhu, and Chengdu surrender battles, result states, and debug API at ${targetUrl}`);
|
||||
} finally {
|
||||
await browser?.close();
|
||||
if (serverProcess && !serverProcess.killed) {
|
||||
|
||||
Reference in New Issue
Block a user