diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index 0b8ed38..9e9b30a 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -5634,6 +5634,76 @@ export const thirtyNinthBattleScenario: BattleScenarioDefinition = { '이번 전투는 관우가 핵심입니다. 관우가 무너지면 번성 전선의 사기가 흔들리니, 유비와 관우를 함께 지키며 전선을 밀어 올리십시오.', '성채 안쪽의 조인, 수로를 보는 우금, 기병을 이끄는 방덕이 서로 다른 방식으로 버틸 것입니다. 기동대와 책사를 골고루 출전시키면 공명과 성장 기회가 커집니다.' ], + tacticalGuide: { + summary: + '번성 외곽 압박전은 관우가 형주 방위에서 북상 공세로 전환하는 첫 전투입니다. 외곽 보루와 나루를 먼저 누르면 방덕의 기병 선봉이 고립되고, 다음 한수 수공을 준비할 제방·수문 정보도 확보할 수 있습니다.', + route: '서남 형주 진영 → 강변 척후 정리 → 중로 보병선 돌파 → 외곽 보루 확보 → 방덕 기병 선봉 격파', + focus: + '방덕 기병은 빠르게 밀고 들어오지만 보루를 잃으면 버티기 어렵습니다. 관우와 장비가 정면을 세우고, 황충이 보루 궁병을 누르며, 법정은 제방과 수문을 읽어 다음 수공 준비까지 연결해야 합니다.', + roles: [ + '유비: 번성 공세의 명분과 패배 조건의 중심', + '관우: 외곽 보루 압박과 생존 목표의 핵심 전열', + '장비: 방덕 기병 돌파를 받아 내는 전열 보강', + '조운: 강변과 보루 사이 기동 대응', + '황충: 보루 궁병과 성벽 압박의 원거리 축', + '법정: 한수 물길과 제방을 읽는 수공 준비 참모', + '마량: 형주 민심과 보급선 안정' + ], + events: { + 'village-approach': { + title: '외곽 보루', + lines: [ + '법정: 저 보루를 잡으면 한수의 물길과 수문을 살필 자리를 얻습니다.', + '황충: 성벽 위 궁병은 오래 두면 전열을 갉아먹습니다. 제가 먼저 눌러 보겠습니다.' + ] + }, + 'cavalry-approach': { + title: '방덕 기병', + lines: [ + '장비: 방덕이 돌파로 길을 열려는군. 정면은 내가 받아 내겠다.', + '조운: 기병이 돌아 나오는 틈은 제가 끊겠습니다. 보루 쪽으로 몰아넣으십시오.' + ] + }, + 'leader-wavering': { + title: '방덕 선봉 고립', + lines: [ + '방덕: 보루가 흔들리니 기병의 발도 묶이는군. 그러나 물러서지는 않겠다.', + '관우: 그 결기는 보았다. 하지만 오늘은 번성의 바깥문을 열어야 한다.' + ] + } + } + }, + sortie: { + sortieLimit: 7, + requiredUnits: ['liu-bei', 'guan-yu'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'reserve', reason: '번성 전선의 큰 명분과 패배 조건의 중심입니다.' }, + { unitId: 'guan-yu', role: 'front', reason: '번성 외곽 압박전의 핵심 장수이며 생존 목표입니다.' }, + { unitId: 'zhang-fei', role: 'front', reason: '방덕 기병의 돌파를 정면에서 받아치는 강한 전열입니다.' }, + { unitId: 'zhao-yun', role: 'flank', reason: '강변과 보루 사이 기동 대응을 안정적으로 맡습니다.' }, + { unitId: 'huang-zhong', role: 'support', reason: '외곽 보루의 궁병과 성벽 압박에 강한 원거리 축입니다.' }, + { unitId: 'fa-zheng', role: 'support', reason: '한수 물길과 제방을 읽어 다음 수공 준비와 맞물립니다.' }, + { unitId: 'ma-liang', role: 'support', reason: '형주 민심과 보급선을 안정시키며 관우 전선을 보조합니다.' } + ], + recommendedClasses: [ + { label: '번성 명분', classKeys: ['lord'], reason: '유비가 있어야 형주 전선의 공세 명분이 흔들리지 않습니다.' }, + { label: '보루 전열', classKeys: ['spearman', 'infantry'], reason: '관우와 장비가 방덕 기병 돌파를 받아 냅니다.' }, + { label: '기동 견제', classKeys: ['cavalry'], reason: '조운이 강변과 보루 사이 빈틈을 메웁니다.' }, + { label: '성벽 압박', classKeys: ['archer'], reason: '황충이 보루 궁병과 성벽 압박을 안정적으로 맡습니다.' }, + { label: '수공 준비', classKeys: ['strategist'], reason: '법정과 마량이 제방·수문·보급선을 다음 전투로 연결합니다.' } + ], + deploymentSlots: [ + { x: 5, y: 54, role: 'reserve', unitId: 'liu-bei', label: '번성 명분' }, + { x: 10, y: 49, role: 'front', unitId: 'guan-yu', label: '보루 전열' }, + { x: 6, y: 56, role: 'front', unitId: 'zhang-fei', label: '기병 수비' }, + { x: 13, y: 52, role: 'flank', unitId: 'zhao-yun', label: '강변 기동' }, + { x: 16, y: 50, role: 'support', unitId: 'huang-zhong', label: '성벽 압박' }, + { x: 17, y: 54, role: 'support', unitId: 'fa-zheng', label: '수공 준비' }, + { x: 12, y: 54, role: 'support', unitId: 'ma-liang', label: '보급 안정' } + ], + note: + '번성 외곽 압박전은 관우가 방어에서 공세로 전환하는 첫 전장입니다. 외곽 보루를 확보해 방덕 기병을 고립시키고, 법정·마량으로 제방과 보급 정보를 챙겨 다음 한수 수공을 준비하십시오.' + }, map: thirtyNinthBattleMap, units: thirtyNinthBattleUnits, bonds: thirtyNinthBattleBonds, @@ -5668,7 +5738,9 @@ export const thirtyNinthBattleScenario: BattleScenarioDefinition = { kind: 'secure-terrain', label: '번성 외곽 보루 확보', rewardGold: 2320, - terrain: 'fort' + terrain: 'fort', + targetTile: { x: 68, y: 34, radius: 6 }, + threatRadius: 0 }, { id: 'quick', @@ -5683,6 +5755,13 @@ export const thirtyNinthBattleScenario: BattleScenarioDefinition = { { kind: 'unit-defeated', unitId: 'guan-yu' } ], itemRewards: ['콩 34', '상처약 25', '탁주 10', '번성 외곽도 1', '한수 수공 준비'], + campaignReward: { + supplies: ['콩 34', '상처약 25', '탁주 10'], + equipment: ['번성 외곽도 1'], + reputation: ['한수 수공 준비'], + unlockLabel: '한수 수공', + note: '번성 외곽 보루와 나루를 장악하고 방덕 선봉을 밀어냈습니다. 다음 군영에서는 한수 수위와 제방을 활용한 수공을 준비합니다.' + }, victoryPages: thirtyNinthBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index a880cc5..ff07c9f 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -2845,7 +2845,7 @@ export const thirtyNinthBattleIntroPages: StoryPage[] = [ chapter: '번성의 그림자', background: 'story-fan-castle-flood', speaker: '제갈량', - text: '형주의 봉화는 다시 올랐으나, 번성의 문은 더욱 굳게 닫혔습니다. 조조의 북방 병력은 수로와 성채를 엮어 시간을 벌려 하고, 오의 시선도 강 건너에서 조용히 움직입니다.' + text: '형주의 봉화는 다시 올랐으나, 번성의 문은 더욱 굳게 닫혔습니다. 외곽 보루와 나루를 먼저 누르지 못하면 조조군은 수로와 성채를 엮어 시간을 벌 것입니다.' }, { id: 'thirty-ninth-guan-yu-north', @@ -2854,7 +2854,7 @@ export const thirtyNinthBattleIntroPages: StoryPage[] = [ background: 'story-fan-castle-flood', speaker: '관우', portrait: 'guanYu', - text: '형주를 지키는 일은 곧 한실을 일으키는 일입니다. 번성 외곽의 보루와 나루를 눌러야 적의 숨통을 조이고, 뒤이어 큰 결전을 열 수 있습니다.' + text: '형주를 지키는 일은 곧 한실을 일으키는 일입니다. 오늘은 성문을 치기보다 방덕의 기병을 보루 앞에 묶고, 다음 결전의 길을 열겠습니다.' }, { id: 'thirty-ninth-flooded-fields', @@ -2862,7 +2862,7 @@ export const thirtyNinthBattleIntroPages: StoryPage[] = [ chapter: '물길을 보는 눈', background: 'story-fan-castle-flood', speaker: '법정', - text: '한수의 물길은 평소에는 느려 보이나, 비와 둑의 높이에 따라 전장의 형세를 통째로 바꿉니다. 이번 전투에서는 성 밖 보급선과 제방 감시초를 먼저 잡아야 합니다.' + text: '한수의 물길은 느려 보여도 둑과 수문을 잡는 자에게 편을 듭니다. 외곽 보루를 확보하면 다음 수공의 눈이 될 제방 감시초도 함께 열립니다.' }, { id: 'thirty-ninth-sortie', @@ -2871,7 +2871,7 @@ export const thirtyNinthBattleIntroPages: StoryPage[] = [ background: 'story-fan-castle-flood', speaker: '유비', portrait: 'liuBei', - text: '관우가 선봉을 잡되 모두가 그 뒤를 받쳐라. 번성 외곽을 열면 다음 물길과 성문을 함께 도모할 수 있다. 오늘의 선택이 다음 전장의 폭을 넓힐 것이다.' + text: '관우와 장비는 보루 앞 전열을 세우고, 황충은 성벽 궁병을 눌러라. 조운은 기병의 옆길을 막고, 법정과 마량은 제방과 보급선을 살피시오.' } ]; @@ -2881,7 +2881,7 @@ export const thirtyNinthBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '외곽 보루 함락', background: 'story-fan-castle-flood', - text: '번성 외곽의 보루와 나루가 촉한군의 손에 들어왔습니다. 조조군은 성 안쪽으로 물러났고, 방덕의 선봉은 다시 방어진을 고쳐 세우며 다음 격돌을 예고했습니다.' + text: '번성 외곽의 보루와 나루가 촉한군의 손에 들어왔습니다. 방덕의 선봉은 성 안쪽으로 물러났고, 한수의 둑과 수문을 살필 길도 열렸습니다.' }, { id: 'thirty-ninth-pang-de-resolve', diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index d3acf09..f69edfa 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -1342,7 +1342,23 @@ const sortieRulesByBattleId: Partial