import type { CampaignStep } from '../state/campaignState'; import { defaultBattleScenario, eighthBattleScenario, eighteenthBattleScenario, eleventhBattleScenario, fiftiethBattleScenario, fiftyEighthBattleScenario, fiftyFirstBattleScenario, fiftySecondBattleScenario, fiftyThirdBattleScenario, fiftyFourthBattleScenario, fiftyFifthBattleScenario, fiftySixthBattleScenario, fiftyNinthBattleScenario, fiftySeventhBattleScenario, sixtiethBattleScenario, sixtyFirstBattleScenario, sixtySecondBattleScenario, sixtyThirdBattleScenario, sixtyFourthBattleScenario, sixtyFifthBattleScenario, sixtySixthBattleScenario, fortiethBattleScenario, fortyFirstBattleScenario, fortySecondBattleScenario, fortyThirdBattleScenario, fortyFourthBattleScenario, fortyFifthBattleScenario, fortyEighthBattleScenario, fortyNinthBattleScenario, fortySixthBattleScenario, fortySeventhBattleScenario, fifthBattleScenario, fifteenthBattleScenario, fourteenthBattleScenario, fourthBattleScenario, ninthBattleScenario, nineteenthBattleScenario, secondBattleScenario, seventhBattleScenario, sixthBattleScenario, sixteenthBattleScenario, seventeenthBattleScenario, tenthBattleScenario, thirteenthBattleScenario, thirtyFifthBattleScenario, thirtyFourthBattleScenario, thirtyEighthBattleScenario, thirtyFirstBattleScenario, thirtyNinthBattleScenario, thirtySecondBattleScenario, thirtyThirdBattleScenario, thirtySixthBattleScenario, thirtySeventhBattleScenario, thirtiethBattleScenario, twentyEighthBattleScenario, twentyNinthBattleScenario, twentyFirstBattleScenario, twentySecondBattleScenario, twentyThirdBattleScenario, twentyFifthBattleScenario, twentyFourthBattleScenario, twentySixthBattleScenario, twentySeventhBattleScenario, twentiethBattleScenario, twelfthBattleScenario, thirdBattleScenario, type BattleScenarioId } from './battles'; import { baidiEntrustmentPages, eighthBattleIntroPages, eighthBattleVictoryPages, eighteenthBattleIntroPages, eighteenthBattleVictoryPages, eleventhBattleIntroPages, eleventhBattleVictoryPages, endingEpiloguePages, fiftiethBattleIntroPages, fiftiethBattleVictoryPages, fiftyEighthBattleIntroPages, fiftyEighthBattleVictoryPages, fiftyNinthBattleIntroPages, fiftyNinthBattleVictoryPages, sixtiethBattleIntroPages, sixtiethBattleVictoryPages, sixtyFirstBattleIntroPages, sixtyFirstBattleVictoryPages, sixtySecondBattleIntroPages, sixtySecondBattleVictoryPages, sixtyThirdBattleIntroPages, sixtyThirdBattleVictoryPages, sixtyFourthBattleIntroPages, sixtyFourthBattleVictoryPages, sixtyFifthBattleIntroPages, sixtyFifthBattleVictoryPages, sixtySixthBattleIntroPages, sixtySixthBattleVictoryPages, fiftyFirstBattleIntroPages, fiftyFirstBattleVictoryPages, fiftySecondBattleIntroPages, fiftySecondBattleVictoryPages, fiftyThirdBattleIntroPages, fiftyThirdBattleVictoryPages, fiftyFourthBattleIntroPages, fiftyFourthBattleVictoryPages, fiftyFifthBattleIntroPages, fiftyFifthBattleVictoryPages, fiftySixthBattleIntroPages, fiftySixthBattleVictoryPages, fiftySeventhBattleIntroPages, fiftySeventhBattleVictoryPages, fortiethBattleIntroPages, fortiethBattleVictoryPages, fortyFirstBattleIntroPages, fortyFirstBattleVictoryPages, fortySecondBattleIntroPages, fortySecondBattleVictoryPages, fortyThirdBattleIntroPages, fortyThirdBattleVictoryPages, fortyFourthBattleIntroPages, fortyFourthBattleVictoryPages, fortyFifthBattleIntroPages, fortyFifthBattleVictoryPages, fortyEighthBattleIntroPages, fortyEighthBattleVictoryPages, fortyNinthBattleIntroPages, fortyNinthBattleVictoryPages, fortySixthBattleIntroPages, fortySeventhBattleIntroPages, fortySeventhBattleVictoryPages, fifthBattleIntroPages, fifthBattleVictoryPages, fifteenthBattleIntroPages, fifteenthBattleVictoryPages, fourteenthBattleIntroPages, fourteenthBattleVictoryPages, fourthBattleIntroPages, fourthBattleVictoryPages, hanzhongKingCouncilPages, ninthBattleIntroPages, ninthBattleVictoryPages, nineteenthBattleIntroPages, nineteenthBattleVictoryPages, northernCampaignPrepPages, secondBattleIntroPages, secondBattleVictoryPages, seventhBattleIntroPages, seventhBattleVictoryPages, sixthBattleIntroPages, sixthBattleVictoryPages, sixteenthBattleIntroPages, sixteenthBattleVictoryPages, seventeenthBattleIntroPages, seventeenthBattleVictoryPages, shuHanFoundationPages, tenthBattleIntroPages, tenthBattleVictoryPages, thirteenthBattleIntroPages, thirteenthBattleVictoryPages, thirtyFifthBattleIntroPages, thirtyFifthBattleVictoryPages, thirtyFourthBattleIntroPages, thirtyFourthBattleVictoryPages, thirtyEighthBattleIntroPages, thirtyEighthBattleVictoryPages, thirtyFirstBattleIntroPages, thirtyFirstBattleVictoryPages, thirtyNinthBattleIntroPages, thirtyNinthBattleVictoryPages, thirtySecondBattleIntroPages, thirtySecondBattleVictoryPages, thirtyThirdBattleIntroPages, thirtyThirdBattleVictoryPages, thirtySixthBattleIntroPages, thirtySixthBattleVictoryPages, thirtySeventhBattleIntroPages, thirtiethBattleIntroPages, thirtiethBattleVictoryPages, twentyEighthBattleIntroPages, twentyEighthBattleVictoryPages, twentyNinthBattleIntroPages, twentyNinthBattleVictoryPages, twentyFirstBattleIntroPages, twentyFirstBattleVictoryPages, twentySecondBattleIntroPages, twentySecondBattleVictoryPages, twentyThirdBattleIntroPages, twentyThirdBattleVictoryPages, twentyFifthBattleIntroPages, twentyFifthBattleVictoryPages, twentyFourthBattleIntroPages, twentyFourthBattleVictoryPages, twentySixthBattleIntroPages, twentySixthBattleVictoryPages, twentySeventhBattleIntroPages, twentySeventhBattleVictoryPages, twentiethBattleIntroPages, twentiethBattleVictoryPages, twelfthBattleIntroPages, twelfthBattleVictoryPages, thirdBattleIntroPages, thirdBattleVictoryPages, type StoryPage } from './scenario'; export type SortieFlow = { afterBattleId: string; eyebrow: string; title: string; description: string; rewardHint: string; nextBattleId?: BattleScenarioId; campaignStep?: CampaignStep; pages: StoryPage[]; unavailableNotice?: string; }; const sortieFlows: Record = { [defaultBattleScenario.id]: { afterBattleId: defaultBattleScenario.id, eyebrow: '다음 전장', title: secondBattleScenario.title, description: '탁현 방어 직후 달아난 황건 잔당이 북쪽 나루와 마을을 붙잡고 있습니다. 첫 승리 보상으로 정비를 마친 뒤, 세 형제가 다시 전열을 나누어 추격합니다.', rewardHint: '지난 보상: 콩, 탁주, 연습검 · 다음 보상: 소모품, 황건 부적, 의용군 명성', nextBattleId: secondBattleScenario.id, campaignStep: 'second-battle', pages: secondBattleIntroPages }, [secondBattleScenario.id]: { afterBattleId: secondBattleScenario.id, eyebrow: '다음 전장', title: thirdBattleScenario.title, description: '북쪽 마을을 구했지만 황건 전령이 광종 본영으로 향하고 있습니다. 나루 추격전에서 얻은 보급과 부적을 점검하고, 강가 요새로 이어지는 길을 끊어야 합니다.', rewardHint: '지난 보상: 콩, 상처약, 탁주, 황건 부적 · 다음 보상: 단궁, 의용군 명성', nextBattleId: thirdBattleScenario.id, campaignStep: 'third-battle', pages: [...secondBattleVictoryPages, ...thirdBattleIntroPages] }, [thirdBattleScenario.id]: { afterBattleId: thirdBattleScenario.id, eyebrow: '다음 전장', title: fourthBattleScenario.title, description: '광종 구원로를 연 의용군은 이제 황건 본영을 향합니다. 장각을 격파해 황건적 토벌의 큰 고비를 넘겨야 합니다.', rewardHint: `예상 보상: ${fourthBattleScenario.title} 개방`, nextBattleId: fourthBattleScenario.id, campaignStep: 'fourth-battle', pages: [...thirdBattleVictoryPages, ...fourthBattleIntroPages] }, [fourthBattleScenario.id]: { afterBattleId: fourthBattleScenario.id, eyebrow: '다음 전장', title: fifthBattleScenario.title, description: '황건적 토벌로 이름을 알린 세 형제는 반동탁 연합의 흐름에 몸을 싣습니다. 공손찬의 진영으로 향하는 길목에서 사수관 전초 병력을 상대해야 합니다.', rewardHint: `예상 보상: ${fifthBattleScenario.title} 개방`, nextBattleId: fifthBattleScenario.id, campaignStep: 'fifth-battle', pages: [...fourthBattleVictoryPages, ...fifthBattleIntroPages] }, [fifthBattleScenario.id]: { afterBattleId: fifthBattleScenario.id, eyebrow: '다음 전장', title: sixthBattleScenario.title, description: '공손찬의 군영에 의탁한 세 형제는 북방 전선의 보급로를 지키는 임무를 맡습니다. 계교로 향하는 길목에서 원소군 별동대를 상대해야 합니다.', rewardHint: `예상 보상: ${sixthBattleScenario.title} 개방`, nextBattleId: sixthBattleScenario.id, campaignStep: 'sixth-battle', pages: [...fifthBattleVictoryPages, ...sixthBattleIntroPages] }, [sixthBattleScenario.id]: { afterBattleId: sixthBattleScenario.id, eyebrow: '다음 전장', title: seventhBattleScenario.title, description: '계교 원군로를 열어 공손찬의 신뢰를 얻은 유비군에게 서주의 도겸이 원군을 청합니다. 조조군 선봉을 밀어내고 서주 피난로를 열어야 합니다.', rewardHint: `예상 보상: ${seventhBattleScenario.title} 개방`, nextBattleId: seventhBattleScenario.id, campaignStep: 'seventh-battle', pages: [...sixthBattleVictoryPages, ...seventhBattleIntroPages] }, [seventhBattleScenario.id]: { afterBattleId: seventhBattleScenario.id, eyebrow: '다음 전장', title: eighthBattleScenario.title, description: '도겸에게 서주를 맡은 뒤 첫 과제는 소패 보급로를 지키는 일입니다. 간옹은 전황 판단을, 미축은 창고 보급을 맡아 새 방위선의 빈틈을 메워야 합니다.', rewardHint: `예상 보상: ${eighthBattleScenario.title} 개방`, nextBattleId: eighthBattleScenario.id, campaignStep: 'eighth-battle', pages: [...seventhBattleVictoryPages, ...eighthBattleIntroPages] }, [eighthBattleScenario.id]: { afterBattleId: eighthBattleScenario.id, eyebrow: '다음 전장', title: ninthBattleScenario.title, description: '소패 보급로를 지켰지만 서주 성문 안팎의 불안은 곧 터집니다. 8전에서 얻은 보급품과 미축의 보급 운용, 간옹의 책략 지원을 성문 방위 편성에 넣을지 판단해야 합니다.', rewardHint: `예상 보상: ${ninthBattleScenario.title} 개방`, nextBattleId: ninthBattleScenario.id, campaignStep: 'ninth-battle', pages: [...eighthBattleVictoryPages, ...ninthBattleIntroPages] }, [ninthBattleScenario.id]: { afterBattleId: ninthBattleScenario.id, eyebrow: '다음 전장', title: tenthBattleScenario.title, description: '성문은 지켰지만 내부 균열은 더 깊어집니다. 장비의 성급함과 여포의 야심이 맞물려 서주는 무너지고, 다음 전투는 성을 되찾기보다 포위망을 뚫는 흐름으로 이어집니다.', rewardHint: `예상 보상: ${tenthBattleScenario.title} 개방`, nextBattleId: tenthBattleScenario.id, campaignStep: 'tenth-battle', pages: [...ninthBattleVictoryPages, ...tenthBattleIntroPages] }, [tenthBattleScenario.id]: { afterBattleId: tenthBattleScenario.id, eyebrow: '다음 전장', title: eleventhBattleScenario.title, description: '서주는 잃었지만 병력과 피난민 일부를 보존했습니다. 조조는 유비군을 받아들이되 허도 입성로의 원술 잔군을 치게 하며, 의탁은 곧 군율과 힘을 재는 시험으로 바뀝니다.', rewardHint: `예상 보상: ${eleventhBattleScenario.title} 개방`, nextBattleId: eleventhBattleScenario.id, campaignStep: 'eleventh-battle', pages: [...tenthBattleVictoryPages, ...eleventhBattleIntroPages] }, [eleventhBattleScenario.id]: { afterBattleId: eleventhBattleScenario.id, eyebrow: '다음 전장', title: twelfthBattleScenario.title, description: '허도 입성로에서 군율과 보급 능력을 증명하자, 조조는 유비군을 곧장 하비 포위망에 투입합니다. 여포를 다시 마주하는 싸움에서 유비군은 조조의 명을 따르되, 서주 백성을 위한 뜻도 지켜야 합니다.', rewardHint: `예상 보상: ${twelfthBattleScenario.title} 개방`, nextBattleId: twelfthBattleScenario.id, campaignStep: 'twelfth-battle', pages: [...eleventhBattleVictoryPages, ...twelfthBattleIntroPages] }, [twelfthBattleScenario.id]: { afterBattleId: twelfthBattleScenario.id, eyebrow: '다음 전장', title: thirteenthBattleScenario.title, description: '하비 외곽의 둑길 보급 진영을 장악하면서 포위망이 성문과 수문까지 좁혀졌습니다. 이제 여포의 마지막 돌파를 꺾어야 하며, 조조 휘하에서 깊어지는 긴장도 함께 드러납니다.', rewardHint: `예상 보상: ${thirteenthBattleScenario.title} 개방`, nextBattleId: thirteenthBattleScenario.id, campaignStep: 'thirteenth-battle', pages: [...twelfthBattleVictoryPages, ...thirteenthBattleIntroPages] }, [thirteenthBattleScenario.id]: { afterBattleId: thirteenthBattleScenario.id, eyebrow: '다음 전장', title: fourteenthBattleScenario.title, description: '하비 성문과 수문 포위망이 닫히며 여포는 무너졌지만, 조조의 경계는 더 깊어졌습니다. 손건이 합류해 서주 길목의 문서와 민심을 준비하고, 유비군은 조조의 장막 밖으로 나갈 첫 전투를 맞습니다.', rewardHint: `예상 보상: ${fourteenthBattleScenario.title} 개방 / 손건 합류`, nextBattleId: fourteenthBattleScenario.id, campaignStep: 'fourteenth-battle', pages: [...thirteenthBattleVictoryPages, ...fourteenthBattleIntroPages] }, [fourteenthBattleScenario.id]: { afterBattleId: fourteenthBattleScenario.id, eyebrow: '다음 전장', title: fifteenthBattleScenario.title, description: '역참 문서와 서주 관문을 확보한 유비군은 조조의 장막을 벗어났습니다. 그러나 북상로에는 채양의 추격대가 깔려 있어, 손건의 통행 문서가 닿을 접선지까지 길을 열어야 합니다.', rewardHint: `예상 보상: ${fifteenthBattleScenario.title} 개방 / 원소 접선 명분`, nextBattleId: fifteenthBattleScenario.id, campaignStep: 'fifteenth-battle', pages: [...fourteenthBattleVictoryPages, ...fifteenthBattleIntroPages] }, [fifteenthBattleScenario.id]: { afterBattleId: fifteenthBattleScenario.id, eyebrow: '다음 전장', title: sixteenthBattleScenario.title, description: '원소 진영의 형세가 흔들리자 유비군은 다시 몸을 옮겨 형주로 향합니다. 조운이 재합류하며 기동력이 늘지만, 조조군 추격대가 형주 관문 앞을 막아섭니다.', rewardHint: `예상 보상: ${sixteenthBattleScenario.title} 개방 / 조운 합류`, nextBattleId: sixteenthBattleScenario.id, campaignStep: 'sixteenth-battle', pages: [...fifteenthBattleVictoryPages, ...sixteenthBattleIntroPages] }, [sixteenthBattleScenario.id]: { afterBattleId: sixteenthBattleScenario.id, eyebrow: '다음 전장', title: seventeenthBattleScenario.title, description: '유표에게 의탁한 유비군은 형주에서 숨을 돌리지만, 손님으로 머무는 것만으로 천하의 길을 열 수는 없습니다. 형주에서 모은 와룡의 단서를 따라 융중으로 향해야 합니다.', rewardHint: `예상 보상: ${seventeenthBattleScenario.title} 개방 / 제갈량 영입`, nextBattleId: seventeenthBattleScenario.id, campaignStep: 'seventeenth-battle', pages: [...sixteenthBattleVictoryPages, ...seventeenthBattleIntroPages] }, [seventeenthBattleScenario.id]: { afterBattleId: seventeenthBattleScenario.id, eyebrow: '다음 전장', title: eighteenthBattleScenario.title, description: '제갈량이 합류하며 유비군은 비로소 천하의 큰 판을 바라보게 됩니다. 조조군 선봉이 신야로 다가오자, 공명은 박망파의 숲길에서 첫 계책을 펼치려 합니다.', rewardHint: `예상 보상: ${eighteenthBattleScenario.title} 개방 / 제갈량 책략 실전`, nextBattleId: eighteenthBattleScenario.id, campaignStep: 'eighteenth-battle', pages: [...seventeenthBattleVictoryPages, ...eighteenthBattleIntroPages] }, [eighteenthBattleScenario.id]: { afterBattleId: eighteenthBattleScenario.id, eyebrow: '다음 전장', title: nineteenthBattleScenario.title, description: '박망파에서 조조군 선봉을 늦췄지만 대군의 남하는 계속됩니다. 신야의 백성을 데리고 장판파 피난로를 열어야 강동 사절로 이어질 시간을 벌 수 있습니다.', rewardHint: `예상 보상: ${nineteenthBattleScenario.title} 개방 / 장판파 피난로 확보`, nextBattleId: nineteenthBattleScenario.id, campaignStep: 'nineteenth-battle', pages: [...eighteenthBattleVictoryPages, ...nineteenthBattleIntroPages] }, [nineteenthBattleScenario.id]: { afterBattleId: nineteenthBattleScenario.id, eyebrow: '다음 전장', title: twentiethBattleScenario.title, description: '장판파에서 피난로를 열어 백성과 군을 다시 모았습니다. 이제 제갈량과 손건을 강나루까지 보내 강동 사절의 길을 열어야 합니다.', rewardHint: `예상 보상: ${twentiethBattleScenario.title} 개방 / 강동 사절 문서 확보`, nextBattleId: twentiethBattleScenario.id, campaignStep: 'twentieth-battle', pages: [...nineteenthBattleVictoryPages, ...twentiethBattleIntroPages] }, [twentiethBattleScenario.id]: { afterBattleId: twentiethBattleScenario.id, eyebrow: '다음 전장', title: twentyFirstBattleScenario.title, description: '강동으로 향하는 길이 열렸습니다. 제갈량과 손건이 손권과 주유를 설득한 뒤, 조조군 수군 선봉을 상대로 손유 동맹의 첫 전선을 세워야 합니다.', rewardHint: `예상 보상: ${twentyFirstBattleScenario.title} 개방 / 화공 논의 진전`, nextBattleId: twentyFirstBattleScenario.id, campaignStep: 'twenty-first-battle', pages: [...twentiethBattleVictoryPages, ...twentyFirstBattleIntroPages] }, [twentyFirstBattleScenario.id]: { afterBattleId: twentyFirstBattleScenario.id, eyebrow: '다음 전장', title: twentySecondBattleScenario.title, description: '조조군 수군 선봉을 밀어내며 손유 동맹의 첫 전선이 세워졌습니다. 이제 주유와 황개, 제갈량의 계책이 맞물려 본격적인 화공을 준비해야 합니다.', rewardHint: `예상 보상: ${twentySecondBattleScenario.title} 개방 / 적벽대전 결전`, nextBattleId: twentySecondBattleScenario.id, campaignStep: 'twenty-second-battle', pages: [...twentyFirstBattleVictoryPages, ...twentySecondBattleIntroPages] }, [twentySecondBattleScenario.id]: { afterBattleId: twentySecondBattleScenario.id, eyebrow: '다음 전장', title: twentyThirdBattleScenario.title, description: '적벽의 불길로 조조의 남하가 꺾였습니다. 유비군은 이제 형주 남부의 길목을 열고, 백성을 먼저 안정시키며 머물 땅을 마련해야 합니다.', rewardHint: `예상 보상: ${twentyThirdBattleScenario.title} 개방 / 마량 합류`, nextBattleId: twentyThirdBattleScenario.id, campaignStep: 'twenty-third-battle', pages: [...twentySecondBattleVictoryPages, ...twentyThirdBattleIntroPages] }, [twentyThirdBattleScenario.id]: { afterBattleId: twentyThirdBattleScenario.id, eyebrow: '다음 전장', title: twentyFourthBattleScenario.title, description: '형주 남부의 첫 길목을 열고 마량이 합류했습니다. 이제 마량의 현지 정보와 유비군의 군율을 앞세워 계양의 문을 열어야 합니다.', rewardHint: `예상 보상: ${twentyFourthBattleScenario.title} 개방 / 이적 합류`, nextBattleId: twentyFourthBattleScenario.id, campaignStep: 'twenty-fourth-battle', pages: [...twentyThirdBattleVictoryPages, ...twentyFourthBattleIntroPages] }, [twentyFourthBattleScenario.id]: { afterBattleId: twentyFourthBattleScenario.id, eyebrow: '다음 전장', title: twentyFifthBattleScenario.title, description: '계양이 열리고 이적이 합류했습니다. 이제 마량과 이적의 형주 지식을 앞세워 험한 무릉 산길과 흩어진 마을을 이어야 합니다.', rewardHint: `예상 보상: ${twentyFifthBattleScenario.title} 개방 / 공지 합류`, nextBattleId: twentyFifthBattleScenario.id, campaignStep: 'twenty-fifth-battle', pages: [...twentyFourthBattleVictoryPages, ...twentyFifthBattleIntroPages] }, [twentyFifthBattleScenario.id]: { afterBattleId: twentyFifthBattleScenario.id, eyebrow: '다음 전장', title: twentySixthBattleScenario.title, description: '무릉 산길이 열리고 공지가 합류했습니다. 이제 장사의 노장 황충과 의심 많은 한현을 마주하며 형주 남부 확보의 큰 고비를 넘어야 합니다.', rewardHint: `예상 보상: ${twentySixthBattleScenario.title} 개방 / 황충·위연 합류`, nextBattleId: twentySixthBattleScenario.id, campaignStep: 'twenty-sixth-battle', pages: [...twentyFifthBattleVictoryPages, ...twentySixthBattleIntroPages] }, [twentySixthBattleScenario.id]: { afterBattleId: twentySixthBattleScenario.id, eyebrow: '다음 전장', title: twentySeventhBattleScenario.title, description: '장사까지 열리며 형주 남부의 뿌리가 단단해졌습니다. 이제 유장의 원군 요청을 명분으로 익주 원군로를 열고, 봉추 방통의 마음까지 얻어야 합니다.', rewardHint: `예상 보상: ${twentySeventhBattleScenario.title} 개방 / 방통 합류`, nextBattleId: twentySeventhBattleScenario.id, campaignStep: 'twenty-seventh-battle', pages: [...twentySixthBattleVictoryPages, ...twentySeventhBattleIntroPages] }, [twentySeventhBattleScenario.id]: { afterBattleId: twentySeventhBattleScenario.id, eyebrow: '다음 전장', title: twentyEighthBattleScenario.title, description: '익주 원군로가 열리고 방통이 합류했습니다. 이제 와룡과 봉추를 함께 편성할지 고민하며, 촉의 깊은 산문인 부수관으로 들어가야 합니다.', rewardHint: `예상 보상: ${twentyEighthBattleScenario.title} 개방 / 법정 합류`, nextBattleId: twentyEighthBattleScenario.id, campaignStep: 'twenty-eighth-battle', pages: [...twentySeventhBattleVictoryPages, ...twentyEighthBattleIntroPages] }, [twentyEighthBattleScenario.id]: { afterBattleId: twentyEighthBattleScenario.id, eyebrow: '다음 전장', title: twentyNinthBattleScenario.title, description: '부수관이 열리고 법정이 합류했습니다. 이제 낙성 외곽으로 들어가 장임의 방어선과 오의의 흔들리는 마음을 동시에 상대해야 합니다.', rewardHint: `예상 보상: ${twentyNinthBattleScenario.title} 개방 / 오의 합류`, nextBattleId: twentyNinthBattleScenario.id, campaignStep: 'twenty-ninth-battle', pages: [...twentyEighthBattleVictoryPages, ...twentyNinthBattleIntroPages] }, [twentyNinthBattleScenario.id]: { afterBattleId: twentyNinthBattleScenario.id, eyebrow: '다음 전장', title: thirtiethBattleScenario.title, description: '낙성 외곽을 넘고 오의가 합류했습니다. 이제 낙봉파의 좁은 길을 통과해야 하며, 방통의 불길한 직감과 오의의 길 안내를 함께 살펴야 합니다.', rewardHint: `예상 보상: ${thirtiethBattleScenario.title} 개방 / 봉추 생환`, nextBattleId: thirtiethBattleScenario.id, campaignStep: 'thirtieth-battle', pages: [...twentyNinthBattleVictoryPages, ...thirtiethBattleIntroPages] }, [thirtiethBattleScenario.id]: { afterBattleId: thirtiethBattleScenario.id, eyebrow: '다음 전장', title: thirtyFirstBattleScenario.title, description: '낙봉파의 매복을 무너뜨리고 방통을 살려 냈습니다. 장임은 낙성 본성으로 물러났고, 익주의 성문과 장수들의 마음을 함께 열어야 할 차례입니다.', rewardHint: `예상 보상: ${thirtyFirstBattleScenario.title} 개방 / 엄안 합류`, nextBattleId: thirtyFirstBattleScenario.id, campaignStep: 'thirty-first-battle', pages: [...thirtiethBattleVictoryPages, ...thirtyFirstBattleIntroPages] }, [thirtyFirstBattleScenario.id]: { afterBattleId: thirtyFirstBattleScenario.id, eyebrow: '다음 전장', title: thirtySecondBattleScenario.title, description: '낙성 본성이 열리고 엄안이 합류했습니다. 이제 엄안의 첫 출전과 법정·오의의 길 안내를 엮어 성도 앞 면죽관을 압박해야 합니다.', rewardHint: `예상 보상: ${thirtySecondBattleScenario.title} 개방 / 이엄 합류`, nextBattleId: thirtySecondBattleScenario.id, campaignStep: 'thirty-second-battle', pages: [...thirtyFirstBattleVictoryPages, ...thirtySecondBattleIntroPages] }, [thirtySecondBattleScenario.id]: { afterBattleId: thirtySecondBattleScenario.id, eyebrow: '다음 전장', title: thirtyThirdBattleScenario.title, description: '면죽관이 열리고 이엄이 합류했습니다. 이제 이엄의 증언과 법정·제갈량의 권고문을 앞세워 성도 외곽의 마지막 방어선을 눌러야 합니다.', rewardHint: `예상 보상: ${thirtyThirdBattleScenario.title} 개방 / 황권 합류`, nextBattleId: thirtyThirdBattleScenario.id, campaignStep: 'thirty-third-battle', pages: [...thirtySecondBattleVictoryPages, ...thirtyThirdBattleIntroPages] }, [thirtyThirdBattleScenario.id]: { afterBattleId: thirtyThirdBattleScenario.id, eyebrow: '다음 전장', title: thirtyFourthBattleScenario.title, description: '성도가 항복하고 황권이 합류했습니다. 이제 익주의 북문인 가맹관에서 한중 방면을 살피고, 서량의 기병장 마초를 유비군의 깃발 아래로 끌어들일 차례입니다.', rewardHint: `예상 보상: ${thirtyFourthBattleScenario.title} 개방 / 마초 합류`, nextBattleId: thirtyFourthBattleScenario.id, campaignStep: 'thirty-fourth-battle', pages: [...thirtyThirdBattleVictoryPages, ...thirtyFourthBattleIntroPages] }, [thirtyFourthBattleScenario.id]: { afterBattleId: thirtyFourthBattleScenario.id, eyebrow: '다음 전장', title: thirtyFifthBattleScenario.title, description: '가맹관에서 마초가 합류했습니다. 이제 양평관으로 정찰대를 보내 한중 전선의 첫 지형과 보급 창고를 확인하고, 흩어진 서량 기병을 규합할 차례입니다.', rewardHint: `예상 보상: ${thirtyFifthBattleScenario.title} 개방 / 마대 합류`, nextBattleId: thirtyFifthBattleScenario.id, campaignStep: 'thirty-fifth-battle', pages: [...thirtyFourthBattleVictoryPages, ...thirtyFifthBattleIntroPages] }, [thirtyFifthBattleScenario.id]: { afterBattleId: thirtyFifthBattleScenario.id, eyebrow: '다음 전장', title: thirtySixthBattleScenario.title, description: '양평관 정찰로 한중의 길목과 장로군의 배치를 확인했습니다. 이제 정군산으로 올라 하후연의 선봉을 흔들고, 한중 산길을 아는 왕평을 유비군 쪽으로 끌어들일 차례입니다.', rewardHint: `예상 보상: ${thirtySixthBattleScenario.title} 개방 / 왕평 합류`, nextBattleId: thirtySixthBattleScenario.id, campaignStep: 'thirty-sixth-battle', pages: [...thirtyFifthBattleVictoryPages, ...thirtySixthBattleIntroPages] }, [thirtySixthBattleScenario.id]: { afterBattleId: thirtySixthBattleScenario.id, eyebrow: '다음 전장', title: thirtySeventhBattleScenario.title, description: '정군산 전초전으로 한중의 고지를 확보했고 왕평이 합류했습니다. 이제 한중 결전에서 조조군 본진을 밀어내고 촉의 북문을 완전히 안정시킬 차례입니다.', rewardHint: `예상 보상: ${thirtySeventhBattleScenario.title} 개방 / 한중왕 즉위 준비`, nextBattleId: thirtySeventhBattleScenario.id, campaignStep: 'thirty-seventh-battle', pages: [...thirtySixthBattleVictoryPages, ...thirtySeventhBattleIntroPages] }, [thirtySeventhBattleScenario.id]: { afterBattleId: thirtySeventhBattleScenario.id, eyebrow: '군영 의정', title: '한중왕 즉위 준비', description: '한중 결전에서 조조군을 물리치고 북문을 얻었습니다. 출진 준비를 통해 새 전투가 아니라 한중왕 즉위 논의를 진행하고, 촉한 건국의 명분을 군영 안에서 정리합니다.', rewardHint: '군영 목표: 한중왕 즉위 준비 / 촉한 건국 명분 정리', campaignStep: 'hanzhong-king-camp', pages: hanzhongKingCouncilPages, unavailableNotice: '한중왕 즉위 준비가 완료되었습니다. 다음 작업에서는 촉한 건국 선포와 형주 방면의 긴장을 이어 준비합니다.' }, 'hanzhong-king-camp': { afterBattleId: thirtySeventhBattleScenario.id, eyebrow: '건국 선포', title: '촉한 건국 선포', description: '한중왕 즉위 논의를 마쳤습니다. 이제 유비가 촉한의 이름을 세우고, 관우가 지키는 형주가 다음 긴장의 중심으로 떠오르는 정치 전환을 진행합니다.', rewardHint: '군영 목표: 촉한 건국 선포 / 형주 방위 긴장 개방', campaignStep: 'shu-han-foundation-camp', pages: shuHanFoundationPages, unavailableNotice: '촉한 건국 선포가 완료되었습니다. 다음 작업에서는 형주 방위와 관우 전선의 긴장을 전투 흐름으로 이어갑니다.' }, 'shu-han-foundation-camp': { afterBattleId: thirtySeventhBattleScenario.id, eyebrow: '다음 전장', title: thirtyEighthBattleScenario.title, description: '촉한의 이름이 세워졌습니다. 이제 관우가 지키는 형주에서 위와 오의 시선이 겹치며, 강변 봉화대와 나루를 먼저 안정시켜야 합니다.', rewardHint: `예상 보상: ${thirtyEighthBattleScenario.title} 개방 / 형주 봉화도`, nextBattleId: thirtyEighthBattleScenario.id, campaignStep: 'thirty-eighth-battle', pages: thirtyEighthBattleIntroPages }, [thirtyEighthBattleScenario.id]: { afterBattleId: thirtyEighthBattleScenario.id, eyebrow: '다음 전장', title: thirtyNinthBattleScenario.title, description: '형주 봉화대와 나루를 안정시켰지만 번성은 아직 닫혀 있습니다. 다음 출진에서는 관우를 축으로 번성 외곽의 보루와 수로를 눌러, 한수 수공과 성문 공략의 발판을 마련합니다.', rewardHint: `예상 보상: ${thirtyNinthBattleScenario.title} 개방 / 번성 외곽도`, nextBattleId: thirtyNinthBattleScenario.id, campaignStep: 'thirty-ninth-battle', pages: [...thirtyEighthBattleVictoryPages, ...thirtyNinthBattleIntroPages] }, [thirtyNinthBattleScenario.id]: { afterBattleId: thirtyNinthBattleScenario.id, eyebrow: '다음 전장', title: fortiethBattleScenario.title, description: '번성 외곽의 보루를 눌렀지만 조인과 우금의 본대는 아직 성 안과 수로를 지키고 있습니다. 다음 출진에서는 한수의 물길을 장악해 칠군을 흔들고 번성 포위의 결정적 발판을 마련합니다.', rewardHint: `예상 보상: ${fortiethBattleScenario.title} 개방 / 칠군 항복문`, nextBattleId: fortiethBattleScenario.id, campaignStep: 'fortieth-battle', pages: [...thirtyNinthBattleVictoryPages, ...fortiethBattleIntroPages] }, [fortiethBattleScenario.id]: { afterBattleId: fortiethBattleScenario.id, eyebrow: '다음 전장', title: fortyFirstBattleScenario.title, description: '한수의 물길이 조조군을 무너뜨렸지만 번성의 성문은 아직 열리지 않았습니다. 다음 출진에서는 조인의 성문 방어선과 방덕의 결사대를 눌러 포위전을 실제 공성전으로 밀어붙입니다.', rewardHint: `예상 보상: ${fortyFirstBattleScenario.title} 개방 / 번성 성문도`, nextBattleId: fortyFirstBattleScenario.id, campaignStep: 'forty-first-battle', pages: [...fortiethBattleVictoryPages, ...fortyFirstBattleIntroPages] }, [fortyFirstBattleScenario.id]: { afterBattleId: fortyFirstBattleScenario.id, eyebrow: '다음 전장', title: fortySecondBattleScenario.title, description: '번성의 외성 방어선은 흔들렸지만 강동의 그림자가 더 가까워졌습니다. 다음 출진에서는 강릉 동쪽 나루와 창고를 노리는 정찰대를 몰아내며 형주 후방의 첫 균열을 확인합니다.', rewardHint: `예상 보상: ${fortySecondBattleScenario.title} 개방 / 강릉 창고 장부`, nextBattleId: fortySecondBattleScenario.id, campaignStep: 'forty-second-battle', pages: [...fortyFirstBattleVictoryPages, ...fortySecondBattleIntroPages] }, [fortySecondBattleScenario.id]: { afterBattleId: fortySecondBattleScenario.id, eyebrow: '다음 전장', title: fortyThirdBattleScenario.title, description: '강릉 나루는 지켰지만 공안 성문과 창고 장부의 균열은 더 커졌습니다. 다음 출진에서는 여몽의 본대와 흔들리는 공안 수비대를 동시에 상대하며 형주 후방 붕괴를 늦춰야 합니다.', rewardHint: `예상 보상: ${fortyThirdBattleScenario.title} 개방 / 공안 성문 기록`, nextBattleId: fortyThirdBattleScenario.id, campaignStep: 'forty-third-battle', pages: [...fortySecondBattleVictoryPages, ...fortyThirdBattleIntroPages] }, [fortyThirdBattleScenario.id]: { afterBattleId: fortyThirdBattleScenario.id, eyebrow: '다음 전장', title: fortyFourthBattleScenario.title, description: '공안 성문은 잠시 붙들었지만 미방과 부사인의 흔들림은 완전히 멈추지 않았습니다. 다음 출진에서는 맥성으로 향하는 좁은 퇴로를 열어 관우 전선의 고립을 늦춰야 합니다.', rewardHint: `예상 보상: ${fortyFourthBattleScenario.title} 개방 / 맥성 북문 지도`, nextBattleId: fortyFourthBattleScenario.id, campaignStep: 'forty-fourth-battle', pages: [...fortyThirdBattleVictoryPages, ...fortyFourthBattleIntroPages] }, [fortyFourthBattleScenario.id]: { afterBattleId: fortyFourthBattleScenario.id, eyebrow: '다음 전장', title: fortyFifthBattleScenario.title, description: '맥성의 포위망을 한 차례 뚫었지만 형주의 후방은 이미 크게 갈라졌습니다. 유비의 분노는 이릉으로 향하고, 먼저 강변과 숲길의 동진로를 열어 긴 복수전의 첫 진영을 세워야 합니다.', rewardHint: `예상 보상: ${fortyFifthBattleScenario.title} 개방 / 이릉 동진 지도`, nextBattleId: fortyFifthBattleScenario.id, campaignStep: 'forty-fifth-battle', pages: [...fortyFourthBattleVictoryPages, ...fortyFifthBattleIntroPages] }, [fortyFifthBattleScenario.id]: { afterBattleId: fortyFifthBattleScenario.id, eyebrow: '다음 전장', title: fortySixthBattleScenario.title, description: '이릉으로 향하는 첫 진영은 세웠지만 오군은 아직 본격적으로 맞붙지 않았습니다. 길게 늘어진 촉한 군막과 마른 숲길이 육손의 기다림 속에서 화공의 위기로 바뀝니다.', rewardHint: `예상 보상: ${fortySixthBattleScenario.title} 개방 / 화공 방화선 표식`, nextBattleId: fortySixthBattleScenario.id, campaignStep: 'forty-sixth-battle', pages: [...fortyFifthBattleVictoryPages, ...fortySixthBattleIntroPages] }, [fortySixthBattleScenario.id]: { afterBattleId: fortySixthBattleScenario.id, eyebrow: '군영 의정', title: '백제성 유탁', description: '이릉의 불길을 뚫고 퇴로는 열었지만 복수전은 꺾였습니다. 출진 준비를 통해 새 전투가 아니라 백제성으로 물러난 유비의 마지막 부탁과 제갈량 중심 체제 전환을 진행합니다.', rewardHint: '군영 목표: 백제성 유탁 / 제갈량 섭정 준비', campaignStep: 'baidi-entrustment-camp', pages: baidiEntrustmentPages, unavailableNotice: '백제성 유탁이 완료되었습니다. 다음 작업에서는 남중 안정과 촉한 재정비 흐름을 이어 준비합니다.' }, 'baidi-entrustment-camp': { afterBattleId: fortySixthBattleScenario.id, eyebrow: '다음 전장', title: fortySeventhBattleScenario.title, description: '유비의 유탁 뒤 촉한은 제갈량을 중심으로 다시 숨을 고릅니다. 이제 남중의 반란군이 흔드는 산길과 창고를 안정시켜, 북벌보다 먼저 나라 안의 불안을 수습해야 합니다.', rewardHint: `예상 보상: ${fortySeventhBattleScenario.title} 개방 / 남중 산길 지도`, nextBattleId: fortySeventhBattleScenario.id, campaignStep: 'forty-seventh-battle', pages: fortySeventhBattleIntroPages }, [fortySeventhBattleScenario.id]: { afterBattleId: fortySeventhBattleScenario.id, eyebrow: '다음 전장', title: fortyEighthBattleScenario.title, description: '남중 안정로의 첫 길은 열렸지만 반란의 중심은 더 깊은 산과 마을 사이에 남아 있습니다. 맹획의 본대와 맞서되, 생포와 회유의 명분을 남겨 남중을 모두 적으로 돌리지 않아야 합니다.', rewardHint: `예상 보상: ${fortyEighthBattleScenario.title} 개방 / 맹획 회유 서신`, nextBattleId: fortyEighthBattleScenario.id, campaignStep: 'forty-eighth-battle', pages: [...fortySeventhBattleVictoryPages, ...fortyEighthBattleIntroPages] }, [fortyEighthBattleScenario.id]: { afterBattleId: fortyEighthBattleScenario.id, eyebrow: '다음 전장', title: fortyNinthBattleScenario.title, description: '맹획을 처음 생포하고 돌려보낸 뒤, 남중의 호족들은 촉한군의 방식이 단순 토벌이 아님을 보기 시작했습니다. 풀려난 맹획은 다시 산채를 모으지만, 이번에는 마을과 포로장이 촉한군의 군율을 증언할 수 있습니다.', rewardHint: `예상 보상: ${fortyNinthBattleScenario.title} 개방 / 칠종칠금 회유문`, nextBattleId: fortyNinthBattleScenario.id, campaignStep: 'forty-ninth-battle', pages: [...fortyEighthBattleVictoryPages, ...fortyNinthBattleIntroPages] }, [fortyNinthBattleScenario.id]: { afterBattleId: fortyNinthBattleScenario.id, eyebrow: '다음 전장', title: fiftiethBattleScenario.title, description: '맹획은 두 번째로 붙잡혔지만 아직 남중 전체가 굴복한 것은 아닙니다. 이제는 맹획 개인의 고집을 꺾는 것과 동시에, 호족과 마을이 어떤 조건에서 촉한의 질서를 받아들일지 전장에서 보여야 합니다.', rewardHint: `예상 보상: ${fiftiethBattleScenario.title} 개방 / 남중 호족 설득문`, nextBattleId: fiftiethBattleScenario.id, campaignStep: 'fiftieth-battle', pages: [...fortyNinthBattleVictoryPages, ...fiftiethBattleIntroPages] }, [fiftiethBattleScenario.id]: { afterBattleId: fiftiethBattleScenario.id, eyebrow: '다음 전장', title: fiftyFirstBattleScenario.title, description: '세 번째 생포 뒤 열린 호족 회의는 전장의 조건을 바꾸었습니다. 이제 회유 퇴로를 남기고, 독천과 화덕 요새를 억제하며, 흔들리는 호족들이 직접 촉한군의 약속을 보게 해야 합니다.', rewardHint: `예상 보상: ${fiftyFirstBattleScenario.title} 개방 / 호족 보증 장부`, nextBattleId: fiftyFirstBattleScenario.id, campaignStep: 'fifty-first-battle', pages: [...fiftiethBattleVictoryPages, ...fiftyFirstBattleIntroPages] }, [fiftyFirstBattleScenario.id]: { afterBattleId: fiftyFirstBattleScenario.id, eyebrow: '다음 전장', title: fiftySecondBattleScenario.title, description: '맹획은 네 번째로 붙잡혔고, 회유 퇴로와 보증 장부는 남중 호족들의 말 속에 남았습니다. 이제 강경파 호족이 그 길을 끊으려 하니, 다섯 번째 생포에서는 회유를 받아들일 자와 끝까지 싸울 자를 전장 안에서 분리해야 합니다.', rewardHint: `예상 보상: ${fiftySecondBattleScenario.title} 개방 / 강경파 분리 장부`, nextBattleId: fiftySecondBattleScenario.id, campaignStep: 'fifty-second-battle', pages: [...fiftyFirstBattleVictoryPages, ...fiftySecondBattleIntroPages] }, [fiftySecondBattleScenario.id]: { afterBattleId: fiftySecondBattleScenario.id, eyebrow: '다음 전장', title: fiftyThirdBattleScenario.title, description: '맹획은 다섯 번째로 붙잡혔고, 강경파 호족과 물러선 호족의 말이 갈라졌습니다. 이제 남중의 자존심을 더 직접적으로 마주하면서도, 지난 회유의 약속을 무너뜨리지 않는 여섯 번째 길을 엽니다.', rewardHint: `예상 보상: ${fiftyThirdBattleScenario.title} 개방 / 남중 신뢰 장부`, nextBattleId: fiftyThirdBattleScenario.id, campaignStep: 'fifty-third-battle', pages: [...fiftySecondBattleVictoryPages, ...fiftyThirdBattleIntroPages] }, [fiftyThirdBattleScenario.id]: { afterBattleId: fiftyThirdBattleScenario.id, eyebrow: '다음 전장', title: fiftyFourthBattleScenario.title, description: '맹획은 여섯 번째로 붙잡혔고, 남중의 마을들은 촉한군의 약속을 직접 보았습니다. 이제 마지막 회의장 앞에서 맹획의 고집과 남중의 마음을 함께 마주합니다.', rewardHint: `예상 보상: ${fiftyFourthBattleScenario.title} 개방 / 남중 평정 장부`, nextBattleId: fiftyFourthBattleScenario.id, campaignStep: 'fifty-fourth-battle', pages: [...fiftyThirdBattleVictoryPages, ...fiftyFourthBattleIntroPages] }, [fiftyFourthBattleScenario.id]: { afterBattleId: fiftyFourthBattleScenario.id, eyebrow: '군영 의정', title: '북벌 준비 회의', description: '맹획은 일곱 번의 생포 끝에 항복했고, 남중은 촉한의 약속을 받아들였습니다. 출진 준비를 통해 새 전투가 아니라 북벌 준비 회의를 진행하고, 한중 창고와 출전 무장 재편을 군영 안에서 정리합니다.', rewardHint: '군영 목표: 북벌 준비 회의 / 한중 창고와 출전 무장 재편', campaignStep: 'northern-campaign-prep-camp', pages: [...fiftyFourthBattleVictoryPages, ...northernCampaignPrepPages], unavailableNotice: '북벌 준비 회의가 완료되었습니다. 다음 작업에서는 기산 출진로와 제1차 북벌 전투로 이어갑니다.' }, 'northern-campaign-prep-camp': { afterBattleId: fiftyFourthBattleScenario.id, eyebrow: '다음 전장', title: fiftyFifthBattleScenario.title, description: '남중 평정과 북벌 준비 회의를 마쳤습니다. 이제 제갈량을 중심으로 조운의 기동, 황권과 마량의 보급 판단, 왕평과 마대의 산길 대응을 골라 기산 출진로를 열어야 합니다.', rewardHint: `예상 보상: ${fiftyFifthBattleScenario.title} 개방 / 기산 출진 장부`, nextBattleId: fiftyFifthBattleScenario.id, campaignStep: 'fifty-fifth-battle', pages: fiftyFifthBattleIntroPages }, [fiftyFifthBattleScenario.id]: { afterBattleId: fiftyFifthBattleScenario.id, eyebrow: '다음 전장', title: fiftySixthBattleScenario.title, description: '기산 산길과 한중 보급 거점을 확보했습니다. 이제 천수와 가정 사이에서 곽회와 강유의 대응을 확인하며 북벌의 전선을 넓혀야 합니다.', rewardHint: `예상 보상: ${fiftySixthBattleScenario.title} 개방 / 천수 진군 장부`, nextBattleId: fiftySixthBattleScenario.id, campaignStep: 'fifty-sixth-battle', pages: [...fiftyFifthBattleVictoryPages, ...fiftySixthBattleIntroPages] }, [fiftySixthBattleScenario.id]: { afterBattleId: fiftySixthBattleScenario.id, eyebrow: '다음 전장', title: fiftySeventhBattleScenario.title, description: '천수 방면의 방어선을 밀어냈고 강유의 이름이 제갈량의 장부에 남았습니다. 이제 가정 방면의 진영 배치와 장합의 반격을 막아 북벌의 퇴로를 지켜야 합니다.', rewardHint: `예상 보상: ${fiftySeventhBattleScenario.title} 개방 / 강유 합류 단서`, nextBattleId: fiftySeventhBattleScenario.id, campaignStep: 'fifty-seventh-battle', pages: [...fiftySixthBattleVictoryPages, ...fiftySeventhBattleIntroPages] }, [fiftySeventhBattleScenario.id]: { afterBattleId: fiftySeventhBattleScenario.id, eyebrow: '다음 전장', title: fiftyEighthBattleScenario.title, description: '가정의 물길과 고지는 가까스로 지켰고 강유가 촉한의 새 장수로 합류했습니다. 이제 장합의 추격과 사마의의 시선을 끊으며 기산으로 돌아갈 군량 수레 길을 열어야 합니다.', rewardHint: `예상 보상: ${fiftyEighthBattleScenario.title} 개방 / 강유 첫 출전 기록`, nextBattleId: fiftyEighthBattleScenario.id, campaignStep: 'fifty-eighth-battle', pages: [...fiftySeventhBattleVictoryPages, ...fiftyEighthBattleIntroPages] }, [fiftyEighthBattleScenario.id]: { afterBattleId: fiftyEighthBattleScenario.id, eyebrow: '다음 전장', title: fiftyNinthBattleScenario.title, description: '기산 후퇴로에서 병사와 장부를 지켜 냈습니다. 이제 다시 북쪽을 보되, 진창 성채의 학소와 왕쌍의 추격을 상대해야 합니다. 강유의 길 판단과 공성 진영, 군량 수레를 함께 계산하십시오.', rewardHint: `예상 보상: ${fiftyNinthBattleScenario.title} 개방 / 진창 공성 장부`, nextBattleId: fiftyNinthBattleScenario.id, campaignStep: 'fifty-ninth-battle', pages: [...fiftyEighthBattleVictoryPages, ...fiftyNinthBattleIntroPages] }, [fiftyNinthBattleScenario.id]: { afterBattleId: fiftyNinthBattleScenario.id, eyebrow: '다음 전장', title: sixtiethBattleScenario.title, description: '진창 성채를 오래 물고 늘어지는 대신 무도와 음평의 산길을 나누어 확보합니다. 강유와 위연의 전진성, 조운과 마대의 기동 회수, 왕평과 황권의 제동 장치를 7명 안에서 다시 골라야 합니다.', rewardHint: `예상 보상: ${sixtiethBattleScenario.title} 개방 / 무도·음평 장부`, nextBattleId: sixtiethBattleScenario.id, campaignStep: 'sixtieth-battle', pages: [...fiftyNinthBattleVictoryPages, ...sixtiethBattleIntroPages] }, [sixtiethBattleScenario.id]: { afterBattleId: sixtiethBattleScenario.id, eyebrow: '다음 전장', title: sixtyFirstBattleScenario.title, description: '무도와 음평의 산길을 확보하자 위군은 조진의 역공으로 한중 북문과 새 보급선을 동시에 흔듭니다. 이번에는 전진보다 방어, 돌파보다 장부, 새 고을을 지키는 책임을 7명 안에서 다시 골라야 합니다.', rewardHint: `예상 보상: ${sixtyFirstBattleScenario.title} 개방 / 한중 우로 장부`, nextBattleId: sixtyFirstBattleScenario.id, campaignStep: 'sixty-first-battle', pages: [...sixtiethBattleVictoryPages, ...sixtyFirstBattleIntroPages] }, [sixtyFirstBattleScenario.id]: { afterBattleId: sixtyFirstBattleScenario.id, eyebrow: '다음 전장', title: sixtySecondBattleScenario.title, description: '조진의 역공을 막아 낸 뒤, 지켜 낸 한중 북문과 무도·음평 수레 길을 다시 기산 방면 공격로로 바꿉니다. 사마의의 지연전, 장합의 추격, 곽회의 차단을 상대하려면 7명 안에서 전진과 회수, 보급과 민심을 다시 나누어야 합니다.', rewardHint: `예상 보상: ${sixtySecondBattleScenario.title} 개방 / 기산 재출정 장부`, nextBattleId: sixtySecondBattleScenario.id, campaignStep: 'sixty-second-battle', pages: [...sixtyFirstBattleVictoryPages, ...sixtySecondBattleIntroPages] }, [sixtySecondBattleScenario.id]: { afterBattleId: sixtySecondBattleScenario.id, eyebrow: '다음 전장', title: sixtyThirdBattleScenario.title, description: '사마의의 지연선을 밀어 냈지만 노성 뒤의 전선은 아직 닫히지 않았습니다. 장합의 회수선 추격, 곽회의 봉화 차단, 수레와 마을의 부담을 상대하려면 7명 안에서 전진과 회수를 다시 나누어야 합니다.', rewardHint: `예상 보상: ${sixtyThirdBattleScenario.title} 개방 / 노성 추격 장부`, nextBattleId: sixtyThirdBattleScenario.id, campaignStep: 'sixty-third-battle', pages: [...sixtySecondBattleVictoryPages, ...sixtyThirdBattleIntroPages] }, [sixtyThirdBattleScenario.id]: { afterBattleId: sixtyThirdBattleScenario.id, eyebrow: '다음 전장', title: sixtyFourthBattleScenario.title, description: '노성 추격로와 회수 표식은 지켰지만 사마의는 위수 북안에 진영을 겹겹이 세웠습니다. 이번에는 강을 무리하게 넘기보다 남안 진영, 물목, 봉화선을 먼저 끊어 다음 북방 공세의 발판을 만들어야 합니다.', rewardHint: `예상 보상: ${sixtyFourthBattleScenario.title} 개방 / 위수 진영 장부`, nextBattleId: sixtyFourthBattleScenario.id, campaignStep: 'sixty-fourth-battle', pages: [...sixtyThirdBattleVictoryPages, ...sixtyFourthBattleIntroPages] }, [sixtyFourthBattleScenario.id]: { afterBattleId: sixtyFourthBattleScenario.id, eyebrow: '다음 전장', title: sixtyFifthBattleScenario.title, description: '위수 남안 진영과 봉화선은 흔들었지만, 사마의의 북안 지연선은 아직 시간을 벌고 있습니다. 강을 끼고 오래 싸울 사람과 더 밀고 들어갈 사람을 다시 나누어 북안 전진 진영을 압박해야 합니다.', rewardHint: `예상 보상: ${sixtyFifthBattleScenario.title} 개방 / 북안 전진 장부`, nextBattleId: sixtyFifthBattleScenario.id, campaignStep: 'sixty-fifth-battle', pages: [...sixtyFourthBattleVictoryPages, ...sixtyFifthBattleIntroPages] }, 'sixty-fifth-camp': { afterBattleId: sixtyFifthBattleScenario.id, eyebrow: '다음 전장', title: sixtySixthBattleScenario.title, description: '위수 북안 압박 후 촉한군은 오장원 본영으로 돌아와 마지막 장부를 정리합니다. 이번 출전은 전공을 더하는 전투가 아니라, 제갈량의 명령과 강유의 계승, 병사들의 귀환로를 함께 지켜 내는 최종장입니다.', rewardHint: `예상 보상: ${sixtySixthBattleScenario.title} 개방 / 오장원 귀환 장부`, nextBattleId: sixtySixthBattleScenario.id, campaignStep: 'sixty-sixth-battle', pages: [...sixtyFifthBattleVictoryPages, ...sixtySixthBattleIntroPages] }, [sixtyFifthBattleScenario.id]: { afterBattleId: sixtyFifthBattleScenario.id, eyebrow: '다음 전장', title: sixtySixthBattleScenario.title, description: '위수 북안 압박 후 촉한군은 오장원 본영으로 돌아와 마지막 장부를 정리합니다. 이번 출전은 전공을 더하는 전투가 아니라, 제갈량의 명령과 강유의 계승, 병사들의 귀환로를 함께 지켜 내는 최종장입니다.', rewardHint: `예상 보상: ${sixtySixthBattleScenario.title} 개방 / 오장원 귀환 장부`, nextBattleId: sixtySixthBattleScenario.id, campaignStep: 'sixty-sixth-battle', pages: [...sixtyFifthBattleVictoryPages, ...sixtySixthBattleIntroPages] }, [sixtySixthBattleScenario.id]: { afterBattleId: sixtySixthBattleScenario.id, eyebrow: '최종 에필로그', title: '북벌의 끝과 남은 뜻', description: '오장원 본영을 지켜 낸 뒤 촉한군은 북벌의 마지막 장부를 닫습니다. 강유는 이어 받은 지도를 품고, 남은 장수들은 병사들이 돌아갈 길을 정리합니다.', rewardHint: '최종 보상: 오장원 에필로그 / 엔딩 개방', campaignStep: 'ending-complete', pages: [...sixtySixthBattleVictoryPages, ...endingEpiloguePages], unavailableNotice: '최종 에필로그와 엔딩을 이미 확인했습니다. 타이틀에서 이어하기를 선택하면 엔딩 화면으로 돌아갑니다.' }, 'northern-campaign-prep-camp-legacy': { afterBattleId: fiftyFourthBattleScenario.id, eyebrow: '다음 전장 준비', title: '제1차 북벌 출진 준비', description: '남중 평정과 북벌 준비 회의를 마쳤습니다. 이제 제갈량은 한중에서 출사표의 뜻을 세우고, 조운의 기동대와 황권·마량의 보급 판단을 묶어 첫 북벌 전장을 준비해야 합니다.', rewardHint: '다음 전장: 제1차 북벌 출진로 준비 중', campaignStep: 'northern-campaign-prep-camp', pages: northernCampaignPrepPages, unavailableNotice: '제1차 북벌 전장은 다음 작업에서 이어집니다. 지금은 북벌 편성, 대기 훈련, 군영 대화를 정비할 수 있습니다.' } }; export function getSortieFlow(latestBattleId?: string, campaignStep?: CampaignStep) { if (campaignStep && campaignStep in sortieFlows) { return sortieFlows[campaignStep]; } return sortieFlows[latestBattleId ?? defaultBattleScenario.id] ?? sortieFlows[defaultBattleScenario.id]; }