From 0a5c3d22375bf93661d909a420a7e5bdf4942c70 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 4 Jul 2026 20:05:47 +0900 Subject: [PATCH] Refine Mianzhu gate battle flow --- src/game/data/battles.ts | 116 ++++++++++++++++++++++++++++++++-- src/game/data/campaignFlow.ts | 2 +- src/game/data/scenario.ts | 14 ++-- src/game/scenes/CampScene.ts | 30 +++++++-- 4 files changed, 141 insertions(+), 21 deletions(-) diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index 5b6241f..e2d4395 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -4605,12 +4605,79 @@ export const thirtySecondBattleScenario: 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', 'yan-yan'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'reserve', reason: '성도 항복 권고와 패배 조건의 중심입니다.' }, + { unitId: 'yan-yan', role: 'support', reason: '엄안의 첫 출전입니다. 이엄에게 익주 장수 예우를 증명합니다.' }, + { unitId: 'fa-zheng', role: 'support', reason: '성도 수비장들의 심리와 이엄의 판단을 읽는 책사입니다.' }, + { unitId: 'wu-yi', role: 'flank', reason: '면죽관 관문과 보급 창고 위치를 아는 현지 장수입니다.' }, + { unitId: 'pang-tong', role: 'support', reason: '무리한 돌파 대신 관문 압박과 퇴로 확보를 동시에 계산합니다.' }, + { unitId: 'huang-zhong', role: 'support', reason: '관문 궁병과 고지 수비를 안정적으로 견제합니다.' } + ], + recommendedClasses: [ + { label: '항복 명분', classKeys: ['lord'], reason: '유비가 살아 있어야 성도 항복 권고의 명분이 유지됩니다.' }, + { label: '익주 증언', classKeys: ['archer'], reason: '엄안과 황충이 관문 궁병을 견제하며 예우의 증거를 보여 줍니다.' }, + { label: '관문 설계', classKeys: ['strategist'], reason: '법정과 방통이 이엄의 심리와 관문 압박 순서를 잡습니다.' }, + { label: '현지 안내', classKeys: ['infantry', 'spearman'], reason: '오의 같은 익주 장수가 마을과 창고 위치를 짚어 줍니다.' }, + { label: '측면 기동', classKeys: ['cavalry'], reason: '관문 앞 기병과 창고 차단 병력을 빠르게 묶을 수 있습니다.' } + ], + deploymentSlots: [ + { x: 4, y: 40, role: 'reserve', unitId: 'liu-bei', label: '항복 명분' }, + { x: 11, y: 37, role: 'support', unitId: 'yan-yan', label: '익주 증언' }, + { x: 11, y: 41, role: 'support', unitId: 'fa-zheng', label: '이엄 판단' }, + { x: 12, y: 39, role: 'flank', unitId: 'wu-yi', label: '창고 길' }, + { x: 9, y: 39, role: 'support', unitId: 'pang-tong', label: '관문 설계' }, + { x: 7, y: 40, role: 'support', unitId: 'huang-zhong', label: '궁병 견제' } + ], + note: + '면죽관 압박전은 엄안의 첫 출전을 설득의 증거로 쓰는 전투입니다. 관문을 무너뜨리는 힘보다 외곽 마을과 보급 창고를 안정시키는 명분이 중요합니다.' + }, map: thirtySecondBattleMap, units: thirtySecondBattleUnits, bonds: thirtySecondBattleBonds, mapTextureKey: 'battle-map-thirty-second', leaderUnitId: 'chengdu-leader-li-yan', - quickVictoryTurnLimit: 50, + quickVictoryTurnLimit: 70, baseVictoryGold: 5040, objectives: [ { @@ -4634,19 +4701,48 @@ export const thirtySecondBattleScenario: BattleScenarioDefinition = { rewardGold: 1260, unitId: 'yan-yan' }, + { + id: 'outer-village', + kind: 'secure-terrain', + label: '외곽 마을 안정', + rewardGold: 1380, + terrain: 'village', + targetTile: { x: 46, y: 27, radius: 18 }, + threatRadius: 0 + }, + { + id: 'pass-archers', + kind: 'secure-terrain', + label: '관문 궁병 억제', + rewardGold: 1440, + terrain: 'fort', + targetTile: { x: 50, y: 18, radius: 16 }, + threatRadius: 0 + }, + { + id: 'mianzhu-gate', + kind: 'secure-terrain', + label: '면죽관 관문 압박', + rewardGold: 1560, + terrain: 'fort', + targetTile: { x: 52, y: 22, radius: 16 }, + threatRadius: 0 + }, { id: 'mianzhu-storehouse', kind: 'secure-terrain', - label: '면죽관 창고 확보', - rewardGold: 1540, - terrain: 'village' + label: '성도 보급 창고 확보', + rewardGold: 1600, + terrain: 'village', + targetTile: { x: 56, y: 30, radius: 18 }, + threatRadius: 0 }, { id: 'quick', kind: 'quick-victory', - label: '50턴 이내 승리', + label: '70턴 이내 승리', rewardGold: 1180, - maxTurn: 50 + maxTurn: 70 } ], defeatConditions: [ @@ -4654,6 +4750,14 @@ export const thirtySecondBattleScenario: BattleScenarioDefinition = { { kind: 'unit-defeated', unitId: 'yan-yan' } ], itemRewards: ['콩 18', '상처약 13', '탁주 7', '성도 항복 권고문 +1', '이엄 합류'], + campaignReward: { + supplies: ['콩 18', '상처약 13', '탁주 7'], + reputation: ['성도 항복 권고문 +1', '면죽관 군율 증명 +1'], + recruits: ['li-yan'], + unlockBattleId: 'thirty-third-battle-chengdu-surrender', + unlockLabel: '성도 항복 권고전 개방', + note: '면죽관과 보급 창고를 안정시키고 이엄이 합류했습니다. 성도 항복 권고의 마지막 길이 열립니다.' + }, victoryPages: thirtySecondBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/campaignFlow.ts b/src/game/data/campaignFlow.ts index be7126c..a45c9d9 100644 --- a/src/game/data/campaignFlow.ts +++ b/src/game/data/campaignFlow.ts @@ -554,7 +554,7 @@ const sortieFlows: Record = { eyebrow: '다음 전장', title: thirtyThirdBattleScenario.title, description: - '면죽관이 열리고 이엄이 합류했습니다. 이제 이엄의 증언과 법정·제갈량의 권고문을 앞세워 성도 외곽의 마지막 방어선을 눌러야 합니다.', + '면죽관과 보급 창고를 군율로 안정시키며 이엄이 합류했습니다. 이제 이엄의 증언과 법정·제갈량의 권고문을 앞세워 성도 외곽의 마지막 방어선을 눌러야 합니다.', rewardHint: `예상 보상: ${thirtyThirdBattleScenario.title} 개방 / 황권 합류`, nextBattleId: thirtyThirdBattleScenario.id, campaignStep: 'thirty-third-battle', diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index 1c63773..92a97e9 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -2334,7 +2334,7 @@ export const thirtySecondBattleIntroPages: StoryPage[] = [ chapter: '성도 압박의 시작', background: 'story-yizhou-luo-road', speaker: '법정', - text: '낙성이 열리자 성도는 놀랐으나 아직 문을 닫고 있습니다. 면죽관의 수비장 이엄이 항복과 결전을 저울질하고 있으니, 힘과 명분을 함께 보여 주어야 합니다.' + text: '낙성이 열리자 성도는 놀랐으나 아직 문을 닫고 있습니다. 면죽관의 수비장 이엄은 관문 궁병과 보급 창고를 믿고 항복과 결전을 저울질하고 있습니다.' }, { id: 'thirty-second-yan-yan-first-counsel', @@ -2342,7 +2342,7 @@ export const thirtySecondBattleIntroPages: StoryPage[] = [ chapter: '엄안의 첫 출전', background: 'story-yizhou-luo-road', speaker: '엄안', - text: '이엄은 무턱대고 물러설 장수가 아닙니다. 그러나 백성을 해치지 않는 군율과 익주 장수를 예우하는 마음을 보이면, 그의 칼끝도 흔들릴 것입니다.' + text: '이엄은 무턱대고 물러설 장수가 아닙니다. 그러나 외곽 마을을 안정시키고 익주 장수를 예우하는 마음을 보이면, 그의 칼끝도 흔들릴 것입니다.' }, { id: 'thirty-second-mianzhu-plan', @@ -2350,7 +2350,7 @@ export const thirtySecondBattleIntroPages: StoryPage[] = [ chapter: '면죽관 설득', background: 'story-yizhou-luo-road', speaker: '방통', - text: '정면으로만 밀면 성도는 더 굳게 닫힙니다. 엄안으로 익주 장수의 마음을 열고, 법정과 오의로 길을 짚으며, 황충과 장비가 수비선을 짧게 끊어야 합니다.' + text: '정면으로만 밀면 성도는 더 굳게 닫힙니다. 엄안으로 익주 장수의 마음을 열고, 법정과 오의로 창고 길을 짚으며, 황충으로 관문 궁병을 눌러야 합니다.' }, { id: 'thirty-second-sortie', @@ -2359,7 +2359,7 @@ export const thirtySecondBattleIntroPages: StoryPage[] = [ background: 'story-yizhou-luo-road', speaker: '유비', portrait: 'liuBei', - text: '우리가 얻으려는 것은 성 하나가 아니라 익주의 마음이오. 면죽관을 넘되 백성을 다치게 하지 말고, 이엄에게도 함께 살 길을 보여 주시오.' + text: '우리가 얻으려는 것은 성 하나가 아니라 익주의 마음이오. 마을과 창고를 지키며 면죽관을 넘고, 이엄에게도 함께 살 길을 보여 주시오.' } ]; @@ -2369,7 +2369,7 @@ export const thirtySecondBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '면죽관이 열리다', background: 'story-yizhou-luo-road', - text: '면죽관의 수비선은 무너졌지만 성도 길목의 마을은 불타지 않았습니다. 유비군이 군율을 지키자 익주 병사들은 패배보다 이후의 처우를 먼저 바라보았습니다.' + text: '면죽관의 수비선은 무너졌지만 성도 길목의 마을과 보급 창고는 불타지 않았습니다. 유비군이 군율을 지키자 익주 병사들은 패배보다 이후의 처우를 먼저 바라보았습니다.' }, { id: 'thirty-second-li-yan-joins', @@ -2377,7 +2377,7 @@ export const thirtySecondBattleVictoryPages: StoryPage[] = [ chapter: '이엄의 선택', background: 'story-yizhou-luo-road', speaker: '이엄', - text: '칼을 거두는 일이 반드시 부끄러운 것은 아니군요. 백성을 살리고 익주의 길을 보전한다면, 이엄 또한 새 주군의 군율 아래 서겠습니다.' + text: '칼을 거두는 일이 반드시 부끄러운 것은 아니군요. 엄안 장군이 선 길과 백성을 살리는 군율을 보았으니, 이엄 또한 새 주군의 깃발 아래 서겠습니다.' }, { id: 'thirty-second-next-chengdu-surrender', @@ -2385,7 +2385,7 @@ export const thirtySecondBattleVictoryPages: StoryPage[] = [ chapter: '성도 항복 권고', background: 'story-yizhou-luo-road', speaker: '제갈량', - text: '낙성과 면죽이 열렸으니 유장의 선택지는 더욱 좁아졌습니다. 다음 길은 성도 포위와 항복 권고, 그리고 익주를 어떻게 다스릴 것인가에 달렸습니다.' + text: '낙성과 면죽이 모두 군율로 열렸으니 유장의 선택지는 더욱 좁아졌습니다. 다음 길은 성도 포위와 항복 권고, 그리고 익주를 어떻게 다스릴 것인가에 달렸습니다.' } ]; diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index d3a42cc..4970a08 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -1132,15 +1132,31 @@ const sortieRulesByBattleId: Partial