Files
heros_web/src/game/data/campaignFlow.ts

750 lines
38 KiB
TypeScript

import type { CampaignStep } from '../state/campaignState';
import {
defaultBattleScenario,
eighthBattleScenario,
eighteenthBattleScenario,
eleventhBattleScenario,
fiftiethBattleScenario,
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,
fiftiethBattleIntroPages,
fiftiethBattleVictoryPages,
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,
firstBattleVictoryPages,
fourthBattleIntroPages,
fourthBattleVictoryPages,
hanzhongKingCouncilPages,
ninthBattleIntroPages,
ninthBattleVictoryPages,
nineteenthBattleIntroPages,
nineteenthBattleVictoryPages,
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<string, SortieFlow> = {
[defaultBattleScenario.id]: {
afterBattleId: defaultBattleScenario.id,
eyebrow: '다음 전장',
title: secondBattleScenario.title,
description: '탁현을 물러난 황건 잔당이 인근 마을을 위협하고 있습니다. 의용군은 첫 승리의 기세를 몰아 추격에 나섭니다.',
rewardHint: '예상 보상: 군자금, 소모품, 의용군 명성',
nextBattleId: secondBattleScenario.id,
campaignStep: 'second-battle',
pages: [...firstBattleVictoryPages, ...secondBattleIntroPages]
},
[secondBattleScenario.id]: {
afterBattleId: secondBattleScenario.id,
eyebrow: '다음 전장',
title: thirdBattleScenario.title,
description: '탁현을 넘어 광종으로 향하는 길목에서 황건 전령이 관군의 움직임을 본대로 전하려 합니다. 강가 요새와 좁은 길을 돌파해야 합니다.',
rewardHint: `예상 보상: ${thirdBattleScenario.title} 개방`,
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: '여포를 의탁시킨 뒤 서주 성문 안팎의 불안이 터집니다. 조표의 야습을 막아 성문을 지켜내야 합니다.',
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: '호족 회유 회의',
description:
'맹획은 세 번째로 붙잡혔고, 그를 따르던 호족들의 말도 흔들리기 시작했습니다. 다음 장에서는 전투 전 회의에서 어떤 호족을 먼저 달랠지 고르고, 그 선택이 다음 남중 전장의 목표와 추천 출전에 영향을 주는 흐름을 준비합니다.',
rewardHint: '다음 장: 남중 호족 회유 회의와 칠종칠금 4차전 준비 중',
pages: fiftiethBattleVictoryPages,
unavailableNotice: '칠종칠금 4차전은 다음 작업에서 이어집니다. 지금은 세 번째 생포 뒤의 호족 회유 선택지와 출전 추천 변화를 정비할 수 있습니다.'
}
};
export function getSortieFlow(latestBattleId?: string, campaignStep?: CampaignStep) {
if (campaignStep && campaignStep in sortieFlows) {
return sortieFlows[campaignStep];
}
return sortieFlows[latestBattleId ?? defaultBattleScenario.id] ?? sortieFlows[defaultBattleScenario.id];
}