Add Changban refuge sortie chapter

This commit is contained in:
2026-06-23 06:33:37 +09:00
parent 2d4b08558d
commit 697ce8837d
11 changed files with 1047 additions and 23 deletions

View File

@@ -281,7 +281,7 @@ const campaignTimelineChapters: CampaignTimelineChapter[] = [
title: '적벽대전',
period: '강동의 바람',
description: '제갈량의 계책과 강동의 힘이 맞물려 조조의 대군을 막아서는 큰 전환 장입니다.',
battleIds: ['eighteenth-battle-bowang-ambush'],
battleIds: ['eighteenth-battle-bowang-ambush', 'nineteenth-battle-changban-refuge'],
nextHints: ['강동 사절', '화공 준비', '조조 남하']
},
{
@@ -320,7 +320,8 @@ const campBattleIds = {
fifteenth: 'fifteenth-battle-yuan-refuge-road',
sixteenth: 'sixteenth-battle-liu-biao-refuge',
seventeenth: 'seventeenth-battle-wolong-visit-road',
eighteenth: 'eighteenth-battle-bowang-ambush'
eighteenth: 'eighteenth-battle-bowang-ambush',
nineteenth: 'nineteenth-battle-changban-refuge'
} as const;
const requiredSortieUnitIds = new Set(['liu-bei']);
@@ -511,6 +512,18 @@ const sortieRulesByBattleId: Partial<Record<BattleScenarioId, SortieRuleDefiniti
{ unitId: 'sun-qian', reason: '강동 사절로 이어질 명분과 전후 보고를 정리합니다.' }
],
note: '제갈량의 첫 실전 계책입니다. 책략 담당을 포함해 전열, 기동, 보급 중 무엇을 남길지 결정해야 합니다.'
},
'nineteenth-battle-changban-refuge': {
maxUnits: 6,
recommended: [
{ unitId: 'liu-bei', reason: '피난 행렬의 중심이며 패배 조건입니다.' },
{ unitId: 'zhao-yun', reason: '피난로를 오가며 흩어진 병력과 백성을 붙잡는 핵심 기동 장수입니다.' },
{ unitId: 'zhang-fei', reason: '장판교와 좁은 길목에서 추격 기병을 늦추는 역할입니다.' },
{ unitId: 'zhuge-liang', reason: '피난로 판단과 강동 사절 명분을 전투 뒤로 연결합니다.' },
{ unitId: 'guan-yu', reason: '다리목 전열과 친위 보병을 받아낼 안정적인 전열입니다.' },
{ unitId: 'sun-qian', reason: '강동에 보낼 기록과 외교 명분을 정리합니다.' }
],
note: '장판파는 출전 제한보다 역할이 많은 전장입니다. 조운과 장비를 중심으로 기동, 전열, 책략, 보급 중 무엇을 우선할지 직접 선택하십시오.'
}
};
@@ -2026,6 +2039,87 @@ const campDialogues: CampDialogue[] = [
rewardExp: 9
}
]
},
{
id: 'liu-zhao-after-changban-refuge',
title: '백마가 지킨 길',
availableAfterBattleIds: [campBattleIds.nineteenth],
unitIds: ['liu-bei', 'zhao-yun'],
bondId: 'liu-bei__zhao-yun',
rewardExp: 30,
lines: [
'유비: 자룡, 장판파의 먼지 속에서도 그대의 창은 백성을 향해 길을 열었소.',
'조운: 주공께서 백성을 버리지 않으셨기에 저도 물러서지 않을 수 있었습니다.',
'유비: 오늘의 공은 전공보다 무겁소. 다음 길에서도 그 마음을 함께 지켜 주시오.'
],
choices: [
{
id: 'entrust-refugee-guard',
label: '피난 행렬 호위를 맡긴다',
response: '조운은 말없이 창을 세웠고, 유비군의 피난길은 더 단단한 호위를 얻었다.',
rewardExp: 12
},
{
id: 'praise-white-horse-loyalty',
label: '백마의 의리를 칭찬한다',
response: '주공의 말에 조운은 깊이 고개를 숙였다. 흩어진 군영 안에서도 두 사람의 신뢰가 또렷해졌다.',
rewardExp: 10
}
]
},
{
id: 'zhang-zhuge-after-changban-refuge',
title: '다리목의 호령',
availableAfterBattleIds: [campBattleIds.nineteenth],
unitIds: ['zhang-fei', 'zhuge-liang'],
bondId: 'zhang-fei__zhuge-liang',
rewardExp: 22,
lines: [
'장비: 군사, 다리목에서 한 번 호통치니 놈들이 눈치를 보더군. 이번엔 계책이 아니라 목청이 이긴 것 아니오?',
'제갈량: 익덕 장군의 호령이 먹힌 것은 설 곳을 정확히 골랐기 때문입니다. 그 자리까지 가는 길도 계책의 일부입니다.',
'장비: 하하, 그렇다면 다음에도 어디서 소리치면 되는지만 알려 주시오. 나머지는 내 창이 알아서 하겠소.'
],
choices: [
{
id: 'fix-bridge-ambush-signals',
label: '다리목 신호를 정한다',
response: '제갈량은 장비가 나서야 할 순간을 짧은 깃발 신호로 정했고, 장비는 복잡한 설명보다 마음에 든다고 웃었다.',
rewardExp: 9
},
{
id: 'let-roar-lead',
label: '호령을 먼저 세운다',
response: '장비의 호령이 적의 발을 묶고, 제갈량의 손짓이 그 뒤를 받치는 새 호흡이 생겼다.',
rewardExp: 8
}
]
},
{
id: 'liu-zhuge-after-changban-refuge',
title: '피난길과 강동',
availableAfterBattleIds: [campBattleIds.nineteenth],
unitIds: ['liu-bei', 'zhuge-liang'],
bondId: 'liu-bei__zhuge-liang',
rewardExp: 28,
lines: [
'유비: 오늘 지킨 것은 길 하나였지만, 그 길 위의 사람들은 천하보다 가벼울 수 없었소.',
'제갈량: 바로 그 점이 강동에 전할 말입니다. 조조의 힘만이 아니라 주공이 무엇을 지키려 하는지를 보여야 합니다.',
'유비: 그렇다면 손권에게 갈 말도 이 피난길에서 시작해야겠구려.'
],
choices: [
{
id: 'write-refugee-road-record',
label: '피난로 기록을 남긴다',
response: '제갈량은 장판파의 피난로와 조조군의 추격 속도를 함께 적어 강동 사절 문서의 근거로 삼았다.',
rewardExp: 11
},
{
id: 'align-people-and-strategy',
label: '백성과 대계를 함께 본다',
response: '유비와 제갈량은 백성을 지키는 마음과 천하를 보는 계책이 서로 멀지 않음을 확인했다.',
rewardExp: 10
}
]
}
];
@@ -2235,6 +2329,66 @@ const campVisits: CampVisitDefinition[] = [
itemRewards: ['탁주 1']
}
]
},
{
id: 'changban-refugee-camp',
title: '장판파 피난민 수습',
location: '남쪽 피난 진영',
availableAfterBattleIds: [campBattleIds.nineteenth],
bondId: 'liu-bei__zhao-yun',
description: '장판파를 벗어난 피난민을 돌보며 흩어진 병사와 민심을 다시 모읍니다.',
lines: [
'조운: 피난민 중에는 가족을 잃고 주저앉은 사람도 많습니다. 군이 먼저 손을 내밀어야 길이 이어집니다.',
'유비: 우리가 지킨 길이 사람을 버리는 길이 되어서는 안 되오. 군량을 나누되, 다음 행군도 버틸 수 있게 살피시오.',
'남쪽 진영에는 먼지와 상처가 가득하지만, 유비군의 깃발 아래 다시 줄이 만들어집니다.'
],
choices: [
{
id: 'share-field-medicine',
label: '상처 입은 피난민을 돌본다',
response: '조운은 약을 나누며 질서를 세웠고, 피난민들은 유비군이 자신들을 버리지 않았음을 기억했다.',
bondExp: 22,
itemRewards: ['민심 기록 1']
},
{
id: 'gather-scattered-soldiers',
label: '흩어진 병사를 모은다',
response: '장판파에서 흩어진 병사들이 하나둘 돌아왔고, 군영은 다음 이동을 버틸 힘을 되찾았다.',
bondExp: 18,
gold: 140,
itemRewards: ['콩 2']
}
]
},
{
id: 'jiangdong-envoy-after-changban',
title: '강동 사절 문서',
location: '피난 진영 막사',
availableAfterBattleIds: [campBattleIds.nineteenth],
bondId: 'sun-qian__zhuge-liang',
description: '제갈량과 손건이 장판파 전황을 강동에 보낼 문서로 정리합니다.',
lines: [
'손건: 장판파의 일은 처참하지만, 강동이 조조의 남하를 실감할 증거이기도 합니다.',
'제갈량: 두려움만 적으면 사람은 굳고, 계산만 적으면 마음이 움직이지 않습니다. 주공이 지킨 길을 함께 써야 합니다.',
'작은 막사 안에서 피난로 지도와 조조군의 진격 보고가 하나의 문서로 묶입니다.'
],
choices: [
{
id: 'write-sun-quan-brief',
label: '손권에게 보낼 요지를 쓴다',
response: '손건은 제갈량의 형세 판단을 짧은 문장으로 정리했고, 강동 사절의 첫 말이 뚜렷해졌다.',
bondExp: 20,
itemRewards: ['강동 풍문 1']
},
{
id: 'prepare-envoy-supplies',
label: '사절 보급을 챙긴다',
response: '강동까지 갈 사절단의 노자와 약품을 따로 묶어 두었다. 긴 길을 위한 준비가 조금 더 단단해졌다.',
bondExp: 16,
gold: 180,
itemRewards: ['상처약 1', '탁주 1']
}
]
}
];
@@ -2320,7 +2474,7 @@ export class CampScene extends Phaser.Scene {
return;
}
if (battleId === campBattleIds.seventeenth || battleId === campBattleIds.eighteenth) {
if (battleId === campBattleIds.seventeenth || battleId === campBattleIds.eighteenth || battleId === campBattleIds.nineteenth) {
this.campaign = ensureCampaignRosterUnits(
[...xuzhouRecruitUnits, ...caoBreakRecruitUnits, ...liuBiaoRecruitUnits, ...zhugeRecruitUnits],
[...xuzhouRecruitBonds, ...caoBreakRecruitBonds, ...liuBiaoRecruitBonds, ...zhugeRecruitBonds]
@@ -2377,6 +2531,9 @@ export class CampScene extends Phaser.Scene {
private currentCampTitle() {
const battleId = this.currentCampBattleId();
if (battleId === campBattleIds.nineteenth) {
return '장판파 돌파 후 군영';
}
if (battleId === campBattleIds.eighteenth) {
return '박망파 승전 후 군영';
}