diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index 3a216c9..d6f1895 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -6923,6 +6923,82 @@ export const fortyEighthBattleScenario: BattleScenarioDefinition = { '마을, 포로 수용소, 산채 창고를 함부로 불태우지 마십시오. 회유할 사람과 끝까지 싸울 사람을 구분해야 남중이 다시 반란으로 돌아가지 않습니다.', '제갈량은 반드시 생존해야 합니다. 조운과 마초로 돌격을 막고, 왕평과 황권으로 포로와 산길을 정리하며, 마량으로 마을의 말을 붙잡으십시오.' ], + tacticalGuide: { + summary: + '맹획 본대전은 칠종칠금 흐름의 첫 장입니다. 맹획을 쓰러뜨리는 전투가 아니라, 포로장과 회유 마을을 보존한 채 생포하고 풀어 주어 남중 사람들에게 촉한군의 군율을 보이는 전투입니다.', + route: '서쪽 생포망 정렬 -> 중앙 회유 마을 보호 -> 포로 수용소 확보 -> 맹수 기병 돌격 차단 -> 산채 본영 압박 -> 맹획 생포와 석방', + focus: + '빠른 격파보다 전장 질서가 중요합니다. 포로 수용소와 마을 목표를 챙기면 결과 화면에서 맹획을 돌려보내는 선택이 단순 자비가 아니라 책략으로 읽힙니다.', + roles: [ + '제갈량: 맹획 생포와 석방 방침을 정하는 지휘관입니다. 전열에 깊게 들어가기보다 생포망 뒤에서 방향을 잡아야 합니다.', + '마량: 회유 문서와 마을 설득의 중심입니다. 마을 목표를 놓치면 남중 사람들이 촉한군을 믿기 어렵습니다.', + '왕평: 숲길, 늪지, 산채 길을 읽어 복병과 맹수 기병의 측면 돌파를 줄입니다.', + '황권: 포로 명부와 군량 장부를 지켜 약탈 없는 전후 처리를 증명합니다.', + '조운/마초: 맹수 기병의 첫 돌격을 받아 내고 생포망이 흩어지지 않게 앞선을 묶습니다.', + '황충: 고지 궁병과 주술사를 멀리서 눌러 포로 수용소 주변의 피해를 줄입니다.' + ], + events: { + 'ally-danger': { + title: '생포 방침', + lines: [ + '제갈량: 맹획을 베면 오늘은 조용해져도 남중의 마음은 더 깊은 산으로 숨어듭니다. 반드시 생포하십시오.', + '마량: 마을과 포로장을 지켜야 그 말을 믿게 할 수 있습니다.' + ] + }, + 'village-approach': { + title: '회유 마을', + lines: [ + '마량: 저 마을 사람들이 오늘의 싸움을 지켜보고 있습니다. 먼저 보호해야 말이 닿습니다.', + '왕평: 마을 뒤 늪길이 매복 자리입니다. 길을 끊고 들어가겠습니다.' + ] + }, + 'enemy-posture': { + title: '맹수 돌격', + lines: [ + '조운: 맹수 기병이 먼저 들이받으면 포위망이 무너집니다. 제가 첫 충격을 받겠습니다.', + '마초: 짐승이든 기병이든 옆구리를 잡히면 돌격은 멈춘다.' + ] + }, + 'leader-wavering': { + title: '맹획 본대', + lines: [ + '맹획: 남중의 산은 촉한의 글월보다 우리 창과 짐승을 더 잘 안다.', + '제갈량: 오늘은 창으로 길을 열고, 글월로 마음을 남기겠습니다.' + ] + } + } + }, + sortie: { + sortieLimit: 7, + requiredUnits: ['zhuge-liang'], + recommendedUnits: [ + { unitId: 'zhuge-liang', role: 'support', reason: '맹획 생포와 회유 방침을 직접 지휘하는 필수 장수입니다.' }, + { unitId: 'ma-liang', role: 'support', reason: '회유 문서와 마을 설득의 핵심 참모입니다.' }, + { unitId: 'wang-ping', role: 'flank', reason: '늪지와 산채 길을 읽어 복병과 포로 수용소를 안정시킵니다.' }, + { unitId: 'huang-quan', role: 'support', reason: '포로 명부와 군량 장부를 나누어 약탈 없는 전후 처리를 돕습니다.' }, + { unitId: 'zhao-yun', role: 'front', reason: '맹수 기병의 첫 돌격을 받아 내고 후위를 회수합니다.' }, + { unitId: 'ma-chao', role: 'front', reason: '강한 기병 압박으로 맹획의 측면 돌파를 묶습니다.' }, + { unitId: 'huang-zhong', role: 'flank', reason: '고지 궁병과 주술사를 안정적으로 견제합니다.' } + ], + recommendedClasses: [ + { label: '회유 지휘', classKeys: ['strategist'], reason: '생포와 석방 방침을 유지하는 전투의 중심입니다.' }, + { label: '생포망 전열', classKeys: ['infantry', 'spearman'], reason: '맹획 본대가 빠져나가지 못하게 전열을 닫아야 합니다.' }, + { label: '맹수 대응', classKeys: ['cavalry'], reason: '맹수 기병과 측면 돌파를 빠르게 받아칩니다.' }, + { label: '고지 견제', classKeys: ['archer'], reason: '고지 궁병과 주술사를 눌러 포로장 피해를 줄입니다.' }, + { label: '포로 장부', classKeys: ['strategist'], reason: '포로와 군량을 구분해 약탈 없는 전후 처리를 보여 줍니다.' } + ], + deploymentSlots: [ + { x: 10, y: 54, role: 'support', unitId: 'zhuge-liang', label: '회유 지휘' }, + { x: 14, y: 51, role: 'support', unitId: 'ma-liang', label: '마을 설득' }, + { x: 25, y: 50, role: 'flank', unitId: 'wang-ping', label: '늪길 판독' }, + { x: 8, y: 52, role: 'support', unitId: 'huang-quan', label: '포로 장부' }, + { x: 20, y: 53, role: 'front', unitId: 'zhao-yun', label: '생포망 선봉' }, + { x: 34, y: 53, role: 'front', unitId: 'ma-chao', label: '맹수 대응' }, + { x: 23, y: 55, role: 'flank', unitId: 'huang-zhong', label: '고지 견제' } + ], + note: + '맹획 본대전은 적장을 베는 전투가 아닙니다. 마을과 포로 수용소를 지킨 뒤 맹획을 생포해 풀어 주어, 다음 칠종칠금 전투의 설득 흐름을 만드십시오.' + }, map: fortyEighthBattleMap, units: fortyEighthBattleUnits, bonds: fortyEighthBattleBonds, @@ -6950,14 +7026,18 @@ export const fortyEighthBattleScenario: BattleScenarioDefinition = { kind: 'secure-terrain', label: '회유 마을 보호', rewardGold: 3580, - terrain: 'village' + terrain: 'village', + targetTile: { x: 52, y: 48, radius: 6 }, + threatRadius: 0 }, { id: 'captive-camps', kind: 'secure-terrain', label: '포로 수용소 확보', rewardGold: 2860, - terrain: 'camp' + terrain: 'camp', + targetTile: { x: 60, y: 59, radius: 5 }, + threatRadius: 0 }, { id: 'quick', @@ -6969,6 +7049,14 @@ export const fortyEighthBattleScenario: BattleScenarioDefinition = { ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'zhuge-liang' }], itemRewards: ['콩 44', '상처약 32', '탁주 14', '맹획 회유 서신 1', '남중 포로 명부 1'], + campaignReward: { + supplies: ['콩 44', '상처약 32', '탁주 14'], + equipment: ['남중 포로 명부 1'], + reputation: ['맹획 회유 서신 1'], + unlockLabel: '칠종칠금 2차전', + note: + '맹획은 첫 생포 뒤 풀려났습니다. 남중 사람들은 촉한군이 약탈 대신 회유를 택한 것을 보았고, 다음 전투부터는 같은 맹획 생포라도 마을과 포로장의 신뢰를 더 넓게 붙잡아야 합니다.' + }, victoryPages: fortyEighthBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index d2881a9..d3bdf7f 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -3458,7 +3458,7 @@ export const fortyEighthBattleIntroPages: StoryPage[] = [ chapter: '맹획의 깃발', background: 'story-nanzhong-captures', speaker: '왕평', - text: '옹개의 지휘선은 흩어졌지만 남중의 마을들은 아직 촉한군을 멀리서 바라봅니다. 깊은 숲 안쪽에서는 맹획이 여러 호족을 모아, 첫 패배를 갚겠다고 병력을 다시 세우고 있습니다.' + text: '옹개의 지휘선은 흩어졌지만 남중의 마을들은 아직 촉한군을 멀리서 바라봅니다. 깊은 숲 안쪽에서는 맹획이 호족과 맹수 기병을 모아, 첫 패배를 갚겠다고 병력을 다시 세우고 있습니다.' }, { id: 'forty-eighth-zhuge-amnesty', @@ -3466,7 +3466,7 @@ export const fortyEighthBattleIntroPages: StoryPage[] = [ chapter: '힘과 회유', background: 'story-nanzhong-captures', speaker: '제갈량', - text: '맹획을 쓰러뜨리는 것만으로는 남중을 얻을 수 없습니다. 반드시 생포하여 돌려보낼 길을 남기십시오. 마을과 포로 수용소를 지키면, 다음 싸움에서 칼보다 말이 먼저 닿을 것입니다.' + text: '맹획을 쓰러뜨리는 것만으로는 남중을 얻을 수 없습니다. 반드시 생포하여 돌려보낼 길을 남기십시오. 회유 마을과 포로 수용소를 지키면, 다음 싸움에서 칼보다 말이 먼저 닿을 것입니다.' }, { id: 'forty-eighth-sortie', @@ -3474,7 +3474,7 @@ export const fortyEighthBattleIntroPages: StoryPage[] = [ chapter: '맹획 본대전', background: 'story-nanzhong-captures', speaker: '마량', - text: '맹획의 본대는 숲길, 늪지, 산채를 함께 쓰고 있습니다. 조운과 마초가 돌격을 막고, 왕평이 지형을 읽으며, 황권이 포로와 군량의 장부를 흐트러뜨리지 않아야 합니다.' + text: '맹획의 본대는 숲길, 늪지, 산채를 함께 쓰고 있습니다. 조운과 마초가 맹수 돌격을 막고, 왕평이 길을 읽으며, 황권이 포로와 군량의 장부를 흐트러뜨리지 않아야 합니다.' } ]; @@ -3484,7 +3484,7 @@ export const fortyEighthBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '첫 생포', background: 'story-nanzhong-captures', - text: '맹획의 본대는 흩어졌고, 촉한군은 산채의 불길을 키우지 않은 채 포로와 마을 사람을 갈라 세웠습니다. 병사들은 적장을 베지 않고 생포하는 싸움이 왜 어려운지 처음으로 깨달았습니다.' + text: '맹획의 본대는 흩어졌고, 촉한군은 산채의 불길을 키우지 않은 채 포로장과 회유 마을을 갈라 지켰습니다. 병사들은 적장을 베지 않고 생포하는 싸움이 왜 어려운지 처음으로 깨달았습니다.' }, { id: 'forty-eighth-victory-release', @@ -3500,7 +3500,7 @@ export const fortyEighthBattleVictoryPages: StoryPage[] = [ chapter: '칠종칠금의 첫 장', background: 'story-nanzhong-captures', speaker: '마량', - text: '맹획은 풀려났으나 산속의 호족들은 이제 촉한군의 태도를 보았습니다. 다음 싸움부터는 힘뿐 아니라 누구를 먼저 달래고 누구를 끝까지 추격할지 선택해야 합니다.' + text: '맹획은 풀려났으나 산속의 호족들은 이제 촉한군의 태도를 보았습니다. 다음 싸움부터는 포로장과 마을의 신뢰를 잃지 않으면서, 누구를 달래고 누구를 끝까지 추격할지 선택해야 합니다.' } ]; diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index 297a83b..ff17410 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -1605,14 +1605,30 @@ const sortieRulesByBattleId: Partial