From dd1e5cf6510532ff5b3820b17061f21f4e43d61f Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 4 Jul 2026 19:47:31 +0900 Subject: [PATCH] Refine Luofeng ambush battle flow --- src/game/data/battles.ts | 115 ++++++++++++++++++++++++++++++++-- src/game/data/campaignFlow.ts | 2 +- src/game/data/scenario.ts | 12 ++-- src/game/scenes/CampScene.ts | 30 ++++++--- 4 files changed, 139 insertions(+), 20 deletions(-) diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index 918594c..f717d14 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -4269,15 +4269,82 @@ export const thirtiethBattleScenario: BattleScenarioDefinition = { 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', 'pang-tong'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'reserve', reason: '낙봉파 돌파 명분이자 패배 조건의 중심입니다.' }, + { unitId: 'pang-tong', role: 'support', reason: '매복을 읽는 핵심 책사이며 반드시 살려야 하는 생존 조건입니다.' }, + { unitId: 'wu-yi', role: 'flank', reason: '낙봉파 샛길과 고지 매복 위치를 아는 새 합류 안내역입니다.' }, + { unitId: 'fa-zheng', role: 'support', reason: '장임의 방어 습관과 익주 장수들의 심리를 읽어 매복 대응을 돕습니다.' }, + { unitId: 'zhao-yun', role: 'flank', reason: '후미 기병과 복병을 빠르게 차단해 방통의 퇴로를 지킵니다.' }, + { unitId: 'huang-zhong', role: 'support', reason: '고지 궁병과 성루 궁병을 안정적으로 견제합니다.' } + ], + recommendedClasses: [ + { label: '돌파 명분', classKeys: ['lord'], reason: '유비가 살아 남아야 낙봉파 돌파의 명분이 유지됩니다.' }, + { label: '매복 판독', classKeys: ['strategist'], reason: '방통과 법정이 있으면 매복 경고와 적 심리 판단이 안정됩니다.' }, + { label: '현지 안내', classKeys: ['infantry', 'spearman'], reason: '오의 같은 현지 장수가 샛길과 퇴로 확보를 돕습니다.' }, + { label: '후미 차단', classKeys: ['cavalry'], reason: '기동 장수가 후미 기병과 복병을 끊어 방통을 지킵니다.' }, + { label: '고지 견제', classKeys: ['archer'], reason: '황충의 원거리 견제가 고지 궁병의 압박을 줄입니다.' } + ], + deploymentSlots: [ + { x: 4, y: 36, role: 'reserve', unitId: 'liu-bei', label: '돌파 명분' }, + { x: 9, y: 36, role: 'support', unitId: 'pang-tong', label: '매복 판독' }, + { x: 12, y: 36, role: 'flank', unitId: 'wu-yi', label: '길 안내' }, + { x: 11, y: 38, role: 'support', unitId: 'fa-zheng', label: '속내 읽기' }, + { x: 8, y: 36, role: 'flank', unitId: 'zhao-yun', label: '후미 차단' }, + { x: 7, y: 37, role: 'support', unitId: 'huang-zhong', label: '고지 견제' } + ], + note: + '낙봉파 매복전은 방통 생환이 핵심입니다. 오의를 데려가면 길 안내가 강해지지만 전열 무장이 줄어드므로, 후미 차단과 고지 견제를 누가 맡을지 먼저 정해야 합니다.' + }, map: thirtiethBattleMap, units: thirtiethBattleUnits, bonds: thirtiethBattleBonds, mapTextureKey: 'battle-map-thirtieth', leaderUnitId: 'luofeng-leader-zhang-ren', - quickVictoryTurnLimit: 39, + quickVictoryTurnLimit: 62, baseVictoryGold: 4440, objectives: [ { @@ -4306,14 +4373,43 @@ export const thirtiethBattleScenario: BattleScenarioDefinition = { kind: 'secure-terrain', label: '낙봉파 길목 확보', rewardGold: 1320, - terrain: 'village' + terrain: 'village', + targetTile: { x: 44, y: 21, radius: 14 }, + threatRadius: 0 + }, + { + id: 'luofeng-ambush-slope', + kind: 'secure-terrain', + label: '매복 비탈 탐색', + rewardGold: 1280, + terrain: 'road', + targetTile: { x: 48, y: 23, radius: 13 }, + threatRadius: 0 + }, + { + id: 'luofeng-high-archers', + kind: 'secure-terrain', + label: '고지 궁병 억제', + rewardGold: 1340, + terrain: 'fort', + targetTile: { x: 47, y: 17, radius: 14 }, + threatRadius: 0 + }, + { + id: 'luofeng-rear-cavalry', + kind: 'secure-terrain', + label: '후미 기병 차단', + rewardGold: 1300, + terrain: 'road', + targetTile: { x: 51, y: 29, radius: 14 }, + threatRadius: 0 }, { id: 'quick', kind: 'quick-victory', - label: '39턴 이내 승리', + label: '62턴 이내 승리', rewardGold: 1040, - maxTurn: 39 + maxTurn: 62 } ], defeatConditions: [ @@ -4321,6 +4417,13 @@ export const thirtiethBattleScenario: BattleScenarioDefinition = { { kind: 'unit-defeated', unitId: 'pang-tong' } ], itemRewards: ['콩 15', '상처약 11', '탁주 6', '낙봉파 정찰표 +1', '봉추 생환 +1'], + campaignReward: { + supplies: ['콩 15', '상처약 11', '탁주 6'], + reputation: ['낙봉파 정찰표 +1', '봉추 생환 +1'], + unlockBattleId: 'thirty-first-battle-luo-main-gate', + unlockLabel: '낙성 본성 공략 개방', + note: '낙봉파의 퇴로와 고지를 정리하고 방통을 살려 냈습니다. 장임은 낙성 본성으로 물러납니다.' + }, victoryPages: thirtiethBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/campaignFlow.ts b/src/game/data/campaignFlow.ts index 0cfa3a5..d2454aa 100644 --- a/src/game/data/campaignFlow.ts +++ b/src/game/data/campaignFlow.ts @@ -532,7 +532,7 @@ const sortieFlows: Record = { eyebrow: '다음 전장', title: thirtyFirstBattleScenario.title, description: - '낙봉파의 매복을 무너뜨리고 방통을 살려 냈습니다. 장임은 낙성 본성으로 물러났고, 익주의 성문과 장수들의 마음을 함께 열어야 할 차례입니다.', + '낙봉파의 퇴로와 고지를 먼저 잡아 매복을 무너뜨리고 방통을 살려 냈습니다. 장임은 낙성 본성으로 물러났고, 익주의 성문과 장수들의 마음을 함께 열어야 할 차례입니다.', rewardHint: `예상 보상: ${thirtyFirstBattleScenario.title} 개방 / 엄안 합류`, nextBattleId: thirtyFirstBattleScenario.id, campaignStep: 'thirty-first-battle', diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index dbb25b1..ffb9b32 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -2210,7 +2210,7 @@ export const thirtiethBattleIntroPages: StoryPage[] = [ chapter: '낙봉파의 좁은 길', background: 'story-yizhou-luo-road', speaker: '오의', - text: '낙성 안쪽으로 들어가는 빠른 길은 낙봉파입니다. 길은 짧지만 양쪽 산세가 높고, 장임이 기다리기에는 지나치게 좋은 곳입니다.' + text: '낙성 안쪽으로 들어가는 빠른 길은 낙봉파입니다. 길은 짧지만 퇴로가 좁고 양쪽 고지가 높아, 장임이 기다리기에는 지나치게 좋은 곳입니다.' }, { id: 'thirtieth-pang-tong-warning', @@ -2218,7 +2218,7 @@ export const thirtiethBattleIntroPages: StoryPage[] = [ chapter: '봉추의 불길한 직감', background: 'story-yizhou-luo-road', speaker: '방통', - text: '좋은 길이 언제나 좋은 길은 아닙니다. 적이 우리를 빠르게 오게 만들었다면, 빠르게 물러날 길도 함께 보아 두어야 합니다.' + text: '좋은 길이 언제나 좋은 길은 아닙니다. 적이 우리를 빠르게 오게 만들었다면, 고지의 화살과 후미 기병, 그리고 빠져나갈 길까지 함께 보아 두어야 합니다.' }, { id: 'thirtieth-roster-pressure', @@ -2226,7 +2226,7 @@ export const thirtiethBattleIntroPages: StoryPage[] = [ chapter: '오의의 첫 출전 선택', background: 'story-yizhou-luo-road', speaker: '법정', - text: '이번 전투부터 오의도 출전 후보입니다. 낙성의 길을 아는 오의를 데려가면 매복을 읽기 쉬우나, 전열과 보급 후보는 더 좁아집니다.' + text: '이번 전투부터 오의도 출전 후보입니다. 낙성의 길을 아는 오의를 데려가면 샛길과 매복 고지를 읽기 쉬우나, 방통까지 지키려면 전열과 보급 후보는 더 좁아집니다.' }, { id: 'thirtieth-luofeng-sortie', @@ -2235,7 +2235,7 @@ export const thirtiethBattleIntroPages: StoryPage[] = [ background: 'story-yizhou-luo-road', speaker: '유비', portrait: 'liuBei', - text: '빠른 길을 택하되 방심하지 않겠소. 방통의 눈, 법정의 정보, 오의의 길 안내를 함께 엮어 장임의 매복을 거꾸로 무너뜨리겠소.' + text: '빠른 길을 택하되 방심하지 않겠소. 퇴로를 먼저 잡고, 방통의 눈과 법정의 정보, 오의의 길 안내를 함께 엮어 장임의 매복을 거꾸로 무너뜨리겠소.' } ]; @@ -2245,7 +2245,7 @@ export const thirtiethBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '매복을 꿰뚫다', background: 'story-yizhou-luo-road', - text: '장임의 매복은 거칠게 덮쳐 왔으나, 유비군은 길목을 버티며 역으로 활로를 열었습니다. 낙봉파의 좁은 비탈에는 무너진 방책과 흩어진 깃발만 남았습니다.' + text: '장임의 매복은 거칠게 덮쳐 왔으나, 유비군은 퇴로와 고지를 먼저 잡고 역으로 활로를 열었습니다. 낙봉파의 좁은 비탈에는 무너진 방책과 흩어진 깃발만 남았습니다.' }, { id: 'thirtieth-pang-tong-survives', @@ -2253,7 +2253,7 @@ export const thirtiethBattleVictoryPages: StoryPage[] = [ chapter: '봉추의 생환', background: 'story-yizhou-luo-road', speaker: '방통', - text: '하마터면 길의 이름값을 할 뻔했습니다. 그러나 이번에는 우리 쪽이 한 수 먼저 보았습니다. 이제 낙성 본성은 더 이상 멀지 않습니다.' + text: '하마터면 길의 이름값을 할 뻔했습니다. 그러나 퇴로를 먼저 잡은 덕에 이번에는 우리 쪽이 한 수 먼저 보았습니다. 이제 낙성 본성은 더 이상 멀지 않습니다.' }, { id: 'thirtieth-next-luo-castle', diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index 0ce2144..1ab037e 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -1076,15 +1076,31 @@ const sortieRulesByBattleId: Partial