diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index 7c3e1ea..1269300 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -1688,16 +1688,85 @@ export const thirteenthBattleScenario: BattleScenarioDefinition = { victoryConditionLabel: '여포 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ - '여포가 하비 성 안에서 마지막 돌파를 준비합니다. 여포를 격파하면 서주를 뒤흔든 난전도 끝을 맞습니다.', - '진궁은 성루 궁병과 수문 수비를 이용해 접근로를 끊으려 합니다. 기병 돌파대와 성문 수비대를 나누어 상대하십시오.', - '성문 요새를 확보하고 22턴 안에 승리하면 조조 휘하에서도 유비군의 전공과 독자 보급 명분을 모두 남길 수 있습니다.' + '여포가 하비 성 안에서 마지막 돌파를 준비합니다. 성문 전열을 밀어내고 수문 쪽 포위망을 닫아야 비장군의 기동을 묶을 수 있습니다.', + '진궁은 성루 궁병과 수문 수비로 접근로를 끊으려 합니다. 관우가 성문을 누르고 장비가 기병 돌파를 끊는 동안, 책사와 보급 장수가 전열을 붙잡아야 합니다.', + '성문과 수문 포위망을 확보하고 35턴 안에 승리하면 조조 휘하에서도 유비군의 전공, 보급 명분, 새 인맥을 모두 남길 수 있습니다.' ], + tacticalGuide: { + summary: '서남 진영에서 성문 전열을 밀고, 수문 쪽 포위망을 닫은 뒤 여포의 마지막 돌격을 고립시키는 결전입니다.', + route: '서남 진영 → 수문 둑길 → 하비 성문 → 여포 본진', + focus: + '성문만 바라보면 여포 기병이 남쪽 길로 빠져나옵니다. 관우는 중앙 요새를 누르고, 장비는 수문 둑길의 기병을 끊으며, 간옹과 미축은 진궁의 책략과 회복선을 동시에 관리해야 합니다.', + roles: [ + '유비: 후방 지휘와 조조군 앞 명분 유지', + '관우: 성문 요새 정면 돌파', + '장비: 남쪽 수문 둑길 기병 차단', + '간옹: 진궁 책략 견제와 전황 보고', + '미축: 회복품 운용과 포위망 보급 유지' + ], + events: { + 'village-approach': { + title: '하비 포위망 접근', + lines: [ + '성문과 수문 주변을 나누어 누르면 여포군의 돌파로가 좁아집니다.', + '이 길목을 잡아 두면 진궁의 궁병과 기병을 따로 떼어 상대할 수 있습니다.' + ] + }, + 'enemy-posture': { + title: '하비 성내 진형', + lines: [ + '성루 궁병은 중앙 길을 겨누고, 진궁은 수문 쪽 퇴로와 요새 수비를 함께 묶고 있습니다.', + '관우가 성문을 압박하는 동안 장비가 남쪽 기병을 막으면 여포가 돌파할 공간이 줄어듭니다.' + ] + }, + 'cavalry-approach': { + title: '여포군 최후 돌격', + lines: [ + '여포군 기병이 성 안쪽 길을 타고 포위망의 빈틈을 찾습니다.', + '장비를 둑길에 세우고 미축의 회복선을 유지하면 돌격을 받아친 뒤 성문으로 역압박할 수 있습니다.' + ] + }, + 'leader-wavering': { + title: '여포 본진 고립', + lines: [ + '성문과 수문이 흔들리자 여포의 돌파로가 좁아지고 있습니다.', + '유비를 무리하게 앞세우지 말고 관우와 장비가 양쪽 길을 닫으면 결전의 끝이 보입니다.' + ] + } + } + }, + sortie: { + sortieLimit: 5, + requiredUnits: ['liu-bei'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'support', reason: '조조 앞에서 여포의 끝을 두고 말해야 할 주장입니다. 후방 지휘와 생존을 맡깁니다.' }, + { unitId: 'guan-yu', role: 'front', reason: '하비 성문 요새를 정면에서 밀어낼 핵심 전열입니다.' }, + { unitId: 'zhang-fei', role: 'flank', reason: '수문 둑길로 빠지는 여포군 기병 돌파를 끊는 측면 차단 역할입니다.' }, + { unitId: 'jian-yong', role: 'support', reason: '진궁의 책략과 조조군 시선을 동시에 살피며 전황 보고를 정리합니다.' }, + { unitId: 'mi-zhu', role: 'reserve', 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: 'jian-yong', x: 5, y: 19, label: '책략 견제' }, + { role: 'reserve', unitId: 'mi-zhu', x: 3, y: 21, label: '보급 유지' } + ], + note: '하비 결전은 성문 돌파와 수문 차단을 동시에 보는 전투입니다. 추천 배치는 관우가 중앙을 누르고 장비가 남쪽 기병을 끊으며, 유비와 책사/보급 장수가 뒤에서 전열을 지키는 형태입니다.' + }, map: thirteenthBattleMap, units: thirteenthBattleUnits, bonds: thirteenthBattleBonds, mapTextureKey: 'battle-map-thirteenth', leaderUnitId: 'xiapi-final-leader-lu-bu', - quickVictoryTurnLimit: 22, + quickVictoryTurnLimit: 35, baseVictoryGold: 1560, objectives: [ { @@ -1717,20 +1786,40 @@ export const thirteenthBattleScenario: BattleScenarioDefinition = { { id: 'gate', kind: 'secure-terrain', - label: '하비 성문 확보', + label: '하비 성문 돌파', rewardGold: 560, - terrain: 'fort' + terrain: 'fort', + targetTile: { x: 27, y: 12, radius: 3 }, + threatRadius: 1 + }, + { + id: 'sluice', + kind: 'secure-terrain', + label: '수문 포위망 장악', + rewardGold: 520, + terrain: 'fort', + targetTile: { x: 26, y: 15, radius: 3 }, + threatRadius: 1 }, { id: 'quick', kind: 'quick-victory', - label: '22턴 이내 승리', + label: '35턴 이내 승리', rewardGold: 420, - maxTurn: 22 + maxTurn: 35 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 5', '상처약 3', '탁주 2', '하비 결전 공적 +1'], + campaignReward: { + supplies: ['콩 5', '상처약 3', '탁주 2'], + equipment: ['하비 군령패 1'], + reputation: ['하비 결전 공적 +1', '여포 토벌 명성 +1'], + recruits: ['sun-qian'], + unlockBattleId: 'fourteenth-battle-cao-break', + unlockLabel: '서주 재기 개방', + note: '성문과 수문 포위망을 함께 장악해 여포의 마지막 돌파를 꺾고, 손건이 조조의 감시망을 벗어날 문서와 길을 준비합니다.' + }, victoryPages: thirteenthBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/campaignFlow.ts b/src/game/data/campaignFlow.ts index fc65e25..acb54b6 100644 --- a/src/game/data/campaignFlow.ts +++ b/src/game/data/campaignFlow.ts @@ -345,7 +345,7 @@ const sortieFlows: Record = { eyebrow: '다음 전장', title: fourteenthBattleScenario.title, description: - '여포가 무너진 뒤 조조의 경계는 더 깊어졌습니다. 손건이 합류해 서주 길목의 문서와 민심을 준비하고, 유비군은 조조의 장막 밖으로 나갈 첫 전투를 맞습니다.', + '하비 성문과 수문 포위망이 닫히며 여포는 무너졌지만, 조조의 경계는 더 깊어졌습니다. 손건이 합류해 서주 길목의 문서와 민심을 준비하고, 유비군은 조조의 장막 밖으로 나갈 첫 전투를 맞습니다.', rewardHint: `예상 보상: ${fourteenthBattleScenario.title} 개방 / 손건 합류`, nextBattleId: fourteenthBattleScenario.id, campaignStep: 'fourteenth-battle', diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index 29a11ba..bc0bc6e 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -1134,16 +1134,16 @@ export const thirteenthBattleIntroPages: StoryPage[] = [ bgm: 'story-dark', chapter: '하비 결전의 명', background: 'story-wandering', - text: '하비 외곽이 무너지자 조조는 마지막 총공세를 명했다. 성 안의 여포는 아직 강했고, 진궁은 남은 성루와 수문을 엮어 마지막 반격을 준비하고 있었다.' + text: '하비 외곽의 둑길이 무너지자 조조는 마지막 총공세를 명했다. 성 안의 여포는 성문 뒤에 기병을 모았고, 진궁은 수문 둑길과 성루 궁병을 엮어 돌파로를 남겨 두었다.' }, { id: 'thirteenth-brothers-before-final', bgm: 'militia-theme', - chapter: '여포를 앞두고', + chapter: '성문과 수문', background: 'story-wandering', speaker: '관우', portrait: 'guanYu', - text: '형님, 여포는 용맹하나 믿음이 얕습니다. 다만 그 칼끝이 어지러운 세상의 그림자라면, 오늘 싸움 뒤에 우리 길도 더 뚜렷해질 것입니다.' + text: '형님, 성문을 곧장 치면 여포의 기병이 수문 길로 빠져나옵니다. 제가 성문 전열을 누르겠습니다. 장비가 남쪽 둑길을 막으면 여포는 안에서 돌 길밖에 없습니다.' }, { id: 'thirteenth-liu-bei-resolve', @@ -1152,7 +1152,7 @@ export const thirteenthBattleIntroPages: StoryPage[] = [ background: 'story-wandering', speaker: '유비', portrait: 'liuBei', - text: '조조의 명으로 싸우되, 백성의 원망을 덜고 난세의 사슬을 끊기 위해 싸운다. 여포의 끝을 보더라도 우리의 뜻까지 맡기지는 말자.' + text: '조조의 명으로 싸우되, 오늘의 칼은 백성의 원망을 덜기 위한 칼이어야 한다. 성문과 수문을 함께 닫아 피해를 줄이고, 여포의 끝을 보더라도 우리의 뜻까지 맡기지는 말자.' }, { id: 'thirteenth-xiapi-final-sortie', @@ -1161,7 +1161,7 @@ export const thirteenthBattleIntroPages: StoryPage[] = [ background: 'story-wandering', speaker: '장비', portrait: 'zhangFei', - text: '좋습니다, 형님. 이번엔 성문을 열고 여포의 깃발까지 밀고 들어가겠습니다. 누가 함께 나설지 정해 주십시오. 대기한 자도 다음 싸움을 위해 힘을 아껴야 합니다.' + text: '좋습니다, 형님. 관우 형님이 성문을 붙들면 저는 수문 둑길을 막겠습니다. 간옹은 진궁의 수를 보게 하고, 미축은 회복품을 챙기게 하십시오. 준비되면 여포의 깃발까지 밀고 들어가겠습니다.' } ]; @@ -1171,7 +1171,7 @@ export const thirteenthBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '무너진 여포', background: 'story-wandering', - text: '하비 성내의 마지막 저항이 꺾이고 여포의 깃발이 내려갔다. 뛰어난 무용도 믿음을 잃으면 성 하나를 지키지 못한다는 소문이 병사들 사이에 퍼졌다.' + text: '성문 전열이 무너지고 수문 둑길이 막히자 여포의 마지막 기병도 흩어졌다. 하비 성내의 저항은 꺾였고, 뛰어난 무용도 믿음을 잃으면 성 하나를 지키지 못한다는 소문이 병사들 사이에 퍼졌다.' }, { id: 'thirteenth-cao-cao-weighs-liu-bei', @@ -1179,7 +1179,7 @@ export const thirteenthBattleVictoryPages: StoryPage[] = [ chapter: '칭찬과 경계', background: 'story-wandering', speaker: '간옹', - text: '조조는 형님의 말을 들은 뒤 오래 웃지 않았네. 여포의 운명은 끝났지만, 이제부터는 조조가 우리를 어디까지 품고 어디서부터 경계할지 살펴야 하네.' + text: '조조는 형님의 말을 들은 뒤 오래 웃지 않았네. 여포의 운명은 끝났지만, 성문과 수문을 함께 닫은 전공도 조조 눈에는 또 다른 칼로 보일 걸세.' }, { id: 'thirteenth-road-to-cao-break', @@ -1188,7 +1188,7 @@ export const thirteenthBattleVictoryPages: StoryPage[] = [ background: 'story-wandering', speaker: '유비', portrait: 'liuBei', - text: '오늘 싸움으로 빚도 공도 쌓였다. 그러나 의로 시작한 길을 남의 장부 속 숫자로 끝낼 수는 없다. 떠날 때가 오면 망설이지 않도록 마음을 단단히 하자.' + text: '오늘 싸움으로 빚도 공도 쌓였다. 손건이 서주 길목의 문서를 준비한다 하니, 떠날 때가 오면 망설이지 않도록 마음을 단단히 하자. 의로 시작한 길을 남의 장부 속 숫자로 끝낼 수는 없다.' } ]; diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index a29566a..a519644 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -706,12 +706,13 @@ const sortieRulesByBattleId: Partial