Add Luofeng Slope ambush chapter

This commit is contained in:
2026-06-23 10:09:41 +09:00
parent cc6365d5ba
commit 0872c584b4
11 changed files with 1250 additions and 34 deletions

View File

@@ -316,7 +316,8 @@ const campaignTimelineChapters: CampaignTimelineChapter[] = [
'twenty-sixth-battle-changsha-veteran',
'twenty-seventh-battle-yizhou-relief-road',
'twenty-eighth-battle-fu-pass-entry',
'twenty-ninth-battle-luo-outer-wall'
'twenty-ninth-battle-luo-outer-wall',
'thirtieth-battle-luofeng-ambush'
],
nextHints: ['형주 방위', '익주 진입', '방통·법정 합류']
},
@@ -359,7 +360,8 @@ const campBattleIds = {
twentySixth: 'twenty-sixth-battle-changsha-veteran',
twentySeventh: 'twenty-seventh-battle-yizhou-relief-road',
twentyEighth: 'twenty-eighth-battle-fu-pass-entry',
twentyNinth: 'twenty-ninth-battle-luo-outer-wall'
twentyNinth: 'twenty-ninth-battle-luo-outer-wall',
thirtieth: 'thirtieth-battle-luofeng-ambush'
} as const;
const requiredSortieUnitIds = new Set(['liu-bei']);
@@ -682,6 +684,18 @@ const sortieRulesByBattleId: Partial<Record<BattleScenarioId, SortieRuleDefiniti
{ unitId: 'zhao-yun', reason: '넓어진 외곽 맵에서 정찰과 기병 대응을 맡기 좋습니다.' }
],
note: '낙성 외곽전은 열다섯 명 중 여섯 명만 출전합니다. 법정을 데려가면 설득과 정보가 강해지고, 무장을 더 넣으면 전열이 단단해지는 선택지가 생깁니다.'
},
'thirtieth-battle-luofeng-ambush': {
maxUnits: 6,
recommended: [
{ unitId: 'liu-bei', reason: '유비가 살아 남아야 익주 백성에게 명분을 이어갈 수 있습니다.' },
{ unitId: 'pang-tong', reason: '낙봉파 매복을 읽는 핵심 책사이며 생존 조건의 중심입니다.' },
{ unitId: 'wu-yi', reason: '오의는 낙성 안쪽 길과 고지 매복 위치를 알고 있는 새 합류 장수입니다.' },
{ unitId: 'fa-zheng', reason: '법정은 익주 장수들의 심리와 장임의 방어 습관을 꿰뚫습니다.' },
{ unitId: 'zhao-yun', reason: '좁은 길에서 급히 방통을 보호하거나 궁병을 끊는 기동력이 좋습니다.' },
{ unitId: 'huang-zhong', reason: '고지 궁병과 매복 부대를 안정적으로 견제하는 원거리 전력입니다.' }
],
note: '낙봉파 매복전은 열여섯 명 중 여섯 명만 출전합니다. 오의가 새로 후보에 들어오며, 방통 생존과 매복 대응 때문에 책사와 기동 무장 사이의 선택이 더 중요해집니다.'
}
};
@@ -3115,6 +3129,87 @@ const campDialogues: CampDialogue[] = [
rewardExp: 10
}
]
},
{
id: 'liu-pang-after-luofeng',
title: '살아 돌아온 봉추',
availableAfterBattleIds: [campBattleIds.thirtieth],
unitIds: ['liu-bei', 'pang-tong'],
bondId: 'liu-bei__pang-tong',
rewardExp: 34,
lines: [
'유비: 낙봉파의 화살이 그대에게 닿을 뻔했소. 오늘 그대를 잃었다면 익주 길은 물론 내 마음도 크게 꺾였을 것이오.',
'방통: 주공께서 길을 의심해 주셨기에 제가 길 위에서 목숨을 붙였습니다. 이제는 빠른 계책보다 오래 버틸 계책을 먼저 보겠습니다.',
'유비: 그대의 말이 오늘 군영의 경계가 되었소. 다음 낙성 본성 앞에서도 그 눈을 믿겠소.'
],
choices: [
{
id: 'thank-pang-tong-survival-luofeng',
label: '방통의 생환을 기뻐한다',
response: '유비가 직접 술잔을 낮추자 방통도 장난스러운 미소를 거두고 다음 전장의 방비도를 다시 펼쳤습니다.',
rewardExp: 13
},
{
id: 'ask-pang-tong-next-risk-luofeng',
label: '다음 위험을 묻는다',
response: '방통은 낙성 본성의 성문, 물길, 민심을 한 줄로 엮어 보이며 무리한 돌파를 피해야 한다고 답했습니다.',
rewardExp: 12
}
]
},
{
id: 'pang-wu-after-luofeng',
title: '매복을 읽은 두 사람',
availableAfterBattleIds: [campBattleIds.thirtieth],
unitIds: ['pang-tong', 'wu-yi'],
bondId: 'pang-tong__wu-yi',
rewardExp: 32,
lines: [
'오의: 장임이 숨어들 만한 길을 말씀드렸을 뿐인데, 선생께서는 적의 숨소리까지 짚어 내셨습니다.',
'방통: 길을 아는 사람과 마음을 읽는 사람이 같이 보면, 매복도 길 표지처럼 보이는 법이지요.',
'오의: 다음 성문 앞에서도 제가 아는 익주의 길을 숨기지 않겠습니다.'
],
choices: [
{
id: 'share-luofeng-slope-map',
label: '낙봉파 지도를 보완한다',
response: '오의가 놓친 샛길을 더하고 방통이 그 길마다 적의 시야를 적어 넣자, 낙성 진입로가 더 분명해졌습니다.',
rewardExp: 12
},
{
id: 'honor-wu-yi-guide',
label: '오의의 안내를 치하한다',
response: '방통이 오의의 공을 군영 앞에서 분명히 말하자, 새로 합류한 장수의 어깨에서 긴장이 조금 풀렸습니다.',
rewardExp: 11
}
]
},
{
id: 'zhuge-fa-after-luofeng',
title: '낙성 본성의 문',
availableAfterBattleIds: [campBattleIds.thirtieth],
unitIds: ['zhuge-liang', 'fa-zheng'],
bondId: 'zhuge-liang__fa-zheng',
rewardExp: 32,
lines: [
'제갈량: 낙봉파의 매복을 깨뜨렸으니 장임은 성문 뒤에서 더 단단히 버틸 것입니다.',
'법정: 성문은 군사만으로 열리지 않습니다. 익주의 장수들이 유비공을 두려워하지 않게 만드는 말도 함께 준비해야 합니다.',
'제갈량: 그렇다면 다음 싸움은 성벽을 치는 전투이자 마음을 여는 전투가 되겠군요.'
],
choices: [
{
id: 'prepare-luo-castle-parley',
label: '항복 권고문을 준비한다',
response: '두 책사가 문장을 다듬자 낙성 안쪽으로 보낼 글에는 위협보다 약속이 먼저 놓였습니다.',
rewardExp: 12
},
{
id: 'mark-main-gate-weakness',
label: '성문 약점을 표시한다',
response: '법정의 내부 정보와 제갈량의 배치도가 겹쳐지며, 다음 전장의 첫 돌파 지점이 좁혀졌습니다.',
rewardExp: 11
}
]
}
];
@@ -3984,6 +4079,66 @@ const campVisits: CampVisitDefinition[] = [
itemRewards: ['매복 대응 초안 1']
}
]
},
{
id: 'luofeng-slope-shrine',
title: '낙봉파 길가의 제단',
location: '낙봉파 비탈',
availableAfterBattleIds: [campBattleIds.thirtieth],
bondId: 'liu-bei__pang-tong',
description: '유비와 방통이 매복을 넘긴 비탈의 작은 제단에 들러, 살아 남은 병사들과 다음 길의 마음을 다집니다.',
lines: [
'방통: 이곳에서 한 걸음만 늦었다면 제 이름은 길가의 이야기가 되었을지도 모릅니다.',
'유비: 그러니 살아 남은 오늘을 가볍게 쓰지 맙시다. 다음 성문 앞에서도 백성을 먼저 보겠소.',
'제단 앞에 놓인 낡은 향이 꺼지고, 병사들은 낙봉파를 넘었다는 사실을 뒤늦게 실감했습니다.'
],
choices: [
{
id: 'comfort-luofeng-wounded',
label: '부상병을 위문한다',
response: '유비가 부상병의 손을 잡자 방통도 다음 행군표에서 무리한 구간을 줄였습니다.',
bondExp: 26,
itemRewards: ['상처약 3']
},
{
id: 'offer-luofeng-prayer',
label: '전몰자를 기린다',
response: '군영의 말소리가 낮아지고, 방통은 다음 계책에 병사들이 돌아올 길을 먼저 적었습니다.',
bondExp: 24,
gold: 340,
itemRewards: ['맑은 향 1']
}
]
},
{
id: 'luo-castle-main-council',
title: '낙성 본성 공략 회의',
location: '낙성 앞 군영',
availableAfterBattleIds: [campBattleIds.thirtieth],
bondId: 'fa-zheng__wu-yi',
description: '법정과 오의가 낙성 본성의 문, 물길, 수비 장수들의 성향을 대조하며 다음 공략의 밑그림을 만듭니다.',
lines: [
'법정: 장임은 강하지만, 낙성 안의 모든 장수가 같은 마음으로 버티는 것은 아닙니다.',
'오의: 제가 아는 이름들을 적겠습니다. 문을 여는 사람과 끝까지 막을 사람을 나누어 보지요.',
'두 사람이 성문 지도를 다시 그리자, 다음 전장의 목표가 단순한 격파가 아니라 설득을 포함한 공략으로 바뀌었습니다.'
],
choices: [
{
id: 'sort-luo-officer-names',
label: '장수 명단을 분류한다',
response: '익주 장수들의 이름 옆에 설득, 견제, 격파라는 표시가 붙으며 다음 전장의 말길이 열렸습니다.',
bondExp: 26,
itemRewards: ['낙성 장수 명단 1']
},
{
id: 'trace-luo-supply-water',
label: '보급 수로를 추적한다',
response: '오의가 작은 물길을 짚자 법정은 그 길이 성 안의 불안을 흔들 수 있다고 판단했습니다.',
bondExp: 24,
gold: 360,
itemRewards: ['낙성 수로도 1']
}
]
}
];
@@ -4069,7 +4224,7 @@ export class CampScene extends Phaser.Scene {
return;
}
if (battleId === campBattleIds.twentyNinth) {
if (battleId === campBattleIds.thirtieth || battleId === campBattleIds.twentyNinth) {
this.campaign = ensureCampaignRosterUnits(
[
...xuzhouRecruitUnits,
@@ -4310,6 +4465,9 @@ export class CampScene extends Phaser.Scene {
private currentCampTitle() {
const battleId = this.currentCampBattleId();
if (battleId === campBattleIds.thirtieth) {
return '낙봉파 매복전 후 군영';
}
if (battleId === campBattleIds.twentyNinth) {
return '낙성 외곽전 후 군영';
}