Add Yiling fire attack chapter

This commit is contained in:
2026-06-23 19:46:28 +09:00
parent ef20c6460b
commit d88cc65972
11 changed files with 856 additions and 54 deletions

View File

@@ -47,6 +47,7 @@ import {
xuzhouRecruitUnits,
yizhouRecruitBonds,
yizhouRecruitUnits,
yilingFireBonds,
yilingVanguardBonds,
zhugeRecruitBonds,
zhugeRecruitUnits,
@@ -400,9 +401,10 @@ const campaignTimelineChapters: CampaignTimelineChapter[] = [
'forty-second-battle-jing-rear-crisis',
'forty-third-battle-gongan-collapse',
'forty-fourth-battle-maicheng-isolation',
'forty-fifth-battle-yiling-vanguard'
'forty-fifth-battle-yiling-vanguard',
'forty-sixth-battle-yiling-fire'
],
nextHints: ['왕업 선언', '번성 포위', '형주 위기', '이릉 복수전']
nextHints: ['왕업 선언', '번성 포위', '형주 위기', '이릉 화공']
}
];
@@ -451,7 +453,8 @@ const campBattleIds = {
fortySecond: 'forty-second-battle-jing-rear-crisis',
fortyThird: 'forty-third-battle-gongan-collapse',
fortyFourth: 'forty-fourth-battle-maicheng-isolation',
fortyFifth: 'forty-fifth-battle-yiling-vanguard'
fortyFifth: 'forty-fifth-battle-yiling-vanguard',
fortySixth: 'forty-sixth-battle-yiling-fire'
} as const;
const defaultRequiredSortieUnitIds = ['liu-bei'];
@@ -984,6 +987,20 @@ const sortieRulesByBattleId: Partial<Record<BattleScenarioId, SortieRuleDefiniti
{ unitId: 'ma-liang', reason: '형주 상실 뒤 흩어진 잔병과 현지 민심을 다독이는 연결 축입니다.' }
],
note: '이릉 진격로는 스물두 명 중 일곱 명만 출전합니다. 유비는 필수이며, 복수의 선봉과 보급·화공 대비를 균형 있게 고르는 전투입니다.'
},
'forty-sixth-battle-yiling-fire': {
maxUnits: 7,
requiredUnitIds: ['liu-bei'],
recommended: [
{ unitId: 'liu-bei', reason: '이릉 화공 속에서 병사를 버리지 않고 퇴로를 열어야 하는 주장입니다.' },
{ unitId: 'huang-quan', reason: '군막 간격, 보급 장부, 서쪽 퇴로를 신중하게 계산하는 핵심 참모입니다.' },
{ unitId: 'zhuge-liang', reason: '육손의 화공 의도와 다음 백제성 수습까지 읽는 큰 책략 축입니다.' },
{ unitId: 'ma-liang', reason: '형주 잔병과 현지 민심을 모아 불길 속 사기를 붙잡습니다.' },
{ unitId: 'zhao-yun', reason: '끊어진 군막 사이를 빠르게 오가며 흩어진 아군을 회수합니다.' },
{ unitId: 'wang-ping', reason: '숲길과 강변 퇴로의 지형 판단으로 포위망을 빠져나갈 길을 찾습니다.' },
{ unitId: 'ma-chao', reason: '오군 추격 기병과 불길 바깥 차단선을 강하게 밀어낼 수 있습니다.' }
],
note: '이릉 화공전은 스물두 명 중 일곱 명만 출전합니다. 유비는 필수이며, 불길 수습, 퇴로 확보, 추격 차단 중 무엇을 두껍게 할지 선택하는 전투입니다.'
}
};
@@ -4713,6 +4730,87 @@ const campDialogues: CampDialogue[] = [
rewardExp: 16
}
]
},
{
id: 'liu-huangquan-after-yiling-fire',
title: '퇴로의 장부',
availableAfterBattleIds: [campBattleIds.fortySixth],
unitIds: ['liu-bei', 'huang-quan'],
bondId: 'liu-bei__huang-quan_yiling-fire',
rewardExp: 52,
lines: [
'황권: 폐하, 불길은 군막을 태웠지만 장부까지 태우면 남은 병사를 다시 세울 수 없습니다.',
'유비: 내가 서두른 탓이 크오. 그렇기에 남은 자들의 이름을 더 잊지 말아야 하오.',
'황권: 퇴로를 기록하고 흩어진 부대를 셈하겠습니다. 다음 싸움보다 먼저, 남은 군의 숨을 이어야 합니다.'
],
choices: [
{
id: 'count-retreat-columns',
label: '퇴각 부대를 다시 센다',
response: '유비는 황권에게 퇴각 부대의 이름과 위치를 모두 다시 세게 했고, 남은 병사들의 동요가 조금 잦아들었습니다.',
rewardExp: 18
},
{
id: 'protect-supply-ledgers',
label: '보급 장부를 지킨다',
response: '황권은 불탄 군막에서 건진 보급 장부를 정리했고, 유비는 다음 길을 급히 정하지 않겠다고 고개를 끄덕였습니다.',
rewardExp: 17
}
]
},
{
id: 'zhaoyun-wangping-after-yiling-fire',
title: '불길 속 길잡이',
availableAfterBattleIds: [campBattleIds.fortySixth],
unitIds: ['zhao-yun', 'wang-ping'],
bondId: 'zhao-yun__wang-ping_yiling-fire',
rewardExp: 50,
lines: [
'왕평: 불길이 지나간 숲은 길처럼 보이지만, 재가 깊어 말과 병사가 함께 빠집니다.',
'조운: 길이 사라졌다면 다시 만들면 되오. 다만 뒤처진 병사가 그 길을 알아볼 수 있어야 하오.',
'왕평: 강변의 낮은 돌과 그을린 나무를 표식으로 삼겠습니다. 불길이 만든 길을 퇴로로 바꾸겠습니다.'
],
choices: [
{
id: 'mark-ash-road',
label: '그을린 길을 표시한다',
response: '조운은 그을린 숲길에 작은 깃발을 남겼고, 왕평은 퇴로 표식을 병사들에게 나누어 익혔습니다.',
rewardExp: 17
},
{
id: 'cover-stragglers',
label: '뒤처진 병사를 엄호한다',
response: '왕평은 늦은 병사들이 빠지는 낮은 땅을 짚었고, 조운은 추격대를 끊는 짧은 기동로를 잡았습니다.',
rewardExp: 16
}
]
},
{
id: 'zhuge-maliang-after-yiling-fire',
title: '남은 뜻의 기록',
availableAfterBattleIds: [campBattleIds.fortySixth],
unitIds: ['zhuge-liang', 'ma-liang'],
bondId: 'zhuge-liang__ma-liang_yiling-fire',
rewardExp: 50,
lines: [
'마량: 이릉의 패착을 숨기면 병사들은 같은 불길을 다시 만날 것입니다.',
'제갈량: 아픈 기록일수록 남겨야 합니다. 나라가 오래 버티려면 승리보다 실패의 모양을 알아야 하지요.',
'마량: 백제성에 닿기 전에, 잃은 길과 남은 길을 나누어 적겠습니다.'
],
choices: [
{
id: 'write-fire-lesson',
label: '화공의 원인을 기록한다',
response: '제갈량과 마량은 늘어진 진영, 마른 숲, 바람의 방향을 차례로 적어 다음 작전의 금기로 삼았습니다.',
rewardExp: 18
},
{
id: 'prepare-baidi-council',
label: '백제성 논의를 준비한다',
response: '마량은 백제성에 모일 문서를 정리했고, 제갈량은 전장이 아닌 조정에서 이어질 책임을 조용히 받아들였습니다.',
rewardExp: 17
}
]
}
];
@@ -6542,6 +6640,66 @@ const campVisits: CampVisitDefinition[] = [
itemRewards: ['탁주 4']
}
]
},
{
id: 'yiling-firebreak-lines',
title: '화공 방화선 수습',
location: '이릉 불탄 군막',
availableAfterBattleIds: [campBattleIds.fortySixth],
bondId: 'zhuge-liang__ma-liang_yiling-fire',
description: '제갈량과 마량이 불탄 군막 사이에 남은 방화선을 정리하고, 다음 전투에서 반복하지 말아야 할 배치를 기록합니다.',
lines: [
'마량: 여기서 군막과 마른 풀이 너무 가까웠습니다. 물동이는 있었지만 불길을 끊을 빈 땅이 부족했습니다.',
'제갈량: 이 기록은 패배의 부끄러움이 아니라 다음 병사를 살리는 약입니다.',
'병사들은 재가 된 군막 터에 낮은 말뚝을 세우고, 다시는 같은 간격으로 진을 치지 않도록 표시했습니다.'
],
choices: [
{
id: 'mark-firebreak-spacing',
label: '방화선 간격을 새긴다',
response: '방화선 간격 표식이 정리되어, 다음 군영 배치에서 화공 대비가 더 분명해졌습니다.',
bondExp: 40,
itemRewards: ['화공 방화선 표식 1']
},
{
id: 'recover-camp-records',
label: '군막 기록을 수습한다',
response: '마량은 타다 남은 배치 기록을 건졌고, 제갈량은 불길이 번진 순서를 다시 맞추었습니다.',
bondExp: 38,
gold: 1220,
itemRewards: ['상처약 6']
}
]
},
{
id: 'yiling-fire-baidi-retreat-route',
title: '백제성 퇴로 정찰',
location: '서쪽 협곡 물길',
availableAfterBattleIds: [campBattleIds.fortySixth],
bondId: 'zhao-yun__wang-ping_yiling-fire',
description: '조운과 왕평이 백제성으로 향하는 협곡 물길을 다시 훑고, 흩어진 병사들이 모일 표식을 남깁니다.',
lines: [
'왕평: 강가의 낮은 돌을 따라가면 밤에도 길을 잃지 않습니다. 다만 추격 기병이 들어오면 먼저 막히는 곳입니다.',
'조운: 내가 뒤를 끊고, 그대는 앞의 표식을 맡으시오. 병사들이 길을 보면 다시 걸을 수 있소.',
'정찰대는 협곡 입구마다 작은 천 조각을 묶고, 백제성으로 향하는 물길을 낮게 표시했습니다.'
],
choices: [
{
id: 'place-baidi-route-markers',
label: '백제성 표식을 남긴다',
response: '백제성으로 향하는 물길에 표식이 남아, 흩어진 병사들이 서쪽으로 모일 가능성이 높아졌습니다.',
bondExp: 39,
itemRewards: ['백제성 퇴로 지도 1']
},
{
id: 'delay-wu-pursuit',
label: '오군 추격로를 늦춘다',
response: '조운은 좁은 길목에 작은 장애물을 놓았고, 왕평은 우회로를 지워 추격대의 속도를 늦추었습니다.',
bondExp: 37,
gold: 1240,
itemRewards: ['탁주 4']
}
]
}
];
@@ -6635,7 +6793,8 @@ export class CampScene extends Phaser.Scene {
battleId === campBattleIds.fortySecond ||
battleId === campBattleIds.fortyThird ||
battleId === campBattleIds.fortyFourth ||
battleId === campBattleIds.fortyFifth
battleId === campBattleIds.fortyFifth ||
battleId === campBattleIds.fortySixth
) {
this.campaign = ensureCampaignRosterUnits(
[
@@ -6683,7 +6842,8 @@ export class CampScene extends Phaser.Scene {
...jingRearCrisisBonds,
...jingCollapseBonds,
...maichengIsolationBonds,
...yilingVanguardBonds
...yilingVanguardBonds,
...yilingFireBonds
]
);
this.report = this.campaign.firstBattleReport ?? this.report;
@@ -7318,6 +7478,9 @@ export class CampScene extends Phaser.Scene {
if (this.campaign?.step === 'hanzhong-king-camp') {
return '한중왕 즉위 준비 군영';
}
if (battleId === campBattleIds.fortySixth) {
return '이릉 화공전 후 군영';
}
if (battleId === campBattleIds.fortyFifth) {
return '이릉 진격로 후 군영';
}