diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index 1269300..89374b3 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -1830,16 +1830,87 @@ export const fourteenthBattleScenario: BattleScenarioDefinition = { victoryConditionLabel: '차주 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ - '조조의 감시대가 서주 관문과 역참을 틀어쥐고 있습니다. 차주를 격파하면 유비군은 조조 휘하를 벗어날 첫 발판을 세웁니다.', - '조조군 기병은 길을 따라 추격하고, 궁병은 관문 뒤에서 사거리를 잡습니다. 손건의 문서와 간옹의 말로 민심을 흔들며 길목을 열어야 합니다.', - '서주 관문을 확보하고 22턴 안에 승리하면 원소 진영으로 향할 명분과 보급을 더 많이 보존합니다.' + '조조의 감시대가 서주 역참과 동쪽 관문을 틀어쥐고 있습니다. 차주를 격파하면 유비군은 조조 휘하를 벗어날 첫 발판을 세웁니다.', + '손건은 역참 문서와 민심을 정리하고, 관우와 장비는 길을 따라 밀고 오는 조조군 기병을 막아야 합니다. 관문 뒤의 궁병 사거리를 의식하며 전열을 나누십시오.', + '역참 문서를 확보하고 서주 관문을 돌파하십시오. 30턴 안에 승리하면 원소 진영으로 향할 명분과 보급을 더 많이 보존합니다.' ], + tacticalGuide: { + summary: '서남 진영에서 출발해 역참 문서를 장악하고, 동쪽 관문을 열어 조조의 감시망 밖으로 빠져나가는 전환 전투입니다.', + route: '서남 진영 → 서주 역참 → 동쪽 관문 → 차주 본진', + focus: + '차주만 서둘러 치면 후방 추격 기병과 관문 궁병이 유비를 압박합니다. 손건은 역참 문서를 정리하고, 관우는 관문 전열을 누르며, 장비는 남쪽 길의 기병 돌파를 받아쳐야 합니다.', + roles: [ + '유비: 이탈 명분 유지와 생존', + '관우: 동쪽 관문 정면 돌파', + '장비: 남쪽 길목 추격 기병 차단', + '손건: 역참 문서 확보와 민심 설득', + '미축: 장기 이탈전에 필요한 회복품과 보급 유지' + ], + events: { + 'village-approach': { + title: '감시망 핵심 지점 접근', + lines: [ + '이 지점을 잡으면 조조군의 보고선과 추격로가 동시에 흔들립니다.', + '주변 수비병을 정리한 뒤 유비군의 이름으로 문서와 길을 확보하십시오.' + ] + }, + 'enemy-posture': { + title: '차주의 봉쇄 진형', + lines: [ + '차주는 관문 뒤에 수비대를 세우고, 기병은 남쪽 길을 따라 돌아 들어옵니다.', + '손건이 역참을 잡는 동안 관우와 장비가 전열과 측면을 나누어 막아야 합니다.' + ] + }, + 'cavalry-approach': { + title: '조조군 추격 기병', + lines: [ + '조조군 기병이 길을 타고 후방을 노립니다.', + '장비를 남쪽 길목에 세우고 유비를 무리하게 앞세우지 않으면 추격을 끊고 관문을 압박할 수 있습니다.' + ] + }, + 'leader-wavering': { + title: '차주 수비선 동요', + lines: [ + '역참과 관문이 흔들리자 차주의 보고선이 끊기고 있습니다.', + '관문 주변 적을 정리한 뒤 차주를 몰아치면 조조의 장막 밖으로 나갈 길이 열립니다.' + ] + } + } + }, + sortie: { + sortieLimit: 6, + requiredUnits: ['liu-bei'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'support', reason: '조조 휘하를 떠나는 명분과 생존 조건의 중심입니다. 후방 지휘를 맡깁니다.' }, + { unitId: 'guan-yu', role: 'front', reason: '동쪽 서주 관문 수비대를 정면에서 밀어낼 핵심 전열입니다.' }, + { unitId: 'zhang-fei', role: 'flank', reason: '남쪽 길목으로 돌진하는 조조군 기병을 받아치는 측면 차단 역할입니다.' }, + { unitId: 'sun-qian', role: 'support', reason: '역참 문서와 민심을 정리해 이탈 명분과 목표 보상을 직접 살립니다.' }, + { unitId: 'mi-zhu', role: 'reserve', reason: '회복품과 보급선 운용으로 긴 이탈전을 안정시킵니다.' }, + { unitId: 'jian-yong', role: 'support', reason: '간옹의 말과 책략 지원은 조조군 감시망을 흔드는 데 유리합니다.' } + ], + recommendedClasses: [ + { label: '이탈 지휘', classKeys: ['lord'], reason: '유비 생존과 전후 명분이 원소 의탁 흐름의 출발점입니다.' }, + { label: '관문 돌파', classKeys: ['infantry'], reason: '요새 수비대와 차주 본진 사이를 안정적으로 밀 수 있습니다.' }, + { label: '추격 차단', classKeys: ['spearman'], reason: '길을 따라 달려드는 기병을 받아치고 후방을 지키기 좋습니다.' }, + { label: '문서 설득', classKeys: ['strategist'], reason: '역참 문서와 민심 목표를 살리면 이탈 명분이 더 분명해집니다.' }, + { label: '보급 유지', classKeys: ['quartermaster'], reason: '허도를 떠난 뒤에는 회복품과 보급 보존이 다음 전투의 여유를 만듭니다.' } + ], + deploymentSlots: [ + { role: 'support', unitId: 'liu-bei', x: 3, y: 19, label: '후방 지휘' }, + { role: 'front', unitId: 'guan-yu', x: 4, y: 18, label: '관문 전열' }, + { role: 'flank', unitId: 'zhang-fei', x: 4, y: 20, label: '추격 차단' }, + { role: 'support', unitId: 'sun-qian', x: 5, y: 19, label: '문서 확보' }, + { role: 'reserve', unitId: 'mi-zhu', x: 3, y: 21, label: '보급 유지' }, + { role: 'support', unitId: 'jian-yong', x: 5, y: 21, label: '책략 지원' } + ], + note: '서주 재기는 조조의 감시망을 끊는 전투입니다. 추천 배치는 손건이 역참 문서를 잡고, 관우가 관문을 누르며, 장비가 남쪽 추격 기병을 막는 형태입니다.' + }, map: fourteenthBattleMap, units: fourteenthBattleUnits, bonds: fourteenthBattleBonds, mapTextureKey: 'battle-map-fourteenth', leaderUnitId: 'cao-break-leader-che-zhou', - quickVictoryTurnLimit: 22, + quickVictoryTurnLimit: 30, baseVictoryGold: 1660, objectives: [ { @@ -1856,23 +1927,42 @@ export const fourteenthBattleScenario: BattleScenarioDefinition = { rewardGold: 380, unitId: 'liu-bei' }, + { + id: 'relay', + kind: 'secure-terrain', + label: '역참 문서 확보', + rewardGold: 520, + terrain: 'village', + targetTile: { x: 14, y: 14, radius: 4 }, + threatRadius: 1 + }, { id: 'gate', kind: 'secure-terrain', - label: '서주 관문 확보', - rewardGold: 600, - terrain: 'fort' + label: '서주 관문 돌파', + rewardGold: 640, + terrain: 'fort', + targetTile: { x: 26, y: 12, radius: 3 }, + threatRadius: 1 }, { id: 'quick', kind: 'quick-victory', - label: '22턴 이내 승리', + label: '30턴 이내 승리', rewardGold: 460, - maxTurn: 22 + maxTurn: 30 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 5', '상처약 3', '탁주 2', '손건 문서 +1'], + campaignReward: { + supplies: ['콩 5', '상처약 3', '탁주 2'], + equipment: ['서주 통행문서 1'], + reputation: ['조조 이탈 명분 +1', '서주 민심 +1'], + unlockBattleId: 'fifteenth-battle-yuan-refuge-road', + unlockLabel: '원소 의탁로 개방', + note: '역참 문서와 서주 관문을 함께 장악해 조조의 감시망을 끊고, 원소 진영으로 향할 접선 명분을 확보합니다.' + }, victoryPages: fourteenthBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/campaignFlow.ts b/src/game/data/campaignFlow.ts index acb54b6..3d8cce5 100644 --- a/src/game/data/campaignFlow.ts +++ b/src/game/data/campaignFlow.ts @@ -356,8 +356,8 @@ const sortieFlows: Record = { eyebrow: '다음 전장', title: fifteenthBattleScenario.title, description: - '조조의 장막을 벗어난 유비군은 원소 진영으로 향해야 합니다. 그러나 북상로에는 채양의 추격대가 깔려 있어, 접선지까지 길을 열어야 합니다.', - rewardHint: `예상 보상: ${fifteenthBattleScenario.title} 개방 / 원소 접선`, + '역참 문서와 서주 관문을 확보한 유비군은 조조의 장막을 벗어났습니다. 그러나 북상로에는 채양의 추격대가 깔려 있어, 손건의 통행 문서가 닿을 접선지까지 길을 열어야 합니다.', + rewardHint: `예상 보상: ${fifteenthBattleScenario.title} 개방 / 원소 접선 명분`, nextBattleId: fifteenthBattleScenario.id, campaignStep: 'fifteenth-battle', pages: [...fourteenthBattleVictoryPages, ...fifteenthBattleIntroPages] diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index bc0bc6e..e6fa0dc 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -1205,10 +1205,10 @@ export const fourteenthBattleIntroPages: StoryPage[] = [ { id: 'fourteenth-sun-qian-arrives', bgm: 'militia-theme', - chapter: '새로 온 책사', + chapter: '손건의 길', background: 'story-wandering', speaker: '손건', - text: '현덕공, 저는 손건이라 합니다. 서주와 허도 사이의 길을 오가며 민심과 조조군의 움직임을 살펴 왔습니다. 이제 떠날 때를 고르신다면, 그 길의 말과 문서를 제가 맡겠습니다.' + text: '현덕공, 차주는 서주 관문과 역참을 함께 잡고 있습니다. 역참 문서가 조조에게 넘어가면 어느 마을이 주공을 도왔는지까지 드러납니다. 먼저 문서를 거두고 관문을 열어야 합니다.' }, { id: 'fourteenth-brothers-break-from-cao', @@ -1217,7 +1217,7 @@ export const fourteenthBattleIntroPages: StoryPage[] = [ background: 'story-wandering', speaker: '장비', portrait: 'zhangFei', - text: '조조의 눈치를 보느라 칼집만 만지고 있을 순 없습니다. 형님, 서주 길목의 감시대를 뚫고 백성들이 우리 깃발을 다시 볼 수 있게 합시다.' + text: '조조의 눈치를 보느라 칼집만 만지고 있을 순 없습니다. 관우 형님이 관문을 누르면 제가 남쪽 길로 도는 기병을 막겠습니다. 형님은 뒤에서 길을 잃지 않게만 해 주십시오.' }, { id: 'fourteenth-xuzhou-gate-sortie', @@ -1225,7 +1225,7 @@ export const fourteenthBattleIntroPages: StoryPage[] = [ chapter: '서주 재기', background: 'story-wandering', speaker: '간옹', - text: '차주는 조조의 명을 앞세워 성문과 역참을 잡고 있습니다. 길목을 끊고 차주를 격파하면, 조조의 장막 밖으로 나갈 첫 명분을 세울 수 있습니다.' + text: '작전은 단순합니다. 손건이 역참 문서를 확보하고, 관우가 동쪽 관문을 밀고, 장비가 추격 기병을 끊습니다. 차주를 꺾으면 조조의 장막 밖으로 나갈 첫 명분이 생깁니다.' } ]; @@ -1235,7 +1235,7 @@ export const fourteenthBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '다시 열린 서주 길', background: 'story-wandering', - text: '차주의 감시대가 흩어지자 서주로 향하는 관문이 열렸다. 백성들은 유비군의 깃발을 알아보았고, 조조의 이름보다 현덕의 이름을 먼저 속삭이기 시작했다.' + text: '역참의 문서가 유비군 손에 들어오고 차주의 감시대가 흩어지자, 서주로 향하는 관문이 열렸다. 백성들은 유비군의 깃발을 알아보았고, 조조의 이름보다 현덕의 이름을 먼저 속삭이기 시작했다.' }, { id: 'fourteenth-cao-cao-anger', @@ -1243,7 +1243,7 @@ export const fourteenthBattleVictoryPages: StoryPage[] = [ chapter: '돌이킬 수 없는 길', background: 'story-wandering', speaker: '손건', - text: '이 승리는 조조에게는 반역의 조짐으로 보일 것입니다. 허도로 돌아갈 길은 사실상 끊겼고, 다음으로 기대야 할 큰 세력은 원소입니다.' + text: '역참 보고선은 끊었지만 오래 숨길 수는 없습니다. 이 승리는 조조에게 반역의 조짐으로 보일 것입니다. 허도로 돌아갈 길은 사실상 끊겼고, 다음으로 기대야 할 큰 세력은 원소입니다.' }, { id: 'fourteenth-road-to-yuan-shao', @@ -1252,7 +1252,7 @@ export const fourteenthBattleVictoryPages: StoryPage[] = [ background: 'story-wandering', speaker: '유비', portrait: 'liuBei', - text: '조조를 떠난 이상, 더 큰 파도 속으로 들어가야 한다. 원소의 진영은 안전한 항구가 아니라 또 다른 시험일 것이다. 그래도 뜻을 이어 가려면 그 길을 지나야 한다.' + text: '조조를 떠난 이상, 더 큰 파도 속으로 들어가야 한다. 손건이 남긴 통행 문서와 백성의 말이 우리를 북쪽으로 이끌 것이다. 원소의 진영이 또 다른 시험이라 해도, 뜻을 이어 가려면 그 길을 지나야 한다.' } ]; diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index a519644..ef6df5e 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -717,13 +717,14 @@ const sortieRulesByBattleId: Partial