Add final Meng Huo capture battle

This commit is contained in:
2026-06-24 00:35:04 +09:00
parent a54e852c2b
commit 1c26583508
11 changed files with 883 additions and 63 deletions

View File

@@ -30,6 +30,7 @@ import {
mengHuoFourthCaptureBonds,
mengHuoFifthCaptureBonds,
mengHuoSixthCaptureBonds,
mengHuoFinalCaptureBonds,
mengHuoThirdCaptureBonds,
fanCastleBonds,
fanCastleSiegeBonds,
@@ -419,7 +420,8 @@ const campaignTimelineChapters: CampaignTimelineChapter[] = [
'fiftieth-battle-meng-huo-third-capture',
'fifty-first-battle-meng-huo-fourth-capture',
'fifty-second-battle-meng-huo-fifth-capture',
'fifty-third-battle-meng-huo-sixth-capture'
'fifty-third-battle-meng-huo-sixth-capture',
'fifty-fourth-battle-meng-huo-final-capture'
],
nextHints: ['왕업 선언', '번성 포위', '형주 위기', '이릉 화공', '남중 안정', '맹획 회유', '칠종칠금']
}
@@ -478,7 +480,8 @@ const campBattleIds = {
fiftieth: 'fiftieth-battle-meng-huo-third-capture',
fiftyFirst: 'fifty-first-battle-meng-huo-fourth-capture',
fiftySecond: 'fifty-second-battle-meng-huo-fifth-capture',
fiftyThird: 'fifty-third-battle-meng-huo-sixth-capture'
fiftyThird: 'fifty-third-battle-meng-huo-sixth-capture',
fiftyFourth: 'fifty-fourth-battle-meng-huo-final-capture'
} as const;
const defaultRequiredSortieUnitIds = ['liu-bei'];
@@ -1123,6 +1126,20 @@ const sortieRulesByBattleId: Partial<Record<BattleScenarioId, SortieRuleDefiniti
{ unitId: 'ma-dai', reason: '마대는 남중 기동대의 움직임을 따라잡고 계곡 측면을 막습니다.' }
],
note: '칠종칠금 6차전은 맹획의 남은 자존심을 마주하는 전투입니다. 공격력만 높이기보다 마을 신뢰, 신뢰 장부, 계곡 퇴로, 잔당 차단 역할을 균형 있게 고르십시오.'
},
'fifty-fourth-battle-meng-huo-final-capture': {
maxUnits: 7,
requiredUnitIds: ['zhuge-liang'],
recommended: [
{ unitId: 'zhuge-liang', reason: '제갈량은 필수 출전입니다. 일곱 번째 생포를 항복과 남중 평정으로 완성해야 합니다.' },
{ unitId: 'huang-quan', reason: '황권은 일곱 번의 약속을 장부로 남겨 항복 조건을 분명히 합니다.' },
{ unitId: 'ma-liang', reason: '마량은 촌장들이 보는 회의장에서 남중이 받아들일 말을 고릅니다.' },
{ unitId: 'wang-ping', reason: '왕평은 회의장 길과 마을길을 나누어 군율이 흔들리지 않게 합니다.' },
{ unitId: 'zhao-yun', reason: '조운은 빠른 기동으로 항복로를 해치려는 잔당을 끊습니다.' },
{ unitId: 'ma-dai', reason: '마대는 남중 기동대를 따라잡되 항복로를 밟지 않는 절제가 필요합니다.' },
{ unitId: 'huang-zhong', reason: '황충은 고지 궁병과 주술사를 멀리서 억제해 회의장 압박을 줄입니다.' }
],
note: '칠종칠금 7차전은 남중 평정의 결말입니다. 맹획을 마지막으로 생포하되, 촌장 증언 마을, 항복 회의장 길, 최후 잔당 요새를 함께 관리할 편성을 고르십시오.'
}
};
@@ -5584,6 +5601,87 @@ const campDialogues: CampDialogue[] = [
rewardExp: 21
}
]
},
{
id: 'final-capture-zhuge-huangquan-oath',
title: '일곱 번의 약속',
availableAfterBattleIds: [campBattleIds.fiftyFourth],
unitIds: ['zhuge-liang', 'huang-quan'],
bondId: 'zhuge-liang__huang-quan_final-capture',
rewardExp: 78,
lines: [
'황권: 맹획의 항복은 말로 끝나지 않습니다. 어떤 약속을 남기느냐가 남중의 다음 질서를 정할 것입니다.',
'제갈량: 그렇습니다. 우리가 이긴 기록보다 우리가 지킨 약속이 더 오래 남아야 합니다.',
'황권: 남중 평정 장부에는 벌할 이름보다 지켜야 할 약속을 먼저 적겠습니다.'
],
choices: [
{
id: 'seal-nanzhong-oath',
label: '남중 서약을 봉한다',
response: '제갈량은 항복 서약의 문장을 낮추었고, 황권은 촌장들이 확인할 수 있도록 약속 조항을 따로 봉했습니다.',
rewardExp: 26
},
{
id: 'write-pacification-ledger',
label: '평정 장부를 쓴다',
response: '황권은 각 마을에 남길 약속을 정리했고, 제갈량은 군사들이 남중 백성을 징발하지 못하게 군령을 덧붙였습니다.',
rewardExp: 25
}
]
},
{
id: 'final-capture-maliang-wangping-council',
title: '마을과 회의장',
availableAfterBattleIds: [campBattleIds.fiftyFourth],
unitIds: ['ma-liang', 'wang-ping'],
bondId: 'ma-liang__wang-ping_final-capture',
rewardExp: 72,
lines: [
'마량: 회의장에서 맹획이 고개를 숙였어도, 마을길이 어지러우면 항복은 오래가지 않습니다.',
'왕평: 그래서 군대가 떠난 뒤에도 남을 표식이 필요합니다. 길과 말이 함께 남아야 합니다.',
'마량: 촌장들이 스스로 설명할 수 있는 표식을 남기겠습니다.'
],
choices: [
{
id: 'leave-council-markers',
label: '회의장 표식을 남긴다',
response: '왕평은 회의장과 마을을 잇는 낮은 길에 표식을 남겼고, 마량은 그 뜻을 촌장들의 말로 바꾸었습니다.',
rewardExp: 24
},
{
id: 'prepare-village-notices',
label: '마을 고시문을 나눈다',
response: '마량은 마을마다 다른 고시문을 적었고, 왕평은 병사들이 어느 길을 지나지 말아야 하는지 표시했습니다.',
rewardExp: 23
}
]
},
{
id: 'final-capture-zhaoyun-madai-pursuit',
title: '멈추는 추격',
availableAfterBattleIds: [campBattleIds.fiftyFourth],
unitIds: ['zhao-yun', 'ma-dai'],
bondId: 'zhao-yun__ma-dai_final-capture',
rewardExp: 68,
lines: [
'마대: 마지막 전투에서 가장 어려운 일은 달리는 것이 아니라 멈추는 것이었습니다.',
'조운: 항복로를 밟으면 승리도 원한이 됩니다. 빠른 기병일수록 군율을 먼저 알아야 합니다.',
'마대: 남중을 떠날 때도 그 선은 남겨 두겠습니다.'
],
choices: [
{
id: 'mark-surrender-road',
label: '항복로를 표시한다',
response: '조운은 항복로를 지키는 흰 깃발을 세웠고, 마대는 기병이 그 선을 넘지 않도록 회수 신호를 다시 맞췄습니다.',
rewardExp: 23
},
{
id: 'train-returning-patrol',
label: '귀환 순찰을 훈련한다',
response: '마대는 남중 기병의 발걸음을 익혔고, 조운은 촉한군이 떠난 뒤에도 순찰선이 마을을 누르지 않게 정했습니다.',
rewardExp: 22
}
]
}
];
@@ -7949,6 +8047,65 @@ const campVisits: CampVisitDefinition[] = [
itemRewards: ['상처약 14']
}
]
},
{
id: 'final-capture-pacification-ledger',
title: '남중 평정 장부',
location: '남중 회의장',
availableAfterBattleIds: [campBattleIds.fiftyFourth],
bondId: 'zhuge-liang__huang-quan_final-capture',
description: '제갈량과 황권이 맹획의 항복 뒤 남중 각 마을에 남길 약속과 촉한군의 금지 군령을 정리합니다.',
lines: [
'황권: 이제 이 장부는 포로의 이름이 아니라 지켜야 할 약속의 목록이 되었습니다.',
'제갈량: 남중을 얻었다고 해서 남중을 마음대로 써도 된다는 뜻은 아닙니다.',
'회의장 중앙에는 남중 평정 장부와 촉한군 금지 군령이 함께 놓였습니다.'
],
choices: [
{
id: 'seal-pacification-ledger',
label: '평정 장부를 봉한다',
response: '황권은 평정 장부를 봉했고, 제갈량은 남중 마을 징발 금지 군령을 함께 낭독하게 했습니다.',
bondExp: 58,
itemRewards: ['남중 평정 장부 1']
},
{
id: 'send-council-copies',
label: '회의장 사본을 보낸다',
response: '제갈량은 촌장들이 직접 확인할 사본을 나누었고, 황권은 각 사본에 약속의 기준을 적었습니다.',
bondExp: 56,
gold: 1960,
itemRewards: ['상처약 16']
}
]
},
{
id: 'final-capture-menghuo-oath',
title: '맹획 항복 서약',
location: '남중 대천막',
availableAfterBattleIds: [campBattleIds.fiftyFourth],
bondId: 'ma-liang__wang-ping_final-capture',
description: '마량과 왕평이 맹획의 항복 서약을 촌장들이 이해할 말과 길표식으로 풀어 남깁니다.',
lines: [
'마량: 맹획의 항복문이 너무 높은 말로만 쓰이면, 마을 사람들은 다시 남의 약속처럼 여길 것입니다.',
'왕평: 길표식도 함께 남기겠습니다. 어느 길로 군대가 떠나고, 어느 길로 장터가 다시 열리는지 보여야 합니다.',
'대천막 밖에는 촉한군이 떠날 길과 남중 사람들이 오갈 길이 서로 다른 표식으로 나뉘었습니다.'
],
choices: [
{
id: 'record-menghuo-oath',
label: '맹획 서약을 적는다',
response: '마량은 맹획의 항복 서약을 짧게 다시 적었고, 왕평은 마을 사람들이 볼 길목에 같은 표식을 세웠습니다.',
bondExp: 56,
itemRewards: ['맹획 항복 서약 1']
},
{
id: 'open-market-road',
label: '장터길을 다시 연다',
response: '왕평은 장터로 이어지는 낮은 길을 열었고, 마량은 촌장들이 직접 장터 재개를 알리게 했습니다.',
bondExp: 54,
itemRewards: ['콩 16', '탁주 4']
}
]
}
];
@@ -8050,7 +8207,8 @@ export class CampScene extends Phaser.Scene {
battleId === campBattleIds.fiftieth ||
battleId === campBattleIds.fiftyFirst ||
battleId === campBattleIds.fiftySecond ||
battleId === campBattleIds.fiftyThird
battleId === campBattleIds.fiftyThird ||
battleId === campBattleIds.fiftyFourth
) {
this.campaign = ensureCampaignRosterUnits(
[
@@ -8106,7 +8264,8 @@ export class CampScene extends Phaser.Scene {
...mengHuoThirdCaptureBonds,
...mengHuoFourthCaptureBonds,
...mengHuoFifthCaptureBonds,
...mengHuoSixthCaptureBonds
...mengHuoSixthCaptureBonds,
...mengHuoFinalCaptureBonds
]
);
this.report = this.campaign.firstBattleReport ?? this.report;
@@ -8744,6 +8903,9 @@ export class CampScene extends Phaser.Scene {
if (this.campaign?.step === 'baidi-entrustment-camp') {
return '백제성 유탁 후 군영';
}
if (battleId === campBattleIds.fiftyFourth) {
return '남중 평정 후 군영';
}
if (battleId === campBattleIds.fiftyThird) {
return '칠종칠금 6차전 후 군영';
}