Add third Meng Huo capture battle

This commit is contained in:
2026-06-23 22:01:50 +09:00
parent f4c50c7fca
commit aa152d827c
11 changed files with 829 additions and 58 deletions

View File

@@ -27,6 +27,7 @@ import {
hanzhongMainRecruitUnits,
hanzhongScoutRecruitBonds,
hanzhongScoutRecruitUnits,
mengHuoThirdCaptureBonds,
fanCastleBonds,
fanCastleSiegeBonds,
jingCollapseBonds,
@@ -411,7 +412,8 @@ const campaignTimelineChapters: CampaignTimelineChapter[] = [
'forty-sixth-battle-yiling-fire',
'forty-seventh-battle-nanzhong-stabilization',
'forty-eighth-battle-meng-huo-main-force',
'forty-ninth-battle-meng-huo-second-capture'
'forty-ninth-battle-meng-huo-second-capture',
'fiftieth-battle-meng-huo-third-capture'
],
nextHints: ['왕업 선언', '번성 포위', '형주 위기', '이릉 화공', '남중 안정', '맹획 회유', '칠종칠금']
}
@@ -466,7 +468,8 @@ const campBattleIds = {
fortySixth: 'forty-sixth-battle-yiling-fire',
fortySeventh: 'forty-seventh-battle-nanzhong-stabilization',
fortyEighth: 'forty-eighth-battle-meng-huo-main-force',
fortyNinth: 'forty-ninth-battle-meng-huo-second-capture'
fortyNinth: 'forty-ninth-battle-meng-huo-second-capture',
fiftieth: 'fiftieth-battle-meng-huo-third-capture'
} as const;
const defaultRequiredSortieUnitIds = ['liu-bei'];
@@ -1055,6 +1058,20 @@ const sortieRulesByBattleId: Partial<Record<BattleScenarioId, SortieRuleDefiniti
{ unitId: 'ma-chao', reason: '맹획의 측면 돌파와 재집결 기병을 강하게 묶어 둡니다.' }
],
note: '칠종칠금 2차전은 제갈량이 필수이며, 맹획을 다시 잡아도 마을과 포로장이 흔들리지 않게 지키는 회유전입니다. 산길 판단, 장부 관리, 고지 제압을 함께 고르십시오.'
},
'fiftieth-battle-meng-huo-third-capture': {
maxUnits: 7,
requiredUnitIds: ['zhuge-liang'],
recommended: [
{ unitId: 'zhuge-liang', reason: '세 번째 생포와 호족 회유 명분을 세우는 필수 지휘관입니다.' },
{ unitId: 'ma-liang', reason: '흔들리는 호족에게 회유 문장을 전하는 핵심 참모입니다.' },
{ unitId: 'huang-quan', reason: '포로와 군량 장부를 안정시켜 촉한군의 군율을 증명합니다.' },
{ unitId: 'wang-ping', reason: '깊은 산채와 늪지 길목을 읽어 호족 매복을 끊습니다.' },
{ unitId: 'zhao-yun', reason: '맹수 돌격을 받아 내며 생포망의 중심을 지킵니다.' },
{ unitId: 'ma-chao', reason: '남만 기병과 축융 선봉의 측면 돌파를 강하게 묶습니다.' },
{ unitId: 'huang-zhong', reason: '고지 궁병과 독천 주술사를 안전하게 견제합니다.' }
],
note: '칠종칠금 3차전은 맹획뿐 아니라 그를 따르는 호족들이 보는 싸움입니다. 제갈량을 중심으로 회유 문장, 장부, 산길 판단, 돌격 봉쇄를 균형 있게 배치하십시오.'
}
};
@@ -5192,6 +5209,87 @@ const campDialogues: CampDialogue[] = [
rewardExp: 18
}
]
},
{
id: 'third-capture-zhuge-maliang-clans',
title: '호족에게 남길 말',
availableAfterBattleIds: [campBattleIds.fiftieth],
unitIds: ['zhuge-liang', 'ma-liang'],
bondId: 'zhuge-liang__ma-liang_third-capture',
rewardExp: 62,
lines: [
'마량: 세 번째로 맹획을 놓아 보내면, 이제 호족들이 먼저 우리 뜻을 재기 시작할 것입니다.',
'제갈량: 그래서 말이 더 중요합니다. 맹획을 굴복시키는 것이 아니라 남중이 스스로 촉한의 질서를 택하게 해야 합니다.',
'마량: 호족마다 받아들일 말이 다를 것입니다. 다음 회의에서는 누구를 먼저 달랠지 정해야겠습니다.'
],
choices: [
{
id: 'write-clan-amnesty',
label: '호족 설득문을 쓴다',
response: '마량은 각 호족에게 보낼 문장을 나누어 적었고, 제갈량은 회유와 처벌의 기준을 더 분명히 했습니다.',
rewardExp: 22
},
{
id: 'prepare-clan-council',
label: '호족 회의를 준비한다',
response: '제갈량은 장수들에게 다음 전투 전 회의에서 남중 호족의 마음을 먼저 읽어야 한다고 지시했습니다.',
rewardExp: 21
}
]
},
{
id: 'third-capture-huangquan-wangping-order',
title: '장부와 길목의 질서',
availableAfterBattleIds: [campBattleIds.fiftieth],
unitIds: ['huang-quan', 'wang-ping'],
bondId: 'huang-quan__wang-ping_third-capture',
rewardExp: 58,
lines: [
'황권: 세 번의 생포 동안 포로 명부가 흐트러지지 않았습니다. 이 장부가 호족들을 설득할 증거가 됩니다.',
'왕평: 길목도 같습니다. 우리가 막은 길보다 열어 둔 길을 더 오래 기억할 것입니다.',
'황권: 다음에는 전투 전에 어느 길을 열어 둘지부터 정해야겠습니다.'
],
choices: [
{
id: 'compare-captive-ledgers',
label: '세 장부를 대조한다',
response: '황권은 세 번의 포로 명부를 대조했고, 왕평은 귀환 길목이 반복해서 지켜졌음을 지도에 남겼습니다.',
rewardExp: 20
},
{
id: 'mark-open-routes',
label: '열어 둘 길을 표시한다',
response: '왕평은 다음 전투에서 일부 호족이 물러날 길을 표시했고, 황권은 그 길의 군량 지급 기준을 적었습니다.',
rewardExp: 19
}
]
},
{
id: 'third-capture-zhaoyun-machao-restraint',
title: '세 번째 절제',
availableAfterBattleIds: [campBattleIds.fiftieth],
unitIds: ['zhao-yun', 'ma-chao'],
bondId: 'zhao-yun__ma-chao_third-capture',
rewardExp: 58,
lines: [
'마초: 세 번이나 잡고도 베지 않는 싸움은 생각보다 더 힘들군.',
'조운: 칼을 멈추는 것도 명령을 지키는 일입니다. 남중의 눈이 우리를 보고 있으니까요.',
'마초: 다음에도 돌격을 막아야 한다면, 이번처럼 잡되 무너뜨리지는 않겠소.'
],
choices: [
{
id: 'restrain-third-charge',
label: '돌격 억제선을 정한다',
response: '조운과 마초는 추격과 포위의 경계선을 다시 정해, 병사들이 분노로 깊이 파고들지 않게 했습니다.',
rewardExp: 20
},
{
id: 'share-cavalry-lessons',
label: '기병 운용을 나눈다',
response: '마초는 남만 기병의 습성을 설명했고, 조운은 그 돌격을 받아 내는 간격을 병사들에게 익히게 했습니다.',
rewardExp: 19
}
]
}
];
@@ -7321,6 +7419,65 @@ const campVisits: CampVisitDefinition[] = [
itemRewards: ['칠종칠금 회유문 1']
}
]
},
{
id: 'third-capture-clan-council',
title: '호족 회유 회의',
location: '남중 임시 회의장',
availableAfterBattleIds: [campBattleIds.fiftieth],
bondId: 'zhuge-liang__ma-liang_third-capture',
description: '제갈량과 마량이 세 번째 생포 뒤 흔들리는 호족들에게 보낼 설득문과 다음 회의의 우선순위를 정합니다.',
lines: [
'마량: 대래동주와 아회남의 말이 달라졌습니다. 누구를 먼저 달래느냐에 따라 다음 산채의 문이 달라질 것입니다.',
'제갈량: 항복을 구걸하지는 않습니다. 다만 길을 남겨 두어 스스로 돌아오게 해야 합니다.',
'회의장 한쪽에는 호족별 이름표와 회유 문서가 나란히 놓였습니다.'
],
choices: [
{
id: 'prioritize-wavering-clans',
label: '흔들리는 호족을 먼저 본다',
response: '마량은 아회남과 주변 촌장에게 보낼 문서를 먼저 정리했고, 제갈량은 그들에게 보낼 사자를 골랐습니다.',
bondExp: 48,
itemRewards: ['남중 호족 설득문 1']
},
{
id: 'separate-hardliners',
label: '강경파를 분리한다',
response: '제갈량은 끝까지 선동하는 호족과 달랠 수 있는 호족을 나누었고, 마량은 다음 회의의 질문 목록을 적었습니다.',
bondExp: 46,
gold: 1520,
itemRewards: ['세 번째 회유 장부 1']
}
]
},
{
id: 'third-capture-open-routes',
title: '열어 둔 산길',
location: '남중 산채 길목',
availableAfterBattleIds: [campBattleIds.fiftieth],
bondId: 'huang-quan__wang-ping_third-capture',
description: '황권과 왕평이 세 번의 전투 동안 닫지 않은 귀환로를 정리해, 다음 전투의 회유 목표로 삼을 길을 고릅니다.',
lines: [
'왕평: 이 길을 열어 두면 호족 일부가 싸움을 멈추고 물러날 수 있습니다. 대신 포위는 느슨해집니다.',
'황권: 그렇다면 그 길로 나간 자가 다시 창을 들지 않도록 장부와 보증이 필요합니다.',
'산채 길목에는 닫을 길과 열어 둘 길이 서로 다른 색으로 표시되었습니다.'
],
choices: [
{
id: 'leave-amnesty-path',
label: '회유 퇴로를 남긴다',
response: '왕평은 마을로 돌아갈 낮은 길을 표시했고, 황권은 그 길로 돌아간 자의 이름을 따로 적기로 했습니다.',
bondExp: 46,
itemRewards: ['남중 산길 지도 1']
},
{
id: 'guard-captive-road',
label: '포로 귀환로를 지킨다',
response: '황권은 포로 귀환 명부를 갱신했고, 왕평은 병사들이 그 길을 막지 않도록 표식을 세웠습니다.',
bondExp: 48,
itemRewards: ['상처약 10']
}
]
}
];
@@ -7418,7 +7575,8 @@ export class CampScene extends Phaser.Scene {
battleId === campBattleIds.fortySixth ||
battleId === campBattleIds.fortySeventh ||
battleId === campBattleIds.fortyEighth ||
battleId === campBattleIds.fortyNinth
battleId === campBattleIds.fortyNinth ||
battleId === campBattleIds.fiftieth
) {
this.campaign = ensureCampaignRosterUnits(
[
@@ -7470,7 +7628,8 @@ export class CampScene extends Phaser.Scene {
...yilingFireBonds,
...nanzhongRecoveryBonds,
...mengHuoPacificationBonds,
...mengHuoSecondCaptureBonds
...mengHuoSecondCaptureBonds,
...mengHuoThirdCaptureBonds
]
);
this.report = this.campaign.firstBattleReport ?? this.report;
@@ -8108,6 +8267,9 @@ export class CampScene extends Phaser.Scene {
if (this.campaign?.step === 'baidi-entrustment-camp') {
return '백제성 유탁 후 군영';
}
if (battleId === campBattleIds.fiftieth) {
return '칠종칠금 3차전 후 군영';
}
if (battleId === campBattleIds.fortyNinth) {
return '칠종칠금 2차전 후 군영';
}