Add Chencang siege campaign chapter

This commit is contained in:
2026-06-24 11:03:12 +09:00
parent f9689c0149
commit 779b639bdf
10 changed files with 834 additions and 75 deletions

View File

@@ -1,4 +1,4 @@
import { spawn } from 'node:child_process';
import { spawn } from 'node:child_process';
import { chromium } from 'playwright';
const targetUrl = process.env.VERIFY_URL ?? 'http://localhost:5173/';
@@ -1739,7 +1739,7 @@ try {
if (
progressTabState?.activeTab !== 'progress' ||
progressTabState.campaignProgress?.completedKnown !== 17 ||
progressTabState.campaignProgress?.totalKnown !== 58 ||
progressTabState.campaignProgress?.totalKnown !== 59 ||
progressTabState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
progressTabState.campaignProgress?.latestBattleTitle !== '융중 방문로' ||
progressTabState.campaignProgress?.nextBattleTitle !== '박망파 매복전'
@@ -1891,7 +1891,7 @@ try {
if (
postBowangProgressState?.activeTab !== 'progress' ||
postBowangProgressState.campaignProgress?.completedKnown !== 18 ||
postBowangProgressState.campaignProgress?.totalKnown !== 58 ||
postBowangProgressState.campaignProgress?.totalKnown !== 59 ||
postBowangProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
postBowangProgressState.campaignProgress?.latestBattleTitle !== '박망파 매복전' ||
postBowangProgressState.campaignProgress?.nextBattleTitle !== '장판파 피난로'
@@ -2029,7 +2029,7 @@ try {
if (
postChangbanProgressState?.activeTab !== 'progress' ||
postChangbanProgressState.campaignProgress?.completedKnown !== 19 ||
postChangbanProgressState.campaignProgress?.totalKnown !== 58 ||
postChangbanProgressState.campaignProgress?.totalKnown !== 59 ||
postChangbanProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
postChangbanProgressState.campaignProgress?.latestBattleTitle !== '장판파 피난로' ||
postChangbanProgressState.campaignProgress?.nextBattleTitle !== '강동 사절로'
@@ -2167,7 +2167,7 @@ try {
if (
postJiangdongProgressState?.activeTab !== 'progress' ||
postJiangdongProgressState.campaignProgress?.completedKnown !== 20 ||
postJiangdongProgressState.campaignProgress?.totalKnown !== 58 ||
postJiangdongProgressState.campaignProgress?.totalKnown !== 59 ||
postJiangdongProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
postJiangdongProgressState.campaignProgress?.latestBattleTitle !== '강동 사절로' ||
postJiangdongProgressState.campaignProgress?.nextBattleTitle !== '적벽 전초전'
@@ -2307,7 +2307,7 @@ try {
if (
postRedCliffsProgressState?.activeTab !== 'progress' ||
postRedCliffsProgressState.campaignProgress?.completedKnown !== 21 ||
postRedCliffsProgressState.campaignProgress?.totalKnown !== 58 ||
postRedCliffsProgressState.campaignProgress?.totalKnown !== 59 ||
postRedCliffsProgressState.campaignProgress?.activeChapter?.title !== '적벽대전' ||
postRedCliffsProgressState.campaignProgress?.latestBattleTitle !== '적벽 전초전' ||
postRedCliffsProgressState.campaignProgress?.nextBattleTitle !== '적벽 화공전'
@@ -2447,7 +2447,7 @@ try {
if (
postFireAttackProgressState?.activeTab !== 'progress' ||
postFireAttackProgressState.campaignProgress?.completedKnown !== 22 ||
postFireAttackProgressState.campaignProgress?.totalKnown !== 58 ||
postFireAttackProgressState.campaignProgress?.totalKnown !== 59 ||
postFireAttackProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postFireAttackProgressState.campaignProgress?.latestBattleTitle !== '적벽 화공전' ||
postFireAttackProgressState.campaignProgress?.nextBattleTitle !== '형주 남부 진입전'
@@ -2590,7 +2590,7 @@ try {
if (
postJingzhouProgressState?.activeTab !== 'progress' ||
postJingzhouProgressState.campaignProgress?.completedKnown !== 23 ||
postJingzhouProgressState.campaignProgress?.totalKnown !== 58 ||
postJingzhouProgressState.campaignProgress?.totalKnown !== 59 ||
postJingzhouProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postJingzhouProgressState.campaignProgress?.latestBattleTitle !== '형주 남부 진입전' ||
postJingzhouProgressState.campaignProgress?.nextBattleTitle !== '계양 설득전'
@@ -2732,7 +2732,7 @@ try {
if (
postGuiyangProgressState?.activeTab !== 'progress' ||
postGuiyangProgressState.campaignProgress?.completedKnown !== 24 ||
postGuiyangProgressState.campaignProgress?.totalKnown !== 58 ||
postGuiyangProgressState.campaignProgress?.totalKnown !== 59 ||
postGuiyangProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postGuiyangProgressState.campaignProgress?.latestBattleTitle !== '계양 설득전' ||
postGuiyangProgressState.campaignProgress?.nextBattleTitle !== '무릉 산길 확보전'
@@ -2875,7 +2875,7 @@ try {
if (
postWulingProgressState?.activeTab !== 'progress' ||
postWulingProgressState.campaignProgress?.completedKnown !== 25 ||
postWulingProgressState.campaignProgress?.totalKnown !== 58 ||
postWulingProgressState.campaignProgress?.totalKnown !== 59 ||
postWulingProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postWulingProgressState.campaignProgress?.latestBattleTitle !== '무릉 산길 확보전' ||
postWulingProgressState.campaignProgress?.nextBattleTitle !== '장사 노장 대면전'
@@ -3024,7 +3024,7 @@ try {
if (
postChangshaProgressState?.activeTab !== 'progress' ||
postChangshaProgressState.campaignProgress?.completedKnown !== 26 ||
postChangshaProgressState.campaignProgress?.totalKnown !== 58 ||
postChangshaProgressState.campaignProgress?.totalKnown !== 59 ||
postChangshaProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postChangshaProgressState.campaignProgress?.latestBattleTitle !== '장사 노장 대면전' ||
postChangshaProgressState.campaignProgress?.nextBattleTitle !== '익주 원군로'
@@ -3169,7 +3169,7 @@ try {
if (
postYizhouProgressState?.activeTab !== 'progress' ||
postYizhouProgressState.campaignProgress?.completedKnown !== 27 ||
postYizhouProgressState.campaignProgress?.totalKnown !== 58 ||
postYizhouProgressState.campaignProgress?.totalKnown !== 59 ||
postYizhouProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postYizhouProgressState.campaignProgress?.latestBattleTitle !== '익주 원군로' ||
postYizhouProgressState.campaignProgress?.nextBattleTitle !== '부수관 진입전'
@@ -3316,7 +3316,7 @@ try {
if (
postFuPassProgressState?.activeTab !== 'progress' ||
postFuPassProgressState.campaignProgress?.completedKnown !== 28 ||
postFuPassProgressState.campaignProgress?.totalKnown !== 58 ||
postFuPassProgressState.campaignProgress?.totalKnown !== 59 ||
postFuPassProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postFuPassProgressState.campaignProgress?.latestBattleTitle !== '부수관 진입전' ||
postFuPassProgressState.campaignProgress?.nextBattleTitle !== '낙성 외곽전'
@@ -3465,7 +3465,7 @@ try {
if (
postLuoProgressState?.activeTab !== 'progress' ||
postLuoProgressState.campaignProgress?.completedKnown !== 29 ||
postLuoProgressState.campaignProgress?.totalKnown !== 58 ||
postLuoProgressState.campaignProgress?.totalKnown !== 59 ||
postLuoProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postLuoProgressState.campaignProgress?.latestBattleTitle !== '낙성 외곽전' ||
postLuoProgressState.campaignProgress?.nextBattleTitle !== '낙봉파 매복전'
@@ -3611,7 +3611,7 @@ try {
if (
postLuofengProgressState?.activeTab !== 'progress' ||
postLuofengProgressState.campaignProgress?.completedKnown !== 30 ||
postLuofengProgressState.campaignProgress?.totalKnown !== 58 ||
postLuofengProgressState.campaignProgress?.totalKnown !== 59 ||
postLuofengProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postLuofengProgressState.campaignProgress?.latestBattleTitle !== '낙봉파 매복전' ||
postLuofengProgressState.campaignProgress?.nextBattleTitle !== '낙성 본성 공략'
@@ -3763,7 +3763,7 @@ try {
if (
postLuoMainProgressState?.activeTab !== 'progress' ||
postLuoMainProgressState.campaignProgress?.completedKnown !== 31 ||
postLuoMainProgressState.campaignProgress?.totalKnown !== 58 ||
postLuoMainProgressState.campaignProgress?.totalKnown !== 59 ||
postLuoMainProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postLuoMainProgressState.campaignProgress?.latestBattleTitle !== '낙성 본성 공략' ||
postLuoMainProgressState.campaignProgress?.nextBattleTitle !== '면죽관 압박전'
@@ -3916,7 +3916,7 @@ try {
if (
postMianzhuProgressState?.activeTab !== 'progress' ||
postMianzhuProgressState.campaignProgress?.completedKnown !== 32 ||
postMianzhuProgressState.campaignProgress?.totalKnown !== 58 ||
postMianzhuProgressState.campaignProgress?.totalKnown !== 59 ||
postMianzhuProgressState.campaignProgress?.activeChapter?.title !== '형주·익주 확보' ||
postMianzhuProgressState.campaignProgress?.latestBattleTitle !== '면죽관 압박전' ||
postMianzhuProgressState.campaignProgress?.nextBattleTitle !== '성도 항복 권고전'
@@ -4070,7 +4070,7 @@ try {
if (
postChengduProgressState?.activeTab !== 'progress' ||
postChengduProgressState.campaignProgress?.completedKnown !== 33 ||
postChengduProgressState.campaignProgress?.totalKnown !== 58 ||
postChengduProgressState.campaignProgress?.totalKnown !== 59 ||
postChengduProgressState.campaignProgress?.activeChapter?.title !== '촉한 건국' ||
postChengduProgressState.campaignProgress?.latestBattleTitle !== '성도 항복 권고전' ||
postChengduProgressState.campaignProgress?.nextBattleTitle !== '가맹관 마초 대면전'
@@ -4225,7 +4225,7 @@ try {
if (
postJiamengProgressState?.activeTab !== 'progress' ||
postJiamengProgressState.campaignProgress?.completedKnown !== 34 ||
postJiamengProgressState.campaignProgress?.totalKnown !== 58 ||
postJiamengProgressState.campaignProgress?.totalKnown !== 59 ||
postJiamengProgressState.campaignProgress?.activeChapter?.title !== '촉한 건국' ||
postJiamengProgressState.campaignProgress?.latestBattleTitle !== '가맹관 마초 대면전' ||
postJiamengProgressState.campaignProgress?.nextBattleTitle !== '양평관 정찰전'
@@ -4381,7 +4381,7 @@ try {
if (
postYangpingProgressState?.activeTab !== 'progress' ||
postYangpingProgressState.campaignProgress?.completedKnown !== 35 ||
postYangpingProgressState.campaignProgress?.totalKnown !== 58 ||
postYangpingProgressState.campaignProgress?.totalKnown !== 59 ||
postYangpingProgressState.campaignProgress?.activeChapter?.title !== '촉한 건국' ||
postYangpingProgressState.campaignProgress?.latestBattleTitle !== '양평관 정찰전' ||
postYangpingProgressState.campaignProgress?.nextBattleTitle !== '정군산 전초전'
@@ -4538,7 +4538,7 @@ try {
if (
postDingjunProgressState?.activeTab !== 'progress' ||
postDingjunProgressState.campaignProgress?.completedKnown !== 36 ||
postDingjunProgressState.campaignProgress?.totalKnown !== 58 ||
postDingjunProgressState.campaignProgress?.totalKnown !== 59 ||
postDingjunProgressState.campaignProgress?.activeChapter?.title !== '촉한 건국' ||
postDingjunProgressState.campaignProgress?.latestBattleTitle !== '정군산 전초전' ||
postDingjunProgressState.campaignProgress?.nextBattleTitle !== '한중 결전'
@@ -4691,7 +4691,7 @@ try {
if (
postHanzhongProgressState?.activeTab !== 'progress' ||
postHanzhongProgressState.campaignProgress?.completedKnown !== 37 ||
postHanzhongProgressState.campaignProgress?.totalKnown !== 58 ||
postHanzhongProgressState.campaignProgress?.totalKnown !== 59 ||
postHanzhongProgressState.campaignProgress?.activeChapter?.title !== '촉한 건국' ||
postHanzhongProgressState.campaignProgress?.latestBattleTitle !== '한중 결전' ||
postHanzhongProgressState.campaignProgress?.nextBattleTitle !== '한중왕 즉위 준비'
@@ -4752,7 +4752,7 @@ try {
if (
postKingCouncilProgressState?.activeTab !== 'progress' ||
postKingCouncilProgressState.campaignProgress?.completedKnown !== 37 ||
postKingCouncilProgressState.campaignProgress?.totalKnown !== 58 ||
postKingCouncilProgressState.campaignProgress?.totalKnown !== 59 ||
postKingCouncilProgressState.campaignProgress?.latestBattleTitle !== '한중 결전' ||
postKingCouncilProgressState.campaignProgress?.nextBattleTitle !== '촉한 건국 선포'
) {
@@ -4812,7 +4812,7 @@ try {
if (
postFoundationProgressState?.activeTab !== 'progress' ||
postFoundationProgressState.campaignProgress?.completedKnown !== 37 ||
postFoundationProgressState.campaignProgress?.totalKnown !== 58 ||
postFoundationProgressState.campaignProgress?.totalKnown !== 59 ||
postFoundationProgressState.campaignProgress?.latestBattleTitle !== '한중 결전' ||
postFoundationProgressState.campaignProgress?.nextBattleTitle !== '형주 방위 전초전'
) {
@@ -4963,7 +4963,7 @@ try {
if (
postJingDefenseProgressState?.activeTab !== 'progress' ||
postJingDefenseProgressState.campaignProgress?.completedKnown !== 38 ||
postJingDefenseProgressState.campaignProgress?.totalKnown !== 58 ||
postJingDefenseProgressState.campaignProgress?.totalKnown !== 59 ||
postJingDefenseProgressState.campaignProgress?.latestBattleTitle !== '형주 방위 전초전' ||
postJingDefenseProgressState.campaignProgress?.nextBattleTitle !== '번성 외곽 압박전'
) {
@@ -5116,7 +5116,7 @@ try {
if (
postFanCastleProgressState?.activeTab !== 'progress' ||
postFanCastleProgressState.campaignProgress?.completedKnown !== 39 ||
postFanCastleProgressState.campaignProgress?.totalKnown !== 58 ||
postFanCastleProgressState.campaignProgress?.totalKnown !== 59 ||
postFanCastleProgressState.campaignProgress?.latestBattleTitle !== '번성 외곽 압박전' ||
postFanCastleProgressState.campaignProgress?.nextBattleTitle !== '한수 수공'
) {
@@ -5270,7 +5270,7 @@ try {
if (
postHanRiverProgressState?.activeTab !== 'progress' ||
postHanRiverProgressState.campaignProgress?.completedKnown !== 40 ||
postHanRiverProgressState.campaignProgress?.totalKnown !== 58 ||
postHanRiverProgressState.campaignProgress?.totalKnown !== 59 ||
postHanRiverProgressState.campaignProgress?.latestBattleTitle !== '한수 수공' ||
postHanRiverProgressState.campaignProgress?.nextBattleTitle !== '번성 공성전'
) {
@@ -5424,7 +5424,7 @@ try {
if (
postFanSiegeProgressState?.activeTab !== 'progress' ||
postFanSiegeProgressState.campaignProgress?.completedKnown !== 41 ||
postFanSiegeProgressState.campaignProgress?.totalKnown !== 58 ||
postFanSiegeProgressState.campaignProgress?.totalKnown !== 59 ||
postFanSiegeProgressState.campaignProgress?.latestBattleTitle !== '번성 공성전' ||
postFanSiegeProgressState.campaignProgress?.nextBattleTitle !== '강릉 나루 경계전'
) {
@@ -5586,7 +5586,7 @@ try {
if (
postJingRearProgressState?.activeTab !== 'progress' ||
postJingRearProgressState.campaignProgress?.completedKnown !== 42 ||
postJingRearProgressState.campaignProgress?.totalKnown !== 58 ||
postJingRearProgressState.campaignProgress?.totalKnown !== 59 ||
postJingRearProgressState.campaignProgress?.latestBattleTitle !== '강릉 나루 경계전' ||
postJingRearProgressState.campaignProgress?.nextBattleTitle !== '공안 성문 변고'
) {
@@ -5741,7 +5741,7 @@ try {
if (
postGonganProgressState?.activeTab !== 'progress' ||
postGonganProgressState.campaignProgress?.completedKnown !== 43 ||
postGonganProgressState.campaignProgress?.totalKnown !== 58 ||
postGonganProgressState.campaignProgress?.totalKnown !== 59 ||
postGonganProgressState.campaignProgress?.latestBattleTitle !== '공안 성문 변고' ||
postGonganProgressState.campaignProgress?.nextBattleTitle !== '맥성 고립전'
) {
@@ -5899,7 +5899,7 @@ try {
if (
postMaichengProgressState?.activeTab !== 'progress' ||
postMaichengProgressState.campaignProgress?.completedKnown !== 44 ||
postMaichengProgressState.campaignProgress?.totalKnown !== 58 ||
postMaichengProgressState.campaignProgress?.totalKnown !== 59 ||
postMaichengProgressState.campaignProgress?.latestBattleTitle !== '맥성 고립전' ||
postMaichengProgressState.campaignProgress?.nextBattleTitle !== '이릉 진격로'
) {
@@ -6056,7 +6056,7 @@ try {
if (
postYilingProgressState?.activeTab !== 'progress' ||
postYilingProgressState.campaignProgress?.completedKnown !== 45 ||
postYilingProgressState.campaignProgress?.totalKnown !== 58 ||
postYilingProgressState.campaignProgress?.totalKnown !== 59 ||
postYilingProgressState.campaignProgress?.latestBattleTitle !== '이릉 진격로' ||
postYilingProgressState.campaignProgress?.nextBattleTitle !== '이릉 화공전'
) {
@@ -6214,7 +6214,7 @@ try {
if (
postYilingFireProgressState?.activeTab !== 'progress' ||
postYilingFireProgressState.campaignProgress?.completedKnown !== 46 ||
postYilingFireProgressState.campaignProgress?.totalKnown !== 58 ||
postYilingFireProgressState.campaignProgress?.totalKnown !== 59 ||
postYilingFireProgressState.campaignProgress?.latestBattleTitle !== '이릉 화공전' ||
postYilingFireProgressState.campaignProgress?.nextBattleTitle !== '백제성 유탁'
) {
@@ -6280,7 +6280,7 @@ try {
if (
postBaidiProgressState?.activeTab !== 'progress' ||
postBaidiProgressState.campaignProgress?.completedKnown !== 46 ||
postBaidiProgressState.campaignProgress?.totalKnown !== 58 ||
postBaidiProgressState.campaignProgress?.totalKnown !== 59 ||
postBaidiProgressState.campaignProgress?.latestBattleTitle !== '이릉 화공전' ||
postBaidiProgressState.campaignProgress?.nextBattleTitle !== '남중 안정로'
) {
@@ -6441,7 +6441,7 @@ try {
if (
postNanzhongProgressState?.activeTab !== 'progress' ||
postNanzhongProgressState.campaignProgress?.completedKnown !== 47 ||
postNanzhongProgressState.campaignProgress?.totalKnown !== 58 ||
postNanzhongProgressState.campaignProgress?.totalKnown !== 59 ||
postNanzhongProgressState.campaignProgress?.latestBattleTitle !== '남중 안정로' ||
postNanzhongProgressState.campaignProgress?.nextBattleTitle !== '맹획 본대전'
) {
@@ -6603,7 +6603,7 @@ try {
if (
postMengHuoProgressState?.activeTab !== 'progress' ||
postMengHuoProgressState.campaignProgress?.completedKnown !== 48 ||
postMengHuoProgressState.campaignProgress?.totalKnown !== 58 ||
postMengHuoProgressState.campaignProgress?.totalKnown !== 59 ||
postMengHuoProgressState.campaignProgress?.latestBattleTitle !== '맹획 본대전' ||
postMengHuoProgressState.campaignProgress?.nextBattleTitle !== '칠종칠금 2차전'
) {
@@ -6765,7 +6765,7 @@ try {
if (
postSecondCaptureProgressState?.activeTab !== 'progress' ||
postSecondCaptureProgressState.campaignProgress?.completedKnown !== 49 ||
postSecondCaptureProgressState.campaignProgress?.totalKnown !== 58 ||
postSecondCaptureProgressState.campaignProgress?.totalKnown !== 59 ||
postSecondCaptureProgressState.campaignProgress?.latestBattleTitle !== '칠종칠금 2차전' ||
postSecondCaptureProgressState.campaignProgress?.nextBattleTitle !== '칠종칠금 3차전'
) {
@@ -6930,7 +6930,7 @@ try {
if (
postThirdCaptureProgressState?.activeTab !== 'progress' ||
postThirdCaptureProgressState.campaignProgress?.completedKnown !== 50 ||
postThirdCaptureProgressState.campaignProgress?.totalKnown !== 58 ||
postThirdCaptureProgressState.campaignProgress?.totalKnown !== 59 ||
postThirdCaptureProgressState.campaignProgress?.latestBattleTitle !== '칠종칠금 3차전' ||
postThirdCaptureProgressState.campaignProgress?.nextBattleTitle !== '칠종칠금 4차전'
) {
@@ -7096,7 +7096,7 @@ try {
if (
postFourthCaptureProgressState?.activeTab !== 'progress' ||
postFourthCaptureProgressState.campaignProgress?.completedKnown !== 51 ||
postFourthCaptureProgressState.campaignProgress?.totalKnown !== 58 ||
postFourthCaptureProgressState.campaignProgress?.totalKnown !== 59 ||
postFourthCaptureProgressState.campaignProgress?.latestBattleTitle !== '칠종칠금 4차전' ||
postFourthCaptureProgressState.campaignProgress?.nextBattleTitle !== '칠종칠금 5차전'
) {
@@ -7262,7 +7262,7 @@ try {
if (
postFifthCaptureProgressState?.activeTab !== 'progress' ||
postFifthCaptureProgressState.campaignProgress?.completedKnown !== 52 ||
postFifthCaptureProgressState.campaignProgress?.totalKnown !== 58 ||
postFifthCaptureProgressState.campaignProgress?.totalKnown !== 59 ||
postFifthCaptureProgressState.campaignProgress?.latestBattleTitle !== '칠종칠금 5차전' ||
postFifthCaptureProgressState.campaignProgress?.nextBattleTitle !== '칠종칠금 6차전'
) {
@@ -7427,7 +7427,7 @@ try {
if (
postSixthCaptureProgressState?.activeTab !== 'progress' ||
postSixthCaptureProgressState.campaignProgress?.completedKnown !== 53 ||
postSixthCaptureProgressState.campaignProgress?.totalKnown !== 58 ||
postSixthCaptureProgressState.campaignProgress?.totalKnown !== 59 ||
postSixthCaptureProgressState.campaignProgress?.latestBattleTitle !== '칠종칠금 6차전' ||
postSixthCaptureProgressState.campaignProgress?.nextBattleTitle !== '칠종칠금 7차전'
) {
@@ -7593,7 +7593,7 @@ try {
if (
postFinalCaptureProgressState?.activeTab !== 'progress' ||
postFinalCaptureProgressState.campaignProgress?.completedKnown !== 54 ||
postFinalCaptureProgressState.campaignProgress?.totalKnown !== 58 ||
postFinalCaptureProgressState.campaignProgress?.totalKnown !== 59 ||
postFinalCaptureProgressState.campaignProgress?.activeChapter?.id !== 'northern-campaign' ||
postFinalCaptureProgressState.campaignProgress?.latestBattleTitle !== '칠종칠금 7차전' ||
!String(postFinalCaptureProgressState.campaignProgress?.nextBattleTitle ?? '').includes('북벌 준비')
@@ -7666,7 +7666,7 @@ try {
if (
postNorthernPrepProgressState?.activeTab !== 'progress' ||
postNorthernPrepProgressState.campaignProgress?.completedKnown !== 54 ||
postNorthernPrepProgressState.campaignProgress?.totalKnown !== 58 ||
postNorthernPrepProgressState.campaignProgress?.totalKnown !== 59 ||
postNorthernPrepProgressState.campaignProgress?.activeChapter?.id !== 'northern-campaign' ||
postNorthernPrepProgressState.campaignProgress?.latestBattleTitle !== '칠종칠금 7차전' ||
postNorthernPrepProgressState.campaignProgress?.nextBattleTitle !== '제1차 북벌 출진로'
@@ -7816,7 +7816,7 @@ try {
if (
postFiftyFifthProgressState?.activeTab !== 'progress' ||
postFiftyFifthProgressState.campaignProgress?.completedKnown !== 55 ||
postFiftyFifthProgressState.campaignProgress?.totalKnown !== 58 ||
postFiftyFifthProgressState.campaignProgress?.totalKnown !== 59 ||
postFiftyFifthProgressState.campaignProgress?.activeChapter?.id !== 'northern-campaign' ||
postFiftyFifthProgressState.campaignProgress?.latestBattleTitle !== '제1차 북벌 출진로' ||
postFiftyFifthProgressState.campaignProgress?.nextBattleTitle !== '천수 진군로'
@@ -7966,7 +7966,7 @@ try {
if (
postFiftySixthProgressState?.activeTab !== 'progress' ||
postFiftySixthProgressState.campaignProgress?.completedKnown !== 56 ||
postFiftySixthProgressState.campaignProgress?.totalKnown !== 58 ||
postFiftySixthProgressState.campaignProgress?.totalKnown !== 59 ||
postFiftySixthProgressState.campaignProgress?.activeChapter?.id !== 'northern-campaign' ||
postFiftySixthProgressState.campaignProgress?.latestBattleTitle !== '천수 진군로' ||
postFiftySixthProgressState.campaignProgress?.nextBattleTitle !== '가정 배치 위기'
@@ -8121,7 +8121,7 @@ try {
if (
postFiftySeventhProgressState?.activeTab !== 'progress' ||
postFiftySeventhProgressState.campaignProgress?.completedKnown !== 57 ||
postFiftySeventhProgressState.campaignProgress?.totalKnown !== 58 ||
postFiftySeventhProgressState.campaignProgress?.totalKnown !== 59 ||
postFiftySeventhProgressState.campaignProgress?.activeChapter?.id !== 'northern-campaign' ||
postFiftySeventhProgressState.campaignProgress?.latestBattleTitle !== '가정 배치 위기' ||
postFiftySeventhProgressState.campaignProgress?.nextBattleTitle !== '기산 후퇴로'
@@ -8272,15 +8272,166 @@ try {
if (
postFiftyEighthProgressState?.activeTab !== 'progress' ||
postFiftyEighthProgressState.campaignProgress?.completedKnown !== 58 ||
postFiftyEighthProgressState.campaignProgress?.totalKnown !== 58 ||
postFiftyEighthProgressState.campaignProgress?.totalKnown !== 59 ||
postFiftyEighthProgressState.campaignProgress?.activeChapter?.id !== 'northern-campaign' ||
postFiftyEighthProgressState.campaignProgress?.latestBattleTitle !== '기산 후퇴로' ||
postFiftyEighthProgressState.campaignProgress?.nextBattleTitle !== '준비 중'
postFiftyEighthProgressState.campaignProgress?.nextBattleTitle !== '진창 공성전'
) {
throw new Error(`Expected post-fifty-eighth progress tab to complete the Qishan retreat and leave the next northern step pending: ${JSON.stringify(postFiftyEighthProgressState?.campaignProgress)}`);
throw new Error(`Expected post-fifty-eighth progress tab to complete the Qishan retreat and point toward Chencang: ${JSON.stringify(postFiftyEighthProgressState?.campaignProgress)}`);
}
await page.screenshot({ path: 'dist/verification-post-fifty-eighth-progress.png', fullPage: true });
await page.mouse.click(1120, 38);
await page.waitForTimeout(180);
const chencangSortieState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
if (
!chencangSortieState?.sortieVisible ||
chencangSortieState.campaign?.step !== 'fifty-eighth-camp' ||
chencangSortieState.campTitle !== '기산 후퇴로 후 군영' ||
!String(chencangSortieState.sortiePlan?.objectiveLine ?? '').includes('진창 공성전') ||
!String(chencangSortieState.sortiePlan?.objectiveLine ?? '').includes('학소') ||
chencangSortieState.sortiePlan?.maxCount !== 7 ||
chencangSortieState.sortiePlan?.recommendedTotal !== 7 ||
!chencangSortieState.sortieRoster?.some((unit) => unit.id === 'zhuge-liang' && unit.selected && unit.required) ||
!chencangSortieState.sortieRoster?.some((unit) => unit.id === 'jiang-wei' && unit.recommended) ||
!chencangSortieState.sortieRoster?.some((unit) => unit.id === 'wang-ping' && unit.recommended) ||
!chencangSortieState.sortieRoster?.some((unit) => unit.id === 'ma-dai' && unit.recommended) ||
!chencangSortieState.sortieRoster?.some((unit) => unit.id === 'wei-yan' && unit.recommended) ||
!chencangSortieState.sortieRoster?.some((unit) => unit.id === 'huang-quan' && unit.recommended) ||
!chencangSortieState.sortieRoster?.some((unit) => unit.id === 'fa-zheng' && unit.recommended) ||
chencangSortieState.sortieRoster?.some((unit) => unit.id === 'liu-bei')
) {
throw new Error(`Expected Chencang sortie to require Zhuge Liang, exclude Liu Bei, and recommend Jiang Wei, Wei Yan, terrain, cavalry, and logistics roles: ${JSON.stringify(chencangSortieState)}`);
}
assertSortieTacticalRoster(chencangSortieState, [
'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', 'huang-quan', 'ma-chao', 'ma-dai', 'wang-ping', 'jiang-wei'
]);
const chencangPriorityUnits = ['jiang-wei', 'wang-ping', 'ma-dai', 'wei-yan', 'huang-quan', 'fa-zheng'];
for (const unitId of chencangPriorityUnits) {
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.required && !chencangPriorityUnits.includes(unit.id)
);
if (removable) {
await clickSortieRosterUnit(page, removable.id);
}
await clickSortieRosterUnit(page, unitId);
}
}
const chencangSortieReadyState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
if (
!chencangPriorityUnits.every((unitId) =>
chencangSortieReadyState.sortieRoster?.some((unit) => unit.id === unitId && unit.selected)
) ||
!chencangSortieReadyState.sortieRoster?.some((unit) => unit.id === 'zhuge-liang' && unit.selected && unit.required) ||
chencangSortieReadyState.sortieRoster?.some((unit) => unit.id === 'liu-bei') ||
chencangSortieReadyState.sortiePlan?.selectedCount !== 7 ||
chencangSortieReadyState.sortiePlan?.recommendedSelectedCount < 7
) {
throw new Error(`Expected Chencang sortie to deploy Zhuge Liang, Jiang Wei, Wang Ping, Ma Dai, Wei Yan, Huang Quan, and Fa Zheng: ${JSON.stringify(chencangSortieReadyState)}`);
}
await page.screenshot({ path: 'dist/verification-fifty-ninth-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-fifty-ninth-story.png', fullPage: true });
for (let i = 0; i < 50; i += 1) {
const enteredFiftyNinthBattle = await page.evaluate(() => {
const state = window.__HEROS_DEBUG__?.battle();
return state?.scene === 'BattleScene' && state?.battleId === 'fifty-ninth-battle-chencang-siege';
});
if (enteredFiftyNinthBattle) {
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 === 'fifty-ninth-battle-chencang-siege' && state?.battleOutcome === null && state?.phase === 'idle';
});
await page.screenshot({ path: 'dist/verification-fifty-ninth-battle.png', fullPage: true });
const fiftyNinthBattleState = await page.evaluate(() => window.__HEROS_DEBUG__?.battle());
const fiftyNinthEnemies = fiftyNinthBattleState.units.filter((unit) => unit.faction === 'enemy');
const fiftyNinthAllies = fiftyNinthBattleState.units.filter((unit) => unit.faction === 'ally');
const fiftyNinthEnemyBehaviors = new Set(fiftyNinthEnemies.map((unit) => unit.ai));
if (
fiftyNinthBattleState.camera?.mapWidth !== 118 ||
fiftyNinthBattleState.camera?.mapHeight !== 100 ||
fiftyNinthBattleState.victoryConditionLabel !== '학소 진창 수비 압박과 왕쌍 추격 차단' ||
!fiftyNinthBattleState.objectives?.some((objective) => objective.id === 'pressure-hao-zhao' && objective.label === '학소 진창 수비 압박') ||
!fiftyNinthBattleState.objectives?.some((objective) => objective.id === 'halt-wang-shuang' && objective.label === '왕쌍 추격 차단') ||
!fiftyNinthBattleState.objectives?.some((objective) => objective.id === 'chencang-gate' && objective.label === '진창 성문 압박') ||
!fiftyNinthBattleState.objectives?.some((objective) => objective.id === 'siege-camps' && objective.label === '공성 진영 유지') ||
fiftyNinthEnemies.length < 42 ||
!fiftyNinthEnemyBehaviors.has('aggressive') ||
!fiftyNinthEnemyBehaviors.has('guard') ||
!fiftyNinthEnemyBehaviors.has('hold') ||
!fiftyNinthEnemies.some((unit) => unit.id === 'northern-fifth-leader-hao-zhao') ||
!fiftyNinthEnemies.some((unit) => unit.id === 'northern-fifth-officer-wang-shuang') ||
!fiftyNinthAllies.some((unit) => unit.id === 'zhuge-liang') ||
!fiftyNinthAllies.some((unit) => unit.id === 'jiang-wei') ||
!fiftyNinthAllies.some((unit) => unit.id === 'wang-ping') ||
!fiftyNinthAllies.some((unit) => unit.id === 'ma-dai') ||
!fiftyNinthAllies.some((unit) => unit.id === 'wei-yan') ||
!fiftyNinthAllies.some((unit) => unit.id === 'huang-quan') ||
!fiftyNinthAllies.some((unit) => unit.id === 'fa-zheng') ||
fiftyNinthAllies.some((unit) => unit.id === 'liu-bei')
) {
throw new Error(`Expected fifty-ninth battle to use the Chencang siege map, Hao Zhao/Wang Shuang objectives, selected Jiang Wei sortie, and mixed Wei AI: ${JSON.stringify(fiftyNinthBattleState)}`);
}
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 fiftyNinthCampState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
if (
fiftyNinthCampState?.campBattleId !== 'fifty-ninth-battle-chencang-siege' ||
fiftyNinthCampState.campaign?.step !== 'fifty-ninth-camp' ||
fiftyNinthCampState.campTitle !== '진창 공성전 후 군영' ||
fiftyNinthCampState.availableDialogueIds?.length !== 3 ||
!fiftyNinthCampState.availableDialogueIds.every((id) => id.startsWith('northern-fifth-')) ||
fiftyNinthCampState.availableVisitIds?.length !== 1 ||
!fiftyNinthCampState.availableVisitIds.every((id) => id.startsWith('northern-fifth-')) ||
fiftyNinthCampState.rosterCollection?.total < 22 ||
!fiftyNinthCampState.report?.bonds?.some((bond) => bond.id === 'jiang-wei__fa-zheng_northern-fifth')
) {
throw new Error(`Expected Chencang aftermath camp to expose fifth northern campaign events and bonds: ${JSON.stringify(fiftyNinthCampState)}`);
}
await page.screenshot({ path: 'dist/verification-fifty-ninth-camp.png', fullPage: true });
await page.mouse.click(966, 38);
await page.waitForTimeout(180);
const postFiftyNinthProgressState = await page.evaluate(() => window.__HEROS_DEBUG__?.camp());
if (
postFiftyNinthProgressState?.activeTab !== 'progress' ||
postFiftyNinthProgressState.campaignProgress?.completedKnown !== 59 ||
postFiftyNinthProgressState.campaignProgress?.totalKnown !== 59 ||
postFiftyNinthProgressState.campaignProgress?.activeChapter?.id !== 'northern-campaign' ||
postFiftyNinthProgressState.campaignProgress?.latestBattleTitle !== '진창 공성전' ||
postFiftyNinthProgressState.campaignProgress?.nextBattleTitle !== '준비 중'
) {
throw new Error(`Expected post-fifty-ninth progress tab to complete Chencang and leave the next northern step pending: ${JSON.stringify(postFiftyNinthProgressState?.campaignProgress)}`);
}
await page.screenshot({ path: 'dist/verification-post-fifty-ninth-progress.png', fullPage: true });
await page.evaluate(() => {
const game = window.__HEROS_GAME__;
game?.scene.stop('CampScene');
@@ -8309,12 +8460,12 @@ try {
}
}
for (let attempt = 0; attempt < 24; attempt += 1) {
const continuedToQishanCamp = await page.evaluate(() => {
const continuedToChencangCamp = await page.evaluate(() => {
const activeScenes = window.__HEROS_DEBUG__?.activeScenes() ?? [];
const camp = window.__HEROS_DEBUG__?.camp?.() ?? null;
return activeScenes.includes('CampScene') && camp?.campaign?.step === 'fifty-eighth-camp';
return activeScenes.includes('CampScene') && camp?.campaign?.step === 'fifty-ninth-camp';
});
if (continuedToQishanCamp) {
if (continuedToChencangCamp) {
break;
}
await page.keyboard.press('Space');
@@ -8323,17 +8474,17 @@ try {
await page.waitForFunction(() => {
const activeScenes = window.__HEROS_DEBUG__?.activeScenes() ?? [];
const camp = window.__HEROS_DEBUG__?.camp?.() ?? null;
return activeScenes.includes('CampScene') && camp?.campaign?.step === 'fifty-eighth-camp';
return activeScenes.includes('CampScene') && camp?.campaign?.step === 'fifty-ninth-camp';
});
const titleContinueState = await page.evaluate(() => ({
activeScenes: window.__HEROS_DEBUG__?.activeScenes() ?? [],
camp: window.__HEROS_DEBUG__?.camp?.() ?? null
}));
if (!titleContinueState.activeScenes.includes('CampScene') || titleContinueState.camp?.campaign?.step !== 'fifty-eighth-camp') {
throw new Error(`Expected title continue to reopen the Qishan retreat aftermath camp: ${JSON.stringify(titleContinueState)}`);
if (!titleContinueState.activeScenes.includes('CampScene') || titleContinueState.camp?.campaign?.step !== 'fifty-ninth-camp') {
throw new Error(`Expected title continue to reopen the Chencang aftermath camp: ${JSON.stringify(titleContinueState)}`);
}
console.log(`Verified title-to-Qishan-retreat 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, Ma Chao, Ma Dai, Wang Ping joins, Luofeng, Luo main gate, Mianzhu, Chengdu surrender, Jiameng, Yangping, Dingjun, Hanzhong decisive battle, King of Hanzhong council, Shu-Han foundation state, Jing Province defense vanguard, Fan Castle vanguard, Han River flood, Fan siege, Jing rear crisis, Gongan collapse, Maicheng isolation, Yiling vanguard, Yiling fire attack, Baidi entrustment, Nanzhong stabilization, Meng Huo pacification, second capture, third capture, fourth capture, fifth capture, sixth capture, final capture, northern campaign preparation, Qishan road first northern expedition, Tianshui advance, Jieting crisis, Jiang Wei joining, Qishan retreat, and pending next northern step state at ${targetUrl}`);
console.log(`Verified title-to-Chencang 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, Ma Chao, Ma Dai, Wang Ping joins, Luofeng, Luo main gate, Mianzhu, Chengdu surrender, Jiameng, Yangping, Dingjun, Hanzhong decisive battle, King of Hanzhong council, Shu-Han foundation state, Jing Province defense vanguard, Fan Castle vanguard, Han River flood, Fan siege, Jing rear crisis, Gongan collapse, Maicheng isolation, Yiling vanguard, Yiling fire attack, Baidi entrustment, Nanzhong stabilization, Meng Huo pacification, second capture, third capture, fourth capture, fifth capture, sixth capture, final capture, northern campaign preparation, Qishan road first northern expedition, Tianshui advance, Jieting crisis, Jiang Wei joining, Qishan retreat, Chencang siege, and pending next northern step state at ${targetUrl}`);
} finally {
await browser?.close();
if (serverProcess && !serverProcess.killed) {