diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index 2ec0e25..7d2cd16 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -2546,14 +2546,61 @@ export const nineteenthBattleScenario: BattleScenarioDefinition = { openingObjectiveLines: [ '조조군 호표기가 피난 행렬을 따라 장판파로 들이칩니다. 백성을 버리지 않으려면 남쪽 피난로와 다리목을 동시에 지켜야 합니다.', '조운은 넓은 길을 오가며 흩어진 병력을 모을 수 있고, 장비는 다리목을 막아 추격 기병을 늦추기 좋습니다. 제갈량과 손건은 전후 강동 사절 명분을 정리합니다.', - '조순을 퇴각시키고 유비와 조운을 지키십시오. 피난민 마을을 확보하면 다음 강동 사절 준비가 안정됩니다.' + '조순을 퇴각시키고 유비와 조운을 지키십시오. 피난민 마을과 장판교 길목을 확보하고 36턴 안에 승리하면 다음 강동 사절 준비가 안정됩니다.' ], + tacticalGuide: { + summary: '서쪽 피난 행렬을 지키며 중앙 마을을 잡고, 장판교 길목에서 추격 기병을 늦춘 뒤 조순을 밀어냅니다.', + route: '서쪽 피난 진영 → 중앙 피난민 마을 → 장판교 길목 → 조순 본대', + focus: '조운은 흩어진 전열을 오가며 중앙 피난로를 열고, 장비와 관우는 장판교 길목을 막아 기병 돌파를 늦추십시오. 유비는 뒤에서 피난 행렬을 유지하고 제갈량과 손건은 다음 강동 사절 명분을 정리합니다.', + roles: ['유비: 후방 피난 지휘', '조운: 피난로 기동/구원', '장비: 장판교 길목 저지', '관우: 전열 받침', '제갈량: 퇴로 판단/책략', '손건: 강동 사절 기록'], + events: { + 'village-approach': { + title: '피난민 거점 접근', + lines: ['중앙 마을은 피난 행렬이 다시 모이는 지점입니다.', '조운으로 길을 열고 주변 추격대를 몰아내면 백성과 보급을 함께 보존할 수 있습니다.'] + }, + 'cavalry-approach': { + title: '호표기 접근', + lines: ['추격 기병은 길을 따라 빠르게 파고듭니다.', '장비와 관우를 좁은 길목에 세워 조운이 피난로를 정리할 시간을 벌어야 합니다.'] + }, + 'leader-wavering': { + title: '조순 전열 흔들림', + lines: ['조순의 친위가 무너지면 추격대의 속도도 꺾입니다.', '남은 병력을 조운과 전열 장수에게 모아 퇴각로를 완전히 여십시오.'] + } + } + }, + sortie: { + sortieLimit: 6, + requiredUnits: ['liu-bei', 'zhao-yun'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'reserve', reason: '피난 행렬의 중심이며 패배 조건입니다.' }, + { unitId: 'zhao-yun', role: 'flank', reason: '피난로를 오가며 흩어진 병력과 백성을 붙잡는 핵심 기동 장수입니다.' }, + { unitId: 'zhang-fei', role: 'front', reason: '장판교와 좁은 길목에서 추격 기병을 늦추는 역할입니다.' }, + { unitId: 'guan-yu', role: 'front', reason: '장비가 버티는 다리목 전열을 안정적으로 받쳐 줍니다.' }, + { unitId: 'zhuge-liang', role: 'support', reason: '피난로 판단과 강동 사절 명분을 전투 뒤로 연결합니다.' }, + { unitId: 'sun-qian', role: 'support', reason: '강동에 보낼 기록과 외교 명분을 정리합니다.' } + ], + recommendedClasses: [ + { label: '피난 지휘', classKeys: ['lord'], reason: '유비가 후방에서 무너지지 않아야 피난 행렬이 유지됩니다.' }, + { label: '기동 구원', classKeys: ['cavalry'], reason: '조운 같은 기동 장수가 마을과 다리목 사이를 오가야 합니다.' }, + { label: '길목 전열', classKeys: ['infantry', 'spearman'], reason: '장판교 길목은 튼튼한 전열이 있어야 추격 기병을 늦출 수 있습니다.' }, + { label: '책략/기록', classKeys: ['strategist'], reason: '제갈량과 손건은 전투 결과를 다음 강동 사절로 이어 줍니다.' } + ], + deploymentSlots: [ + { x: 4, y: 22, role: 'reserve', unitId: 'liu-bei', label: '후방 피난 지휘' }, + { x: 5, y: 20, role: 'front', unitId: 'guan-yu', label: '전열 받침' }, + { x: 6, y: 22, role: 'front', unitId: 'zhang-fei', label: '장판교 전열' }, + { x: 8, y: 20, role: 'flank', unitId: 'zhao-yun', label: '피난로 기동' }, + { x: 5, y: 23, role: 'support', unitId: 'zhuge-liang', label: '퇴로 판단' }, + { x: 6, y: 24, role: 'support', unitId: 'sun-qian', label: '사절 기록' } + ], + note: '장판파 피난로는 유비와 조운 생존이 핵심입니다. 조운으로 중앙 피난로를 열고, 장비와 관우가 장판교 길목을 막아 제갈량과 손건이 강동에 전할 근거를 남기는 편성이 좋습니다.' + }, map: nineteenthBattleMap, units: nineteenthBattleUnits, bonds: nineteenthBattleBonds, mapTextureKey: 'battle-map-nineteenth', leaderUnitId: 'changban-leader-cao-chun', - quickVictoryTurnLimit: 28, + quickVictoryTurnLimit: 36, baseVictoryGold: 2220, objectives: [ { @@ -2582,21 +2629,39 @@ export const nineteenthBattleScenario: BattleScenarioDefinition = { kind: 'secure-terrain', label: '피난민 마을 확보', rewardGold: 820, - terrain: 'village' + terrain: 'village', + targetTile: { x: 20, y: 20, radius: 6 }, + threatRadius: 0 + }, + { + id: 'changban-bridge', + kind: 'secure-terrain', + label: '장판교 길목 확보', + rewardGold: 760, + terrain: 'road', + targetTile: { x: 23, y: 22, radius: 6 }, + threatRadius: 0 }, { id: 'quick', kind: 'quick-victory', - label: '28턴 이내 승리', + label: '36턴 이내 승리', rewardGold: 620, - maxTurn: 28 + maxTurn: 36 } ], defeatConditions: [ { kind: 'unit-defeated', unitId: 'liu-bei' }, { kind: 'unit-defeated', unitId: 'zhao-yun' } ], - itemRewards: ['콩 7', '상처약 5', '탁주 2', '피난로 지도 +1', '강동 풍문 +1'], + itemRewards: ['콩 7', '상처약 5', '탁주 2', '피난로 지도 +1', '장판교 방어 기록 +1', '강동 풍문 +1'], + campaignReward: { + supplies: ['콩 7', '상처약 5', '탁주 2'], + reputation: ['피난민 보호 +1', '장판교 방어 기록 +1', '강동 풍문 +1'], + unlockBattleId: 'twentieth-battle-jiangdong-envoy', + unlockLabel: '강동 사절로 개방', + note: '장판파에서 백성과 조운을 지켜 강동에 조조 남하를 전할 명분을 확보합니다.' + }, victoryPages: nineteenthBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/campaignFlow.ts b/src/game/data/campaignFlow.ts index 1bfa0d6..8e8f779 100644 --- a/src/game/data/campaignFlow.ts +++ b/src/game/data/campaignFlow.ts @@ -411,8 +411,8 @@ const sortieFlows: Record = { eyebrow: '다음 전장', title: twentiethBattleScenario.title, description: - '장판파에서 피난로를 열어 백성과 군을 다시 모았습니다. 이제 제갈량과 손건을 강나루까지 보내 강동 사절의 길을 열어야 합니다.', - rewardHint: `예상 보상: ${twentiethBattleScenario.title} 개방 / 강동 사절 문서 확보`, + '장판파에서 피난민 마을과 장판교 길목을 지켜 백성과 군을 다시 모았습니다. 이제 제갈량과 손건을 강나루까지 보내 강동 사절의 길을 열어야 합니다.', + rewardHint: `예상 보상: ${twentiethBattleScenario.title} 개방 / 피난민 보호·장판교 방어 기록`, nextBattleId: twentiethBattleScenario.id, campaignStep: 'twentieth-battle', pages: [...nineteenthBattleVictoryPages, ...twentiethBattleIntroPages] diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index 2f937b7..a2789d5 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -1517,7 +1517,7 @@ export const nineteenthBattleIntroPages: StoryPage[] = [ chapter: '조조의 남하', background: 'story-red-cliffs', speaker: '손건', - text: '박망파에서 시간을 벌었지만 조조의 대군은 멈추지 않았습니다. 신야의 백성들이 남쪽으로 몰리고, 장판파 길목에는 추격 기병이 먼저 닿고 있습니다.' + text: '박망파에서 시간을 벌었지만 조조의 대군은 멈추지 않았습니다. 신야의 백성들이 남쪽으로 몰리고, 중앙 피난민 마을과 장판교 길목에는 추격 기병이 먼저 닿고 있습니다.' }, { id: 'nineteenth-zhao-yun-rescue', @@ -1525,7 +1525,7 @@ export const nineteenthBattleIntroPages: StoryPage[] = [ chapter: '백마의 구원', background: 'story-red-cliffs', speaker: '조운', - text: '주공, 피난 행렬이 흩어지면 백성도 군도 모두 잃습니다. 제가 앞뒤를 오가며 길을 묶겠습니다. 다리와 마을을 먼저 지켜 주십시오.' + text: '주공, 피난 행렬이 흩어지면 백성도 군도 모두 잃습니다. 제가 중앙 마을과 다리목 사이를 오가며 길을 묶겠습니다. 장판교는 익덕 장군께 맡겨 주십시오.' }, { id: 'nineteenth-zhang-fei-bridge', @@ -1534,7 +1534,7 @@ export const nineteenthBattleIntroPages: StoryPage[] = [ background: 'story-red-cliffs', speaker: '장비', portrait: 'zhangFei', - text: '형님은 백성을 이끌고 남쪽 길을 보시오. 뒤쫓는 놈들은 제가 다리목에서 한 번 꺾어 놓겠습니다. 다만 누가 옆을 받쳐 줄지는 잘 골라야겠소!' + text: '형님은 백성을 이끌고 남쪽 길을 보시오. 뒤쫓는 놈들은 제가 장판교 길목에서 한 번 꺾어 놓겠습니다. 다만 전열을 받쳐 줄 장수는 곁에 붙여 주시오!' }, { id: 'nineteenth-changban-sortie', @@ -1543,7 +1543,7 @@ export const nineteenthBattleIntroPages: StoryPage[] = [ background: 'story-red-cliffs', speaker: '유비', portrait: 'liuBei', - text: '오늘의 싸움은 이기는 것만으로 끝나지 않소. 백성이 지나갈 길을 열고, 조운과 익덕이 무너지지 않게 서로 받쳐야 하오. 함께할 무장을 신중히 정합시다.' + text: '오늘의 싸움은 이기는 것만으로 끝나지 않소. 조운은 피난로를 열고, 익덕은 장판교를 막으며, 나는 후방에서 백성을 모으겠소. 함께할 무장을 신중히 정합시다.' } ]; @@ -1553,7 +1553,7 @@ export const nineteenthBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '피난로가 열리다', background: 'story-red-cliffs', - text: '장판파의 먼지 속에서 유비군은 피난 행렬을 가까스로 남쪽 길로 흘려보냈습니다. 조운의 창과 장비의 호령이 무너질 뻔한 길목을 붙들었습니다.' + text: '장판파의 먼지 속에서 유비군은 중앙 마을의 피난 행렬을 가까스로 남쪽 길로 흘려보냈습니다. 조운의 창과 장비의 호령이 무너질 뻔한 장판교 길목을 붙들었습니다.' }, { id: 'nineteenth-zhao-yun-returns', @@ -1569,7 +1569,7 @@ export const nineteenthBattleVictoryPages: StoryPage[] = [ chapter: '강동으로 보낼 사절', background: 'story-red-cliffs', speaker: '제갈량', - text: '조조의 남하는 이제 강동도 외면할 수 없습니다. 장판파에서 지켜낸 백성의 길과 조조군의 속도를 함께 전하면, 손권과 마주 앉을 명분이 생깁니다.' + text: '조조의 남하는 이제 강동도 외면할 수 없습니다. 장판파에서 지켜낸 백성의 길, 장판교 방어 기록, 조조군의 속도를 함께 전하면 손권과 마주 앉을 명분이 생깁니다.' } ]; diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index e0c0478..2517005 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -776,15 +776,30 @@ const sortieRulesByBattleId: Partial