Add fourth Meng Huo capture battle

This commit is contained in:
2026-06-23 23:04:23 +09:00
parent aa152d827c
commit b56f613e9f
12 changed files with 997 additions and 159 deletions

View File

@@ -28,6 +28,7 @@ import {
hanzhongScoutRecruitBonds,
hanzhongScoutRecruitUnits,
mengHuoThirdCaptureBonds,
mengHuoFourthCaptureBonds,
fanCastleBonds,
fanCastleSiegeBonds,
jingCollapseBonds,
@@ -413,7 +414,8 @@ const campaignTimelineChapters: CampaignTimelineChapter[] = [
'forty-seventh-battle-nanzhong-stabilization',
'forty-eighth-battle-meng-huo-main-force',
'forty-ninth-battle-meng-huo-second-capture',
'fiftieth-battle-meng-huo-third-capture'
'fiftieth-battle-meng-huo-third-capture',
'fifty-first-battle-meng-huo-fourth-capture'
],
nextHints: ['왕업 선언', '번성 포위', '형주 위기', '이릉 화공', '남중 안정', '맹획 회유', '칠종칠금']
}
@@ -469,7 +471,8 @@ const campBattleIds = {
fortySeventh: 'forty-seventh-battle-nanzhong-stabilization',
fortyEighth: 'forty-eighth-battle-meng-huo-main-force',
fortyNinth: 'forty-ninth-battle-meng-huo-second-capture',
fiftieth: 'fiftieth-battle-meng-huo-third-capture'
fiftieth: 'fiftieth-battle-meng-huo-third-capture',
fiftyFirst: 'fifty-first-battle-meng-huo-fourth-capture'
} as const;
const defaultRequiredSortieUnitIds = ['liu-bei'];
@@ -1072,6 +1075,20 @@ const sortieRulesByBattleId: Partial<Record<BattleScenarioId, SortieRuleDefiniti
{ unitId: 'huang-zhong', reason: '고지 궁병과 독천 주술사를 안전하게 견제합니다.' }
],
note: '칠종칠금 3차전은 맹획뿐 아니라 그를 따르는 호족들이 보는 싸움입니다. 제갈량을 중심으로 회유 문장, 장부, 산길 판단, 돌격 봉쇄를 균형 있게 배치하십시오.'
},
'fifty-first-battle-meng-huo-fourth-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: 'ma-dai', reason: '마초와 함께 회유 퇴로 주변의 빠른 차단과 회수를 맡습니다.' }
],
note: '칠종칠금 4차전은 이전 군영의 호족 회유 선택이 전장 목표로 바뀌는 전투입니다. 생포만 노리지 말고, 회유 퇴로와 보증 장부를 지킬 편성을 고르십시오.'
}
};
@@ -5290,6 +5307,87 @@ const campDialogues: CampDialogue[] = [
rewardExp: 19
}
]
},
{
id: 'fourth-capture-zhuge-maliang-amnesty',
title: '네 번째 석방의 조건',
availableAfterBattleIds: [campBattleIds.fiftyFirst],
unitIds: ['zhuge-liang', 'ma-liang'],
bondId: 'zhuge-liang__ma-liang_fourth-capture',
rewardExp: 64,
lines: [
'마량: 이번에는 물러난 호족들이 직접 회유 퇴로가 지켜졌다고 말할 것입니다.',
'제갈량: 그 말이 남중 안에서 맹획의 말과 겨루게 됩니다. 네 번째 석방은 약함이 아니라 약속을 지키는 힘이어야 합니다.',
'마량: 다음에는 강경파가 그 말을 끊으려 할 것입니다. 먼저 누구의 입을 열지 정해야겠습니다.'
],
choices: [
{
id: 'record-fourth-amnesty',
label: '네 번째 보증문을 남긴다',
response: '마량은 회유 퇴로를 통과한 호족들의 증언을 문서로 적었고, 제갈량은 다음 석방의 조건을 분명히 했습니다.',
rewardExp: 23
},
{
id: 'prepare-hardliner-questions',
label: '강경파 질문을 준비한다',
response: '제갈량은 끝까지 싸우려는 호족에게 던질 질문을 정했고, 마량은 마을 피해와 포로 귀환 기록을 함께 묶었습니다.',
rewardExp: 22
}
]
},
{
id: 'fourth-capture-huangquan-wangping-ledger',
title: '퇴로와 장부의 보증',
availableAfterBattleIds: [campBattleIds.fiftyFirst],
unitIds: ['huang-quan', 'wang-ping'],
bondId: 'huang-quan__wang-ping_fourth-capture',
rewardExp: 60,
lines: [
'황권: 회유 퇴로를 열어 두었으니, 돌아간 자가 다시 창을 들면 장부가 먼저 흔들립니다.',
'왕평: 그래서 길도 장부처럼 관리해야 합니다. 누구에게 열린 길인지, 어느 마을을 지나지 않는지 표시해야 합니다.',
'황권: 다음 전투에서는 그 보증을 더 엄격히 봐야겠습니다.'
],
choices: [
{
id: 'seal-amnesty-ledger',
label: '보증 장부를 봉한다',
response: '황권은 회유 퇴로를 지난 이름들을 봉인했고, 왕평은 그들이 다시 병력으로 합류하지 못할 길을 표시했습니다.',
rewardExp: 21
},
{
id: 'separate-safe-roads',
label: '안전 길목을 분리한다',
response: '왕평은 마을길과 군용길을 다시 나누었고, 황권은 병사들이 보증 길목을 짓밟지 않도록 명령서를 적었습니다.',
rewardExp: 20
}
]
},
{
id: 'fourth-capture-machao-madai-pursuit',
title: '추격하지 않는 속도',
availableAfterBattleIds: [campBattleIds.fiftyFirst],
unitIds: ['ma-chao', 'ma-dai'],
bondId: 'ma-chao__ma-dai_fourth-capture',
rewardExp: 58,
lines: [
'마대: 형님, 이번에는 달려가서 베는 것보다 멈추는 것이 더 어려웠습니다.',
'마초: 남중의 기병은 밀어붙여야 무너진다. 하지만 퇴로를 밟으면 우리가 이긴 전장이 다시 적지가 된다.',
'마대: 다음에는 빠르게 막되, 물러나는 길은 더 분명히 남기겠습니다.'
],
choices: [
{
id: 'mark-pursuit-line',
label: '추격 금지선을 긋는다',
response: '마초와 마대는 기병이 넘지 말아야 할 회유선을 정했고, 빠른 압박과 절제를 함께 훈련했습니다.',
rewardExp: 20
},
{
id: 'train-cavalry-recall',
label: '기병 회수 신호를 맞춘다',
response: '마대는 회수 신호를 짧게 정했고, 마초는 돌격대가 신호에 맞춰 멈추는 훈련을 반복시켰습니다.',
rewardExp: 19
}
]
}
];
@@ -7478,6 +7576,65 @@ const campVisits: CampVisitDefinition[] = [
itemRewards: ['상처약 10']
}
]
},
{
id: 'fourth-capture-ledger-seal',
title: '보증 장부 봉인',
location: '남중 포로장',
availableAfterBattleIds: [campBattleIds.fiftyFirst],
bondId: 'huang-quan__wang-ping_fourth-capture',
description: '황권과 왕평이 네 번째 생포 뒤 회유 퇴로를 지나간 호족과 포로의 이름을 따로 봉인합니다.',
lines: [
'황권: 이 장부는 항복한 자를 벌하기 위한 것이 아니라, 약속을 지키기 위한 증거입니다.',
'왕평: 길목마다 같은 표식을 세우겠습니다. 병사도 호족도 이 선을 넘지 말아야 합니다.',
'포로장 한가운데에는 봉인된 장부와 회유 퇴로 표식이 함께 놓였습니다.'
],
choices: [
{
id: 'seal-clan-guarantees',
label: '호족 보증을 봉한다',
response: '황권은 보증 장부를 봉했고, 왕평은 퇴로 표식을 각 길목에 나누어 보냈습니다.',
bondExp: 50,
itemRewards: ['호족 보증 장부 1']
},
{
id: 'mark-returning-families',
label: '돌아간 가족을 표시한다',
response: '왕평은 귀환한 가족들의 마을을 표시했고, 황권은 병사들이 그 마을을 징발하지 못하게 했습니다.',
bondExp: 48,
gold: 1680,
itemRewards: ['회유 퇴로 표식 1']
}
]
},
{
id: 'fourth-capture-fire-forts',
title: '화덕 요새의 불씨',
location: '남중 화덕 요새',
availableAfterBattleIds: [campBattleIds.fiftyFirst],
bondId: 'ma-chao__ma-dai_fourth-capture',
description: '마초와 마대가 등갑병의 화덕 요새를 살펴, 다음 전투에서 불씨가 마을로 번지지 않게 정리합니다.',
lines: [
'마초: 화덕은 무기로도 쓰이고 겁주는 표식으로도 쓰이는군.',
'마대: 불씨를 모두 꺼 버리면 산마을의 밤도 위험합니다. 쓸 곳과 막을 곳을 나누겠습니다.',
'요새 주변에는 꺼진 화덕과 남겨 둘 신호불이 따로 표시되었습니다.'
],
choices: [
{
id: 'separate-war-fires',
label: '전투 화덕을 분리한다',
response: '마초는 전투용 화덕을 치웠고, 마대는 마을 신호불만 남겨 병사들이 혼동하지 않게 했습니다.',
bondExp: 46,
itemRewards: ['상처약 12']
},
{
id: 'train-fire-breaks',
label: '방화선을 훈련한다',
response: '마대는 숲과 마을 사이의 방화선을 표시했고, 마초는 기병이 불길을 피해 우회하는 길을 익혔습니다.',
bondExp: 48,
itemRewards: ['탁주 4']
}
]
}
];
@@ -7576,7 +7733,8 @@ export class CampScene extends Phaser.Scene {
battleId === campBattleIds.fortySeventh ||
battleId === campBattleIds.fortyEighth ||
battleId === campBattleIds.fortyNinth ||
battleId === campBattleIds.fiftieth
battleId === campBattleIds.fiftieth ||
battleId === campBattleIds.fiftyFirst
) {
this.campaign = ensureCampaignRosterUnits(
[
@@ -7629,7 +7787,8 @@ export class CampScene extends Phaser.Scene {
...nanzhongRecoveryBonds,
...mengHuoPacificationBonds,
...mengHuoSecondCaptureBonds,
...mengHuoThirdCaptureBonds
...mengHuoThirdCaptureBonds,
...mengHuoFourthCaptureBonds
]
);
this.report = this.campaign.firstBattleReport ?? this.report;
@@ -8267,6 +8426,9 @@ export class CampScene extends Phaser.Scene {
if (this.campaign?.step === 'baidi-entrustment-camp') {
return '백제성 유탁 후 군영';
}
if (battleId === campBattleIds.fiftyFirst) {
return '칠종칠금 4차전 후 군영';
}
if (battleId === campBattleIds.fiftieth) {
return '칠종칠금 3차전 후 군영';
}