From 626213b626d5d165b6dc0a68163cd3737b1b1aae Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 4 Jul 2026 18:38:12 +0900 Subject: [PATCH] Refine Jingzhou south entry battle flow --- src/game/data/battles.ts | 106 +++++++++++++++++++++++++++++++--- src/game/data/campaignFlow.ts | 4 +- src/game/data/scenario.ts | 14 ++--- src/game/scenes/CampScene.ts | 29 +++++++--- 4 files changed, 130 insertions(+), 23 deletions(-) diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index aa1d464..613bffd 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -3118,16 +3118,80 @@ export const twentyThirdBattleScenario: BattleScenarioDefinition = { victoryConditionLabel: '형도영 퇴각', 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', 'zhuge-liang'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'reserve', reason: '형주 남부 진입의 명분이자 패배 조건의 중심입니다.' }, + { unitId: 'zhuge-liang', role: 'support', reason: '마을을 해치지 않고 길목을 여는 작전 핵심입니다.' }, + { unitId: 'guan-yu', role: 'front', reason: '형도영의 보병 전열을 정면에서 받아낼 주력입니다.' }, + { unitId: 'zhao-yun', role: 'flank', reason: '척후와 기병을 빠르게 끊어 마을을 안정시키기 좋습니다.' }, + { unitId: 'sun-qian', role: 'support', reason: '마량과 형주 선비층으로 이어질 외교 명분을 정리합니다.' }, + { unitId: 'mi-zhu', role: 'support', reason: '긴 남부 길목에서 회복과 보급을 맡기 좋습니다.' } + ], + recommendedClasses: [ + { label: '진입 명분', classKeys: ['lord'], reason: '유비가 살아 남아야 형주 남부 진입의 명분이 유지됩니다.' }, + { label: '민심 책략', classKeys: ['strategist'], reason: '제갈량의 판단이 마을 피해와 다음 합류 보상을 좌우합니다.' }, + { label: '길목 전열', classKeys: ['infantry', 'spearman'], reason: '영릉 가병의 중앙 전열은 정면에서 눌러야 합니다.' }, + { label: '우회 차단', classKeys: ['cavalry'], reason: '기동 장수가 척후와 기병을 끊어 보급선을 안정시킵니다.' } + ], + deploymentSlots: [ + { x: 4, y: 25, role: 'reserve', unitId: 'liu-bei', label: '진입 명분' }, + { x: 6, y: 23, role: 'front', unitId: 'guan-yu', label: '길목 전열' }, + { x: 8, y: 22, role: 'flank', unitId: 'zhao-yun', label: '우회 차단' }, + { x: 6, y: 24, role: 'support', unitId: 'zhuge-liang', label: '민심 판단' }, + { x: 8, y: 25, role: 'support', unitId: 'sun-qian', label: '외교 문안' }, + { x: 5, y: 29, role: 'support', unitId: 'mi-zhu', label: '남부 보급' } + ], + note: '형주 남부 진입전은 적벽 뒤 첫 근거지 확보 전투입니다. 유비와 제갈량을 반드시 포함하고, 마을 안정과 영릉 관문 확보를 함께 챙기면 마량 합류가 자연스럽게 이어집니다.' + }, map: twentyThirdBattleMap, units: twentyThirdBattleUnits, bonds: twentyThirdBattleBonds, mapTextureKey: 'battle-map-twenty-third', leaderUnitId: 'jing-south-leader-xing-daorong', - quickVictoryTurnLimit: 32, + quickVictoryTurnLimit: 44, baseVictoryGold: 3020, objectives: [ { @@ -3156,14 +3220,34 @@ export const twentyThirdBattleScenario: BattleScenarioDefinition = { kind: 'secure-terrain', label: '남부 마을 안정', rewardGold: 980, - terrain: 'village' + terrain: 'village', + targetTile: { x: 34, y: 18, radius: 7 }, + threatRadius: 0 + }, + { + id: 'southern-road', + kind: 'secure-terrain', + label: '강가 길목 확보', + rewardGold: 860, + terrain: 'village', + targetTile: { x: 37, y: 18, radius: 6 }, + threatRadius: 0 + }, + { + id: 'yingling-gate', + kind: 'secure-terrain', + label: '영릉 관문 확보', + rewardGold: 1080, + terrain: 'fort', + targetTile: { x: 38, y: 18, radius: 4 }, + threatRadius: 0 }, { id: 'quick', kind: 'quick-victory', - label: '32턴 이내 승리', + label: '44턴 이내 승리', rewardGold: 760, - maxTurn: 32 + maxTurn: 44 } ], defeatConditions: [ @@ -3171,6 +3255,14 @@ export const twentyThirdBattleScenario: BattleScenarioDefinition = { { kind: 'unit-defeated', unitId: 'zhuge-liang' } ], itemRewards: ['콩 9', '상처약 7', '탁주 4', '형주 진입 문서 +1', '마량 합류'], + campaignReward: { + supplies: ['콩 9', '상처약 7', '탁주 4'], + reputation: ['형주 진입 문서 +1', '남부 마을 안정 +1'], + recruits: ['ma-liang'], + unlockBattleId: 'twenty-fourth-battle-guiyang-persuasion', + unlockLabel: '계양 설득전 개방', + note: '마을과 영릉 관문을 함께 안정시켜 형주 선비층의 신뢰를 얻었습니다. 백미 마량이 합류하고, 그의 현지 정보로 계양 설득전이 열립니다.' + }, victoryPages: twentyThirdBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/campaignFlow.ts b/src/game/data/campaignFlow.ts index d01c727..3c1577d 100644 --- a/src/game/data/campaignFlow.ts +++ b/src/game/data/campaignFlow.ts @@ -455,8 +455,8 @@ const sortieFlows: Record = { eyebrow: '다음 전장', title: twentyFourthBattleScenario.title, description: - '형주 남부의 첫 길목을 열고 마량이 합류했습니다. 이제 마량의 현지 정보와 유비군의 군율을 앞세워 계양의 문을 열어야 합니다.', - rewardHint: `예상 보상: ${twentyFourthBattleScenario.title} 개방 / 이적 합류`, + '남부 마을과 영릉 관문을 함께 안정시키며 마량이 합류했습니다. 이제 백미 마량의 현지 지도와 유비군의 군율을 앞세워 계양의 문을 말로 먼저 열어야 합니다.', + rewardHint: `예상 보상: ${twentyFourthBattleScenario.title} 개방 / 이적 합류 / 계양 설득 명분`, nextBattleId: twentyFourthBattleScenario.id, campaignStep: 'twenty-fourth-battle', pages: [...twentyThirdBattleVictoryPages, ...twentyFourthBattleIntroPages] diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index 0921863..9305ccc 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -1769,7 +1769,7 @@ export const twentyThirdBattleIntroPages: StoryPage[] = [ background: 'story-yizhou', speaker: '유비', portrait: 'liuBei', - text: '적벽의 불길은 조조를 막았지만 백성이 기대어 살 땅은 아직 없소. 형주 남부의 군현을 힘으로 짓밟지 말고, 먼저 길과 민심을 열어야 하오.' + text: '적벽의 불길은 조조를 막았지만 백성이 기대어 살 땅은 아직 없소. 이제 형주 남부의 첫 마을과 길목을 조심스럽게 열어, 우리가 머물 명분을 세워야 하오.' }, { id: 'twenty-third-zhuge-plan', @@ -1777,7 +1777,7 @@ export const twentyThirdBattleIntroPages: StoryPage[] = [ chapter: '군현을 여는 계책', background: 'story-yizhou', speaker: '제갈량', - text: '영릉의 유도는 아직 마음을 정하지 못했고, 형도영은 길목을 막아 자신의 힘을 보이려 합니다. 그를 물리치되 백성을 다치게 하지 않으면 형주 남부가 움직일 것입니다.' + text: '형도영의 가병은 남부 마을, 강가 길목, 영릉 관문을 차례로 붙잡고 있습니다. 성채만 들이치면 민심이 흩어지니, 먼저 마을을 안정시키고 길목을 확보해야 합니다.' }, { id: 'twenty-third-ma-liang-rumor', @@ -1785,7 +1785,7 @@ export const twentyThirdBattleIntroPages: StoryPage[] = [ chapter: '백미의 소문', background: 'story-yizhou', speaker: '손건', - text: '형주 선비들 사이에 마량이라는 이름이 오갑니다. 눈썹이 희어 백미라 불리는 사람인데, 남부 군현의 민심과 길을 누구보다 잘 안다고 합니다.' + text: '형주 선비들 사이에 마량이라는 이름이 오갑니다. 흰 눈썹으로 백미라 불리는 문사인데, 남부 군현의 마을길과 사람 마음을 누구보다 잘 안다고 합니다.' }, { id: 'twenty-third-jingzhou-sortie', @@ -1793,7 +1793,7 @@ export const twentyThirdBattleIntroPages: StoryPage[] = [ chapter: '형주 남부 진입전', background: 'story-yizhou', speaker: '제갈량', - text: '형도영의 가병이 남부 길목과 마을을 막고 있습니다. 성급히 몰아붙이면 백성이 흩어지니, 전열을 세우고 마을을 지키며 길목을 확보하십시오.' + text: '관우 장군은 길목 전열을 누르고, 조운 장군은 우회 기병을 끊으십시오. 유비 공과 저는 후방에서 민심을 지키며 남부 마을, 강가 길목, 영릉 관문을 차례로 확보하겠습니다.' } ]; @@ -1803,7 +1803,7 @@ export const twentyThirdBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '남부 길목이 열리다', background: 'story-yizhou', - text: '형도영이 물러서자 남부 군현으로 이어지는 길이 열렸습니다. 유비군은 약탈 없이 마을을 안정시키며 적벽 이후 처음으로 머물 땅의 윤곽을 얻었습니다.' + text: '남부 마을과 강가 길목, 영릉 관문이 차례로 안정되자 형도영의 가병은 물러났습니다. 유비군은 약탈 없이 첫 근거지의 윤곽을 얻었습니다.' }, { id: 'twenty-third-ma-liang-joins', @@ -1811,7 +1811,7 @@ export const twentyThirdBattleVictoryPages: StoryPage[] = [ chapter: '마량의 합류', background: 'story-yizhou', speaker: '마량', - text: '주공께서 백성을 먼저 살피셨다는 말을 들었습니다. 형주 남부의 길과 사람을 잇는 일이라면, 제 작은 글과 말도 보탬이 될 것입니다.' + text: '주공께서 성채보다 마을을 먼저 살피셨다는 말을 들었습니다. 이 백미가 아는 남부 길과 사람의 이름을 적어 올리겠습니다. 계양의 문도 말로 먼저 두드릴 수 있습니다.' }, { id: 'twenty-third-next-commandery', @@ -1819,7 +1819,7 @@ export const twentyThirdBattleVictoryPages: StoryPage[] = [ chapter: '군현을 차례로', background: 'story-yizhou', speaker: '제갈량', - text: '영릉의 문은 열렸지만 형주 남부 전체가 움직인 것은 아닙니다. 계양, 무릉, 장사까지 차례로 설득하고 지켜야 비로소 근거지가 됩니다.' + text: '영릉 관문은 열렸지만 형주 남부 전체가 움직인 것은 아닙니다. 마량의 지도를 앞세워 계양, 무릉, 장사까지 차례로 설득하고 지켜야 비로소 근거지가 됩니다.' } ]; diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index 7954400..0fec5d9 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -884,15 +884,30 @@ const sortieRulesByBattleId: Partial