From e5764d85ae6e6211726ec47805a7de0d81bf0912 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 4 Jul 2026 20:14:33 +0900 Subject: [PATCH] Refine Chengdu surrender battle flow --- src/game/data/battles.ts | 114 ++++++++++++++++++++++++++++++++-- src/game/data/campaignFlow.ts | 2 +- src/game/data/scenario.ts | 14 ++--- src/game/scenes/CampScene.ts | 30 ++++++--- 4 files changed, 140 insertions(+), 20 deletions(-) diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index e2d4395..05d83b7 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -4772,12 +4772,79 @@ export const thirtyThirdBattleScenario: BattleScenarioDefinition = { '이엄은 방금 합류한 익주 장수로, 이번 전장에서 유비군의 군율을 증언하는 핵심 인물입니다. 이엄을 반드시 지키십시오.', '성도 창고와 마을을 안정시키면 항복 조건에 대한 신뢰가 커지고, 익주 확보 이후의 수습이 쉬워집니다.' ], + tacticalGuide: { + summary: + '성도 항복 권고전은 익주를 불태워 빼앗는 전투가 아니라, 유장이 항복을 선택할 수밖에 없는 조건을 만드는 전장입니다. 이엄의 증언을 지키고 외곽 마을과 창고를 안정시켜 황권의 신중한 판단을 흔들어야 합니다.', + route: '서남 유비군 진영 → 외곽 마을 안정 → 남문 사격선 억제 → 항복 반대파 압박 → 성도 창고 확보 → 황권 방어선 격파', + focus: + '이엄은 면죽관에서 본 군율을 증언하는 핵심 생존 조건입니다. 제갈량과 법정은 항복 조건을 정리하고, 엄안과 오의는 익주 장수와 지형의 말길을 이어 줍니다.', + roles: [ + '유비: 성도 항복 권고와 패배 조건의 중심', + '이엄: 면죽관 군율을 증언하는 새 합류 장수', + '제갈량: 항복 조건과 익주 수습책 설계', + '법정: 황권의 신중한 판단과 유장 진영 속내 해석', + '엄안: 익주 노장의 항복 선례', + '오의: 성도 외곽 길과 창고 위치 안내' + ], + events: { + 'village-approach': { + title: '성도 외곽 마을', + lines: [ + '이엄: 황권은 마을이 불타는 순간 항복 권고를 거짓으로 볼 것입니다. 먼저 백성의 길을 지켜야 합니다.', + '제갈량: 성도를 얻는 길은 성문보다 민심에서 열립니다. 외곽 마을을 안정시킨 뒤 남문을 압박하십시오.' + ] + }, + 'cavalry-approach': { + title: '남문 반격 차단', + lines: [ + '오의: 성도 기병이 창고와 남문 사이를 끊으려 합니다. 저 길을 놓치면 항복 조건을 전달할 틈도 사라집니다.', + '엄안: 익주 병사에게는 도망칠 길보다 물러설 명분이 필요하오. 기병을 묶되 지나친 추격은 삼가시오.' + ] + }, + 'leader-wavering': { + title: '황권의 판단', + lines: [ + '마을과 창고가 보전되고 남문 반대파가 밀려나자, 황권은 더 이상 결전만이 익주를 지키는 길이라고 말하지 못합니다.', + '황권: 이엄과 엄안이 헛되이 고개를 숙인 것이 아니었군. 백성을 살리는 조건이라면 들어 보겠습니다.' + ] + } + } + }, + sortie: { + sortieLimit: 6, + requiredUnits: ['liu-bei', 'li-yan'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'reserve', reason: '성도 항복 권고와 익주 확보 명분의 중심입니다.' }, + { unitId: 'li-yan', role: 'support', reason: '이엄의 첫 출전입니다. 면죽관에서 본 군율을 증언합니다.' }, + { unitId: 'zhuge-liang', role: 'support', reason: '항복 조건과 익주 수습책을 동시에 설계하는 핵심 책사입니다.' }, + { unitId: 'fa-zheng', role: 'support', reason: '황권의 신중한 판단과 유장 진영의 속내를 읽습니다.' }, + { unitId: 'yan-yan', role: 'support', reason: '엄안의 항복 선례가 황권과 익주 장수들의 마음을 흔듭니다.' }, + { unitId: 'wu-yi', role: 'flank', reason: '성도 외곽 길과 창고 위치를 아는 현지 장수입니다.' } + ], + recommendedClasses: [ + { label: '항복 명분', classKeys: ['lord'], reason: '유비가 살아 있어야 성도 항복 권고가 힘을 얻습니다.' }, + { label: '익주 증언', classKeys: ['infantry', 'spearman'], reason: '이엄과 오의가 군율과 현지 사정을 증언합니다.' }, + { label: '권고 설계', classKeys: ['strategist'], reason: '제갈량과 법정이 항복 조건과 황권의 심리를 정리합니다.' }, + { label: '노장 선례', classKeys: ['archer'], reason: '엄안이 익주 노장의 항복 선례로 설득력을 보탭니다.' }, + { label: '측면 차단', classKeys: ['cavalry'], reason: '성도 기병의 남문 반격과 창고 차단을 빠르게 묶을 수 있습니다.' } + ], + deploymentSlots: [ + { x: 4, y: 42, role: 'reserve', unitId: 'liu-bei', label: '항복 명분' }, + { x: 13, y: 40, role: 'support', unitId: 'li-yan', label: '익주 증언' }, + { x: 6, y: 40, role: 'support', unitId: 'zhuge-liang', label: '권고 설계' }, + { x: 11, y: 43, role: 'support', unitId: 'fa-zheng', label: '황권 판단' }, + { x: 11, y: 39, role: 'support', unitId: 'yan-yan', label: '노장 선례' }, + { x: 12, y: 41, role: 'flank', unitId: 'wu-yi', label: '창고 길' } + ], + note: + '성도 항복 권고전은 성문을 부수기보다 항복 조건을 믿게 만드는 전투입니다. 이엄을 지키고, 마을과 창고를 안정시키며, 황권이 물러설 명분을 만들어야 합니다.' + }, map: thirtyThirdBattleMap, units: thirtyThirdBattleUnits, bonds: thirtyThirdBattleBonds, mapTextureKey: 'battle-map-thirty-third', leaderUnitId: 'chengdu-final-leader-huang-quan', - quickVictoryTurnLimit: 48, + quickVictoryTurnLimit: 72, baseVictoryGold: 5340, objectives: [ { @@ -4801,19 +4868,48 @@ export const thirtyThirdBattleScenario: BattleScenarioDefinition = { rewardGold: 1320, unitId: 'li-yan' }, + { + id: 'outer-village', + kind: 'secure-terrain', + label: '성도 외곽 마을 안정', + rewardGold: 1440, + terrain: 'village', + targetTile: { x: 47, y: 29, radius: 20 }, + threatRadius: 0 + }, + { + id: 'south-gate-archers', + kind: 'secure-terrain', + label: '남문 궁병 억제', + rewardGold: 1500, + terrain: 'fort', + targetTile: { x: 52, y: 18, radius: 17 }, + threatRadius: 0 + }, + { + id: 'surrender-line', + kind: 'secure-terrain', + label: '항복 반대파 압박', + rewardGold: 1600, + terrain: 'fort', + targetTile: { x: 54, y: 22, radius: 17 }, + threatRadius: 0 + }, { id: 'chengdu-storehouse', kind: 'secure-terrain', label: '성도 창고 확보', - rewardGold: 1620, - terrain: 'village' + rewardGold: 1660, + terrain: 'village', + targetTile: { x: 59, y: 32, radius: 18 }, + threatRadius: 0 }, { id: 'quick', kind: 'quick-victory', - label: '48턴 이내 승리', + label: '72턴 이내 승리', rewardGold: 1240, - maxTurn: 48 + maxTurn: 72 } ], defeatConditions: [ @@ -4821,6 +4917,14 @@ export const thirtyThirdBattleScenario: BattleScenarioDefinition = { { kind: 'unit-defeated', unitId: 'li-yan' } ], itemRewards: ['콩 20', '상처약 15', '탁주 8', '익주 안정문 +1', '황권 합류'], + campaignReward: { + supplies: ['콩 20', '상처약 15', '탁주 8'], + reputation: ['익주 안정문 +1', '성도 항복 권고 완료 +1'], + recruits: ['huang-quan'], + unlockBattleId: 'thirty-fourth-battle-jiameng-pass', + unlockLabel: '가맹관 마초 대면전 개방', + note: '성도 외곽과 창고를 보전하며 황권이 합류했습니다. 익주 기반이 마련되고 한중으로 향하는 북문이 열립니다.' + }, victoryPages: thirtyThirdBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/campaignFlow.ts b/src/game/data/campaignFlow.ts index a45c9d9..c2168f2 100644 --- a/src/game/data/campaignFlow.ts +++ b/src/game/data/campaignFlow.ts @@ -565,7 +565,7 @@ const sortieFlows: Record = { eyebrow: '다음 전장', title: thirtyFourthBattleScenario.title, description: - '성도가 항복하고 황권이 합류했습니다. 이제 익주의 북문인 가맹관에서 한중 방면을 살피고, 서량의 기병장 마초를 유비군의 깃발 아래로 끌어들일 차례입니다.', + '성도 외곽과 창고를 보전한 채 항복을 받아내고 황권이 합류했습니다. 이제 익주의 북문인 가맹관에서 한중 방면을 살피고, 서량의 기병장 마초를 유비군의 깃발 아래로 끌어들일 차례입니다.', rewardHint: `예상 보상: ${thirtyFourthBattleScenario.title} 개방 / 마초 합류`, nextBattleId: thirtyFourthBattleScenario.id, campaignStep: 'thirty-fourth-battle', diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index 92a97e9..b8a2d8b 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -2396,7 +2396,7 @@ export const thirtyThirdBattleIntroPages: StoryPage[] = [ chapter: '성도 앞의 마지막 권고', background: 'story-chengdu-surrender', speaker: '제갈량', - text: '면죽관이 열렸고 이엄까지 합류했습니다. 성도는 아직 문을 닫았으나, 이제 유장은 싸움과 항복 사이에서 더 이상 오래 머물 수 없습니다.' + text: '면죽관이 열렸고 이엄까지 합류했습니다. 성도는 아직 문을 닫았으나, 외곽 마을과 창고가 보전된다면 유장은 싸움과 항복 사이에 오래 머물 수 없습니다.' }, { id: 'thirty-third-li-yan-counsel', @@ -2404,7 +2404,7 @@ export const thirtyThirdBattleIntroPages: StoryPage[] = [ chapter: '이엄의 증언', background: 'story-chengdu-surrender', speaker: '이엄', - text: '황권은 성도의 체면과 백성의 안위를 함께 보는 장수입니다. 그가 물러서면 유장공도 백성을 살리는 길을 택할 수 있습니다.' + text: '황권은 성도의 체면과 백성의 안위를 함께 보는 장수입니다. 남문 사격선을 눌러도 마을을 불태우지 않는다면, 그도 물러설 명분을 찾을 것입니다.' }, { id: 'thirty-third-final-plan', @@ -2412,7 +2412,7 @@ export const thirtyThirdBattleIntroPages: StoryPage[] = [ chapter: '성도 항복 권고전', background: 'story-chengdu-surrender', speaker: '법정', - text: '성도 성문을 부수는 것이 능사가 아닙니다. 황권의 방어선을 눌러 항복 조건을 받아들이게 하고, 마을과 창고를 지켜 유비군의 약속을 증명해야 합니다.' + text: '성도 성문을 부수는 것이 능사가 아닙니다. 외곽 마을, 남문 궁병, 창고 방어선을 차례로 안정시켜 항복 조건을 받아들이게 해야 합니다.' }, { id: 'thirty-third-sortie', @@ -2421,7 +2421,7 @@ export const thirtyThirdBattleIntroPages: StoryPage[] = [ background: 'story-chengdu-surrender', speaker: '유비', portrait: 'liuBei', - text: '오늘의 승리는 성도의 문을 여는 것보다, 문 안의 백성이 두려움을 내려놓게 하는 데 있소. 칼을 들되 마음을 먼저 잃지 마시오.' + text: '오늘의 승리는 성도의 문을 여는 것보다, 문 안의 백성이 두려움을 내려놓게 하는 데 있소. 황권을 밀어붙이되 약속한 군율을 먼저 지키시오.' } ]; @@ -2431,7 +2431,7 @@ export const thirtyThirdBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '성도 항복', background: 'story-chengdu-surrender', - text: '성도 외곽의 방어선은 무너졌지만 성문 안쪽은 불타지 않았습니다. 유장에게 보내진 마지막 권고문은 백성을 보전하고 장수의 체면을 남기는 조건을 담았습니다.' + text: '성도 외곽의 방어선은 무너졌지만 마을과 창고는 불타지 않았습니다. 유장에게 보내진 마지막 권고문은 백성을 보전하고 장수의 체면을 남기는 조건을 담았습니다.' }, { id: 'thirty-third-huang-quan-joins', @@ -2439,7 +2439,7 @@ export const thirtyThirdBattleVictoryPages: StoryPage[] = [ chapter: '황권의 귀순', background: 'story-chengdu-surrender', speaker: '황권', - text: '익주를 지키려던 마음은 변하지 않았습니다. 다만 이제는 백성을 살리는 길이 유비공의 군율 아래 있다는 것을 보았습니다. 황권이 그 길에 서겠습니다.' + text: '익주를 지키려던 마음은 변하지 않았습니다. 다만 이엄의 말과 오늘의 군율을 보니, 백성을 살리는 길이 유비공의 깃발 아래 있음을 알겠습니다.' }, { id: 'thirty-third-yizhou-secured', @@ -2447,7 +2447,7 @@ export const thirtyThirdBattleVictoryPages: StoryPage[] = [ chapter: '익주 확보', background: 'story-chengdu-surrender', speaker: '제갈량', - text: '형주와 익주의 기반이 마련되었습니다. 유비군은 이제 유랑군이 아니라 나라의 뿌리를 갖춘 세력으로 바뀌며, 촉한 건국을 향한 다음 장을 준비합니다.' + text: '형주와 익주의 기반이 마련되었습니다. 유비군은 이제 유랑군이 아니라 나라의 뿌리를 갖춘 세력으로 바뀌며, 한중과 촉한 건국을 향한 다음 장을 준비합니다.' } ]; diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index 4970a08..97e7bec 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -1160,15 +1160,31 @@ const sortieRulesByBattleId: Partial