Add fifth Meng Huo capture battle

This commit is contained in:
2026-06-23 23:38:57 +09:00
parent b56f613e9f
commit 189766491f
11 changed files with 867 additions and 63 deletions

View File

@@ -27,8 +27,9 @@ import {
hanzhongMainRecruitUnits,
hanzhongScoutRecruitBonds,
hanzhongScoutRecruitUnits,
mengHuoThirdCaptureBonds,
mengHuoFourthCaptureBonds,
mengHuoFifthCaptureBonds,
mengHuoThirdCaptureBonds,
fanCastleBonds,
fanCastleSiegeBonds,
jingCollapseBonds,
@@ -415,7 +416,8 @@ const campaignTimelineChapters: CampaignTimelineChapter[] = [
'forty-eighth-battle-meng-huo-main-force',
'forty-ninth-battle-meng-huo-second-capture',
'fiftieth-battle-meng-huo-third-capture',
'fifty-first-battle-meng-huo-fourth-capture'
'fifty-first-battle-meng-huo-fourth-capture',
'fifty-second-battle-meng-huo-fifth-capture'
],
nextHints: ['왕업 선언', '번성 포위', '형주 위기', '이릉 화공', '남중 안정', '맹획 회유', '칠종칠금']
}
@@ -472,7 +474,8 @@ const campBattleIds = {
fortyEighth: 'forty-eighth-battle-meng-huo-main-force',
fortyNinth: 'forty-ninth-battle-meng-huo-second-capture',
fiftieth: 'fiftieth-battle-meng-huo-third-capture',
fiftyFirst: 'fifty-first-battle-meng-huo-fourth-capture'
fiftyFirst: 'fifty-first-battle-meng-huo-fourth-capture',
fiftySecond: 'fifty-second-battle-meng-huo-fifth-capture'
} as const;
const defaultRequiredSortieUnitIds = ['liu-bei'];
@@ -1089,6 +1092,20 @@ const sortieRulesByBattleId: Partial<Record<BattleScenarioId, SortieRuleDefiniti
{ unitId: 'ma-dai', reason: '마초와 함께 회유 퇴로 주변의 빠른 차단과 회수를 맡습니다.' }
],
note: '칠종칠금 4차전은 이전 군영의 호족 회유 선택이 전장 목표로 바뀌는 전투입니다. 생포만 노리지 말고, 회유 퇴로와 보증 장부를 지킬 편성을 고르십시오.'
},
'fifty-second-battle-meng-huo-fifth-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: 'huang-zhong', reason: '고지 궁병과 제사장을 억제해 강경파 요새 공략을 안정시킵니다.' },
{ unitId: 'ma-dai', reason: '마초와 다른 빠른 우회로를 맡아 분리로 주변 추격선을 끊습니다.' }
],
note: '칠종칠금 5차전은 맹획 생포에 더해 강경파 호족을 본대에서 떼어 내는 전투입니다. 마을 회유, 장부 분리, 퇴로 유지, 추격 억제를 맡을 장수를 균형 있게 고르십시오.'
}
};
@@ -5388,6 +5405,87 @@ const campDialogues: CampDialogue[] = [
rewardExp: 19
}
]
},
{
id: 'fifth-capture-zhuge-huangquan-separation',
title: '갈라진 이름의 장부',
availableAfterBattleIds: [campBattleIds.fiftySecond],
unitIds: ['zhuge-liang', 'huang-quan'],
bondId: 'zhuge-liang__huang-quan_fifth-capture',
rewardExp: 66,
lines: [
'황권: 다섯 번째 생포 뒤에는 끝까지 싸운 자와 물러난 자의 이름을 더 엄격히 나누어야 합니다.',
'제갈량: 처벌을 위한 장부가 되면 다시 원한이 됩니다. 약속을 지킨 자를 보호하는 장부로 남겨야 합니다.',
'황권: 그렇다면 강경파를 누르되, 돌아선 자의 길은 먼저 지켜 두겠습니다.'
],
choices: [
{
id: 'write-hardliner-ledger',
label: '강경파 장부를 나눈다',
response: '황권은 강경파와 회유파의 이름을 따로 적었고, 제갈량은 석방의 기준을 병사들에게 다시 알렸습니다.',
rewardExp: 23
},
{
id: 'protect-returning-clans',
label: '돌아선 호족을 보호한다',
response: '제갈량은 물러난 호족의 마을을 함부로 징발하지 말라 명했고, 황권은 그 이름을 보증 장부에 옮겼습니다.',
rewardExp: 22
}
]
},
{
id: 'fifth-capture-maliang-wangping-routes',
title: '말이 닿는 길',
availableAfterBattleIds: [campBattleIds.fiftySecond],
unitIds: ['ma-liang', 'wang-ping'],
bondId: 'ma-liang__wang-ping_fifth-capture',
rewardExp: 62,
lines: [
'마량: 말만 남기면 길이 막히고, 길만 열면 뜻이 흐려집니다.',
'왕평: 그래서 이번 지도에는 말이 닿을 마을과 군대가 지나갈 길을 따로 그려야 합니다.',
'마량: 다음 싸움에서는 그 지도가 곧 회유의 증거가 되겠습니다.'
],
choices: [
{
id: 'copy-amnesty-routes',
label: '회유 길을 베낀다',
response: '왕평은 낮은 길을 다시 그렸고, 마량은 그 길마다 붙일 짧은 문장을 적었습니다.',
rewardExp: 21
},
{
id: 'separate-village-messages',
label: '마을별 문구를 나눈다',
response: '마량은 마을마다 다른 두려움을 적었고, 왕평은 그 마을로 이어지는 좁은 길을 표시했습니다.',
rewardExp: 20
}
]
},
{
id: 'fifth-capture-zhaoyun-huangzhong-containment',
title: '멀리서 막는 추격',
availableAfterBattleIds: [campBattleIds.fiftySecond],
unitIds: ['zhao-yun', 'huang-zhong'],
bondId: 'zhao-yun__huang-zhong_fifth-capture',
rewardExp: 60,
lines: [
'황충: 이번 강경파는 가까이 붙으면 오히려 회유 길을 흔들었소.',
'조운: 그래서 먼저 끊어야 했습니다. 칼끝이 아니라 거리로 막는 싸움이었습니다.',
'황충: 다음에도 고지와 중앙을 함께 잡아야 맹획을 잡되 남중을 잃지 않겠소.'
],
choices: [
{
id: 'train-distant-containment',
label: '원거리 억제선을 훈련한다',
response: '황충은 고지 사격선을 정했고, 조운은 그 앞을 지키는 간격을 병사들에게 익혔습니다.',
rewardExp: 20
},
{
id: 'hold-center-and-hill',
label: '중앙과 고지를 나눈다',
response: '조운은 중앙 방어선을 맡고, 황충은 고지 궁병을 견제할 위치를 다시 표시했습니다.',
rewardExp: 20
}
]
}
];
@@ -7635,6 +7733,65 @@ const campVisits: CampVisitDefinition[] = [
itemRewards: ['탁주 4']
}
]
},
{
id: 'fifth-capture-hardliner-ledger',
title: '강경파 분리 장부',
location: '남중 포로장',
availableAfterBattleIds: [campBattleIds.fiftySecond],
bondId: 'zhuge-liang__huang-quan_fifth-capture',
description: '제갈량과 황권이 다섯 번째 생포 뒤 강경파와 회유파의 이름을 나누어 기록합니다.',
lines: [
'황권: 같은 남중 사람이라도 오늘부터 장부의 의미가 달라집니다.',
'제갈량: 끝까지 싸운 자를 적는 일보다, 돌아선 자를 지키는 일이 먼저입니다.',
'포로장 한편에는 강경파 분리 장부와 돌아선 호족의 보증문이 나뉘어 놓였습니다.'
],
choices: [
{
id: 'seal-hardliner-list',
label: '강경파 명부를 봉한다',
response: '황권은 강경파 명부를 따로 봉했고, 제갈량은 남은 호족에게 다시 석방의 조건을 알렸습니다.',
bondExp: 52,
itemRewards: ['강경파 분리 장부 1']
},
{
id: 'protect-amnesty-witnesses',
label: '회유 증인을 보호한다',
response: '제갈량은 회유 길을 통과한 증인을 보호하게 했고, 황권은 그 이름을 보증 장부에 더했습니다.',
bondExp: 50,
gold: 1760,
itemRewards: ['남중 회유 깃발 1']
}
]
},
{
id: 'fifth-capture-amnesty-banners',
title: '회유 깃발 정비',
location: '남중 죽림 길목',
availableAfterBattleIds: [campBattleIds.fiftySecond],
bondId: 'ma-liang__wang-ping_fifth-capture',
description: '마량과 왕평이 다음 전투에서 물러날 호족이 알아볼 회유 깃발과 길목 표식을 정비합니다.',
lines: [
'마량: 글을 읽지 못하는 자도 알아볼 표식이 필요합니다.',
'왕평: 낮은 길에는 흰 깃발, 군용길에는 검은 표식을 세우겠습니다.',
'죽림 길목마다 회유 깃발과 군용 표식이 서로 다른 방향을 가리키기 시작했습니다.'
],
choices: [
{
id: 'raise-amnesty-banners',
label: '회유 깃발을 세운다',
response: '마량은 짧은 회유문을 깃발에 달았고, 왕평은 물러날 길목에 같은 표식을 반복해 세웠습니다.',
bondExp: 50,
itemRewards: ['콩 12']
},
{
id: 'separate-war-paths',
label: '군용길을 분리한다',
response: '왕평은 군대가 지나갈 길을 따로 표시했고, 마량은 그 길이 마을로 이어지지 않게 문구를 고쳤습니다.',
bondExp: 48,
itemRewards: ['상처약 12']
}
]
}
];
@@ -7734,7 +7891,8 @@ export class CampScene extends Phaser.Scene {
battleId === campBattleIds.fortyEighth ||
battleId === campBattleIds.fortyNinth ||
battleId === campBattleIds.fiftieth ||
battleId === campBattleIds.fiftyFirst
battleId === campBattleIds.fiftyFirst ||
battleId === campBattleIds.fiftySecond
) {
this.campaign = ensureCampaignRosterUnits(
[
@@ -7788,7 +7946,8 @@ export class CampScene extends Phaser.Scene {
...mengHuoPacificationBonds,
...mengHuoSecondCaptureBonds,
...mengHuoThirdCaptureBonds,
...mengHuoFourthCaptureBonds
...mengHuoFourthCaptureBonds,
...mengHuoFifthCaptureBonds
]
);
this.report = this.campaign.firstBattleReport ?? this.report;
@@ -8426,6 +8585,9 @@ export class CampScene extends Phaser.Scene {
if (this.campaign?.step === 'baidi-entrustment-camp') {
return '백제성 유탁 후 군영';
}
if (battleId === campBattleIds.fiftySecond) {
return '칠종칠금 5차전 후 군영';
}
if (battleId === campBattleIds.fiftyFirst) {
return '칠종칠금 4차전 후 군영';
}