Add Jing rear crisis chapter

This commit is contained in:
2026-06-23 17:12:07 +09:00
parent 6a55313492
commit 0736f07d1d
11 changed files with 896 additions and 49 deletions

View File

@@ -29,6 +29,7 @@ import {
hanzhongScoutRecruitUnits,
fanCastleBonds,
fanCastleSiegeBonds,
jingRearCrisisBonds,
jingDefenseBonds,
jingzhouRecruitBonds,
jingzhouRecruitUnits,
@@ -357,7 +358,8 @@ const campaignTimelineChapters: CampaignTimelineChapter[] = [
'thirty-eighth-battle-jing-defense',
'thirty-ninth-battle-fan-castle-vanguard',
'fortieth-battle-han-river-flood',
'forty-first-battle-fan-castle-siege'
'forty-first-battle-fan-castle-siege',
'forty-second-battle-jing-rear-crisis'
],
nextHints: ['왕업 선언', '번성 포위', '형주 위기']
}
@@ -404,7 +406,8 @@ const campBattleIds = {
thirtyEighth: 'thirty-eighth-battle-jing-defense',
thirtyNinth: 'thirty-ninth-battle-fan-castle-vanguard',
fortieth: 'fortieth-battle-han-river-flood',
fortyFirst: 'forty-first-battle-fan-castle-siege'
fortyFirst: 'forty-first-battle-fan-castle-siege',
fortySecond: 'forty-second-battle-jing-rear-crisis'
} as const;
const defaultRequiredSortieUnitIds = ['liu-bei'];
@@ -881,6 +884,20 @@ const sortieRulesByBattleId: Partial<Record<BattleScenarioId, SortieRuleDefiniti
{ unitId: 'ma-chao', reason: '방덕 기병과 조조군 북로 기병을 맞받아치는 강한 기병 대응 카드입니다.' }
],
note: '번성 공성전은 스물두 명 중 일곱 명만 출전합니다. 유비와 관우는 필수이며, 성벽 압박, 방덕 기병 대응, 강동 정찰 경계를 어떻게 나눌지 고르는 전투입니다.'
},
'forty-second-battle-jing-rear-crisis': {
maxUnits: 7,
requiredUnitIds: ['liu-bei', 'guan-yu'],
recommended: [
{ unitId: 'liu-bei', reason: '형주 후방을 다독일 큰 명분과 패배 조건의 중심입니다.' },
{ unitId: 'guan-yu', reason: '번성 전선과 형주 후방을 함께 묶는 핵심 장수입니다.' },
{ unitId: 'ma-liang', reason: '강릉 나루의 민심과 강동의 말투를 읽는 현지 참모입니다.' },
{ unitId: 'mi-zhu', reason: '창고와 군량선을 지키는 보급 축이며 후방 이벤트와 잘 맞물립니다.' },
{ unitId: 'zhao-yun', reason: '나루와 창고 사이를 빠르게 보강하는 기동 축입니다.' },
{ unitId: 'huang-quan', reason: '흔들리는 장수와 포로, 장부를 신중하게 판정하는 참모입니다.' },
{ unitId: 'wang-ping', reason: '숲길과 강변 초소의 지형을 읽어 후방 기습을 막기 좋습니다.' }
],
note: '강릉 나루 경계전은 스물두 명 중 일곱 명만 출전합니다. 유비와 관우는 필수이며, 후방 창고, 강동 정찰, 숲길 기습을 어떻게 막을지 고르는 전투입니다.'
}
};
@@ -4286,6 +4303,87 @@ const campDialogues: CampDialogue[] = [
rewardExp: 16
}
]
},
{
id: 'guan-mizhu-after-jing-rear',
title: '창고를 지키는 의',
availableAfterBattleIds: [campBattleIds.fortySecond],
unitIds: ['guan-yu', 'mi-zhu'],
bondId: 'guan-yu__mi-zhu_rear',
rewardExp: 46,
lines: [
'미축: 강동의 척후가 상선으로 들어오면 창고 문을 잠그는 것만으로는 부족합니다. 장부와 사람 마음이 함께 지켜져야 합니다.',
'관우: 군량이 흔들리면 성문 앞의 칼도 가벼워지오. 그대가 창고의 말과 숫자를 붙잡아 주시오.',
'미축: 상인 명부와 군량 표식을 새로 맞추겠습니다. 후방의 믿음이 앞의 진군을 버티게 할 것입니다.'
],
choices: [
{
id: 'reset-warehouse-ledgers',
label: '창고 장부를 다시 맞춘다',
response: '미축은 창고 장부와 선박 표식을 맞추었고, 강릉 후방의 보급 불안이 줄었습니다.',
rewardExp: 17
},
{
id: 'watch-merchant-boats',
label: '상선 감시를 늘린다',
response: '관우군은 상선의 출입 순서를 다시 세웠고, 위장 척후가 숨어들 여지가 조금 줄었습니다.',
rewardExp: 16
}
]
},
{
id: 'guan-maliang-after-jing-rear',
title: '부드러운 말의 칼',
availableAfterBattleIds: [campBattleIds.fortySecond],
unitIds: ['guan-yu', 'ma-liang'],
bondId: 'guan-yu__ma-liang_rear',
rewardExp: 44,
lines: [
'마량: 육손의 글은 예를 갖췄지만 지나치게 낮았습니다. 낮은 말은 때로 칼보다 더 깊이 들어옵니다.',
'관우: 예가 지나치면 뜻을 숨기는 법이오. 강동의 말과 배를 함께 살피시오.',
'마량: 강변 마을의 소문부터 다시 모으겠습니다. 후방의 균열은 작은 말에서 시작될 때가 많습니다.'
],
choices: [
{
id: 'read-lu-xun-letter',
label: '육손의 글을 분석한다',
response: '마량은 문장의 예와 속뜻을 나누어 읽었고, 관우군은 강동의 다음 수를 더 경계하게 되었습니다.',
rewardExp: 16
},
{
id: 'gather-river-rumors',
label: '강변 소문을 모은다',
response: '마량이 강변 마을의 소문을 정리하자, 나루와 창고를 잇는 경계망이 조금 더 촘촘해졌습니다.',
rewardExp: 15
}
]
},
{
id: 'liu-mizhu-after-jing-rear',
title: '백성과 군량',
availableAfterBattleIds: [campBattleIds.fortySecond],
unitIds: ['liu-bei', 'mi-zhu'],
bondId: 'liu-bei__mi-zhu_rear',
rewardExp: 42,
lines: [
'유비: 후방의 백성이 두려워하면 창고도 성문도 우리 편이 되지 못하오.',
'미축: 강동의 배가 물건을 싣고 와도 마음은 흔들 수 있습니다. 백성에게 먼저 설명하겠습니다.',
'유비: 군량을 지키되 백성의 삶을 누르지 마시오. 형주의 믿음을 잃으면 승리도 오래가지 못하오.'
],
choices: [
{
id: 'share-grain-with-villages',
label: '마을에 곡식을 나눈다',
response: '유비와 미축은 작은 곡식 창고를 열어 강변 마을의 불안을 달랬습니다.',
rewardExp: 15
},
{
id: 'explain-rear-orders',
label: '후방 군령을 설명한다',
response: '미축은 군령의 이유를 상인과 백성에게 설명했고, 형주 후방의 불신이 조금 누그러졌습니다.',
rewardExp: 14
}
]
}
];
@@ -5875,6 +5973,66 @@ const campVisits: CampVisitDefinition[] = [
itemRewards: ['콩 12']
}
]
},
{
id: 'jing-rear-warehouse-ledgers',
title: '강릉 창고 장부 대조',
location: '강릉 동쪽 창고',
availableAfterBattleIds: [campBattleIds.fortySecond],
bondId: 'guan-yu__mi-zhu_rear',
description: '관우와 미축이 강릉 창고의 장부와 상선 출입 표식을 대조하며, 위장 척후가 남긴 빈틈을 찾습니다.',
lines: [
'미축: 숫자는 거짓말을 못하지만, 숫자를 적는 사람은 흔들릴 수 있습니다. 장부의 빈칸이 수상합니다.',
'관우: 창고 문을 지키는 병사만 탓할 일이 아니오. 절차를 바꾸고 다시 익히게 하시오.',
'창고 관리들은 상선 표식과 곡식 자루 수를 다시 맞췄고, 병사들은 밤 출입 순서를 새로 배웠습니다.'
],
choices: [
{
id: 'audit-warehouse-marks',
label: '상선 표식을 대조한다',
response: '상선 표식이 정리되어 강동 척후가 같은 길로 다시 숨어들기 어려워졌습니다.',
bondExp: 36,
itemRewards: ['강릉 창고 장부 1']
},
{
id: 'seal-night-storehouses',
label: '야간 창고를 봉한다',
response: '밤 창고 출입이 제한되며 군량 손실이 줄고, 병사들의 경계 순서가 분명해졌습니다.',
bondExp: 34,
gold: 940,
itemRewards: ['콩 14']
}
]
},
{
id: 'jing-rear-river-rumors',
title: '강변 소문 수집',
location: '강릉 동쪽 나루 마을',
availableAfterBattleIds: [campBattleIds.fortySecond],
bondId: 'guan-yu__ma-liang_rear',
description: '관우와 마량이 나루 마을을 돌아보며, 강동의 문서와 상선이 남긴 말의 흐름을 모읍니다.',
lines: [
'마량: 배는 물길을 따라 오지만, 소문은 사람의 마음을 따라 먼저 들어옵니다.',
'관우: 성문 앞에서 이긴 뒤 백성의 귀를 잃으면 큰일이오. 작은 말도 모두 적어 두시오.',
'마을 어른들은 낯선 상인의 말투와 가격 변화를 조심스럽게 전했고, 정찰병은 나루 신호를 다시 맞췄습니다.'
],
choices: [
{
id: 'map-rumor-routes',
label: '소문의 길을 표시한다',
response: '마량은 소문이 퍼지는 길을 지도에 적었고, 강동의 다음 침투 후보지가 조금 더 선명해졌습니다.',
bondExp: 36,
itemRewards: ['강동 정찰 기록 1']
},
{
id: 'reassure-river-elders',
label: '마을 어른을 안심시킨다',
response: '관우군은 백성을 압박하지 않겠다고 약속했고, 나루 마을의 경계심이 조금 누그러졌습니다.',
bondExp: 34,
gold: 980,
itemRewards: ['상처약 5']
}
]
}
];
@@ -5961,7 +6119,7 @@ export class CampScene extends Phaser.Scene {
return;
}
if (battleId === campBattleIds.fortieth || battleId === campBattleIds.fortyFirst) {
if (battleId === campBattleIds.fortieth || battleId === campBattleIds.fortyFirst || battleId === campBattleIds.fortySecond) {
this.campaign = ensureCampaignRosterUnits(
[
...xuzhouRecruitUnits,
@@ -6004,7 +6162,8 @@ export class CampScene extends Phaser.Scene {
...jingDefenseBonds,
...fanCastleBonds,
...hanRiverFloodBonds,
...fanCastleSiegeBonds
...fanCastleSiegeBonds,
...jingRearCrisisBonds
]
);
this.report = this.campaign.firstBattleReport ?? this.report;
@@ -6639,6 +6798,9 @@ export class CampScene extends Phaser.Scene {
if (this.campaign?.step === 'hanzhong-king-camp') {
return '한중왕 즉위 준비 군영';
}
if (battleId === campBattleIds.fortySecond) {
return '강릉 나루 경계전 후 군영';
}
if (battleId === campBattleIds.fortyFirst) {
return '번성 공성전 후 군영';
}