From 0791488f5d7ed998ca7d194a41b20aa42d40e9d0 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 4 Jul 2026 18:15:36 +0900 Subject: [PATCH] Refine Red Cliffs vanguard battle flow --- src/game/data/battles.ts | 96 ++++++++++++++++++++++++++++++++--- src/game/data/campaignFlow.ts | 4 +- src/game/data/scenario.ts | 6 +-- src/game/scenes/CampScene.ts | 29 ++++++++--- 4 files changed, 116 insertions(+), 19 deletions(-) diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index b2ae04c..5233bd5 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -2819,16 +2819,80 @@ export const twentyFirstBattleScenario: BattleScenarioDefinition = { victoryConditionLabel: '채모 퇴각', defeatConditionLabel: '유비 또는 제갈량 퇴각', openingObjectiveLines: [ - '강동 회담이 결전으로 기울자 조조군 수군 선봉이 적벽 포구를 시험합니다. 첫 전선을 빼앗기면 손유 동맹의 사기가 크게 흔들립니다.', - '강 위의 전장은 강줄기와 배다리가 길을 나눕니다. 기동 장수로 강안 기병을 끊고, 전열 장수로 포구 수비대를 밀어내야 합니다.', - '채모를 퇴각시키고 제갈량을 지키십시오. 강동 포구를 확보하면 화공을 논할 발판이 마련됩니다.' + '강동 회담이 결전으로 기울자 조조군 수군 선봉이 적벽 포구를 시험합니다. 첫 강상 전선을 빼앗기면 손유 동맹의 사기가 크게 흔들립니다.', + '강 위의 전장은 강줄기와 배다리가 길을 나눕니다. 조운은 강안 기병을 끊고, 관우와 장비는 배다리와 포구 수비대를 밀어내야 합니다.', + '채모를 퇴각시키고 제갈량을 지키십시오. 배다리 거점과 강동 포구를 확보하면 다음 화공전의 발판이 마련됩니다.' ], + tacticalGuide: { + summary: '서남쪽 동맹 진영에서 배다리 거점을 잡고, 강안 기병과 선상 궁병을 끊은 뒤 동쪽 포구의 채모 선봉을 몰아내는 첫 강상 전투입니다.', + route: '서남 동맹 진영 → 배다리 거점 → 강동 포구 → 채모 본대', + focus: + '강안 기병이 후방을 흔들기 전에 조운으로 먼저 끊고, 관우와 장비가 배다리와 포구 전열을 받아내야 합니다. 제갈량은 뒤에서 화공 논리를 보존하고, 유비는 손유 동맹의 전선을 무리하게 넓히지 않도록 지휘하십시오.', + roles: [ + '유비: 손유 동맹 전선 지휘', + '제갈량: 화공 논의와 책략 지원', + '조운: 강안 기병 차단', + '관우: 배다리 전열 유지', + '장비: 포구 수비대 돌파', + '손건: 동맹 회담 기록 보존' + ], + events: { + 'village-approach': { + title: '배다리 거점 접근', + lines: [ + '이 거점을 잡으면 강동 수군과 유비군의 전선이 처음으로 맞물립니다.', + '궁병의 사거리에 오래 서지 말고, 전열 장수로 배다리를 눌러 포구까지 이어지는 길을 만드십시오.' + ] + }, + 'cavalry-approach': { + title: '강안 기병 접근', + lines: [ + '조조군 기병이 강안으로 우회해 후방을 노립니다.', + '조운이 먼저 끊어야 제갈량과 손건의 동맹 기록선이 흔들리지 않습니다.' + ] + }, + 'leader-wavering': { + title: '채모 선봉 동요', + lines: [ + '배다리와 포구가 모두 손유 동맹 쪽으로 넘어오자 채모의 선봉이 배 위에서 흔들립니다.', + '남은 친위를 정리하고 채모를 물리치면 화공을 논할 첫 실전 근거가 생깁니다.' + ] + } + } + }, + sortie: { + sortieLimit: 6, + requiredUnits: ['liu-bei', 'zhuge-liang'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'reserve', reason: '손유 동맹의 명분이자 패배 조건의 중심입니다.' }, + { unitId: 'zhuge-liang', role: 'support', reason: '바람과 화공을 잇는 계책 담당이며 반드시 생존해야 합니다.' }, + { unitId: 'zhao-yun', role: 'flank', reason: '강안의 기병과 척후를 빠르게 끊어 포구를 안정시킵니다.' }, + { unitId: 'guan-yu', role: 'front', reason: '배다리와 포구 전열에서 적 수군을 받아낼 핵심 전열입니다.' }, + { unitId: 'zhang-fei', role: 'front', reason: '좁은 강변 길목을 밀어붙이며 적 보병을 흔드는 돌파 역할입니다.' }, + { unitId: 'sun-qian', role: 'support', reason: '강동 회담 기록과 동맹 명분을 전투 뒤 보고로 이어 줍니다.' } + ], + recommendedClasses: [ + { label: '동맹 지휘', classKeys: ['lord'], reason: '유비가 무너지지 않아야 손유 동맹 전선이 유지됩니다.' }, + { label: '화공 책략', classKeys: ['strategist'], reason: '제갈량의 생존과 판단이 다음 적벽 화공전으로 이어집니다.' }, + { label: '강안 기동', classKeys: ['cavalry'], reason: '기동 장수가 강안 기병과 척후를 빠르게 끊어야 합니다.' }, + { label: '배다리 전열', classKeys: ['infantry', 'spearman'], reason: '배다리와 포구 수비대는 튼튼한 전열이 받아내야 합니다.' } + ], + deploymentSlots: [ + { x: 4, y: 24, role: 'reserve', unitId: 'liu-bei', label: '동맹 지휘' }, + { x: 6, y: 22, role: 'front', unitId: 'guan-yu', label: '배다리 전열' }, + { x: 6, y: 25, role: 'front', unitId: 'zhang-fei', label: '포구 돌파' }, + { x: 8, y: 21, role: 'flank', unitId: 'zhao-yun', label: '강안 기동' }, + { x: 6, y: 23, role: 'support', unitId: 'zhuge-liang', label: '화공 판단' }, + { x: 8, y: 24, role: 'support', unitId: 'sun-qian', label: '동맹 기록' } + ], + note: '적벽 전초전은 손유 동맹의 첫 강상 전투입니다. 유비와 제갈량을 반드시 포함하고, 조운으로 강안 기병을 끊은 뒤 관우와 장비가 배다리와 포구를 눌러 화공 논의의 발판을 만드는 편성이 좋습니다.' + }, map: twentyFirstBattleMap, units: twentyFirstBattleUnits, bonds: twentyFirstBattleBonds, mapTextureKey: 'battle-map-twenty-first', leaderUnitId: 'redcliff-vanguard-leader-cai-mao', - quickVictoryTurnLimit: 30, + quickVictoryTurnLimit: 40, baseVictoryGold: 2540, objectives: [ { @@ -2857,14 +2921,25 @@ export const twentyFirstBattleScenario: BattleScenarioDefinition = { kind: 'secure-terrain', label: '강동 포구 확보', rewardGold: 900, - terrain: 'fort' + terrain: 'fort', + targetTile: { x: 35, y: 18, radius: 5 }, + threatRadius: 0 + }, + { + id: 'pontoon-line', + kind: 'secure-terrain', + label: '배다리 거점 확보', + rewardGold: 760, + terrain: 'village', + targetTile: { x: 29, y: 18, radius: 5 }, + threatRadius: 0 }, { id: 'quick', kind: 'quick-victory', - label: '30턴 이내 승리', + label: '40턴 이내 승리', rewardGold: 680, - maxTurn: 30 + maxTurn: 40 } ], defeatConditions: [ @@ -2872,6 +2947,13 @@ export const twentyFirstBattleScenario: BattleScenarioDefinition = { { kind: 'unit-defeated', unitId: 'zhuge-liang' } ], itemRewards: ['콩 8', '상처약 6', '탁주 3', '화공 논의 +1', '동맹 군의 기록 +1'], + campaignReward: { + supplies: ['콩 8', '상처약 6', '탁주 3'], + reputation: ['손유 동맹 첫 전선 +1', '화공 논의 +1'], + unlockBattleId: 'twenty-second-battle-red-cliffs-fire', + unlockLabel: '적벽 화공전 개방', + note: '배다리 거점과 강동 포구를 확보해 조조 수군이 강 위에서 흔들릴 수 있음을 증명하고, 주유와 황개의 화공 논의를 본격화합니다.' + }, victoryPages: twentyFirstBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/campaignFlow.ts b/src/game/data/campaignFlow.ts index 0e20f2e..bc2b5ec 100644 --- a/src/game/data/campaignFlow.ts +++ b/src/game/data/campaignFlow.ts @@ -433,8 +433,8 @@ const sortieFlows: Record = { eyebrow: '다음 전장', title: twentySecondBattleScenario.title, description: - '조조군 수군 선봉을 밀어내며 손유 동맹의 첫 전선이 세워졌습니다. 이제 주유와 황개, 제갈량의 계책이 맞물려 본격적인 화공을 준비해야 합니다.', - rewardHint: `예상 보상: ${twentySecondBattleScenario.title} 개방 / 적벽대전 결전`, + '조조군 수군 선봉을 밀어내고 배다리 거점과 강동 포구를 확보하며 손유 동맹의 첫 전선이 세워졌습니다. 이제 주유와 황개, 제갈량의 계책이 맞물려 본격적인 화공을 준비해야 합니다.', + rewardHint: `예상 보상: ${twentySecondBattleScenario.title} 개방 / 화공 논의 본격화`, nextBattleId: twentySecondBattleScenario.id, campaignStep: 'twenty-second-battle', pages: [...twentyFirstBattleVictoryPages, ...twentySecondBattleIntroPages] diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index 9484b39..9a3411d 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -1668,7 +1668,7 @@ export const twentyFirstBattleIntroPages: StoryPage[] = [ chapter: '적벽 전초전', background: 'story-red-cliffs', speaker: '제갈량', - text: '조조군 수군 선봉이 강가 포구를 시험하고 있습니다. 채모의 선봉을 물리쳐야 강동 수군과 합류할 첫 자리를 지킬 수 있습니다.' + text: '조조군 수군 선봉이 강가 포구를 시험하고 있습니다. 배다리 거점과 포구를 함께 잡아야 강동 수군과 합류할 첫 자리를 지킬 수 있습니다.' } ]; @@ -1678,7 +1678,7 @@ export const twentyFirstBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '강 위의 첫 승리', background: 'story-red-cliffs', - text: '채모의 선봉이 물러서자 장강의 물결 위에 손유 동맹의 첫 전선이 세워졌습니다. 작은 승리였지만 조조군이 강 위에서 무적이 아님을 모두가 보았습니다.' + text: '채모의 선봉이 물러서자 배다리 거점과 강동 포구 위에 손유 동맹의 첫 전선이 세워졌습니다. 작은 승리였지만 조조군이 강 위에서 무적이 아님을 모두가 보았습니다.' }, { id: 'twenty-first-zhou-yu-fire-plan', @@ -1686,7 +1686,7 @@ export const twentyFirstBattleVictoryPages: StoryPage[] = [ chapter: '화공의 실마리', background: 'story-red-cliffs', speaker: '주유', - text: '조조군의 배는 많지만 서로를 믿지 못하고, 사슬로 묶으면 바람 앞에서 약점이 됩니다. 아직 때가 무르익지는 않았지만 불길의 길은 보이기 시작했습니다.' + text: '배다리와 포구가 열렸으니 조조군의 배가 어떻게 움직이는지도 보입니다. 사슬로 묶인 큰 함대는 바람 앞에서 약점이 됩니다. 아직 때가 무르익지는 않았지만 불길의 길은 보이기 시작했습니다.' }, { id: 'twenty-first-zhuge-wind', diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index 1b524f3..f6b0a68 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -830,15 +830,30 @@ const sortieRulesByBattleId: Partial