From 11ac104c433ae2c1d9187cf2fee68c5460019803 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 4 Jul 2026 18:25:36 +0900 Subject: [PATCH] Refine Red Cliffs fire battle flow --- src/game/data/battles.ts | 105 +++++++++++++++++++++++++++++++--- src/game/data/campaignFlow.ts | 4 +- src/game/data/scenario.ts | 10 ++-- src/game/scenes/CampScene.ts | 29 +++++++--- 4 files changed, 127 insertions(+), 21 deletions(-) diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index 5233bd5..aa1d464 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -2964,16 +2964,80 @@ export const twentySecondBattleScenario: BattleScenarioDefinition = { victoryConditionLabel: '조조 본선 퇴각', defeatConditionLabel: '유비 또는 제갈량 퇴각', openingObjectiveLines: [ - '황개의 거짓 항복선이 조조 함대로 향합니다. 조조군 감시선이 화선을 알아차리면 적벽의 불길은 시작되기도 전에 꺼집니다.', - '강 위에는 연환선과 배다리가 얽혀 있습니다. 전열 장수로 갑판 보병을 묶고, 기동 장수로 강안 기병을 끊어 화선 접안로를 열어야 합니다.', - '제갈량을 지키고 조조 본선을 퇴각시키십시오. 화선 준비 지점을 확보하면 적벽대전의 결정적 승리를 얻을 수 있습니다.' + '배다리 거점과 강동 포구가 열리자 황개의 거짓 항복선이 조조 함대로 향합니다. 감시선이 화선을 알아차리면 적벽의 불길은 시작되기도 전에 꺼집니다.', + '강 위에는 연환선과 배다리가 얽혀 있습니다. 조운은 강안 기병을 끊고, 관우와 장비는 갑판 보병을 묶어 화선 접안로와 동남풍 신호 지점을 열어야 합니다.', + '제갈량을 지키고 조조 본선을 퇴각시키십시오. 화선 접안로와 연환선 돌파 지점을 확보하면 형주 남부로 향할 결정적 승리를 얻습니다.' ], + tacticalGuide: { + summary: '21전에서 확보한 배다리와 포구를 발판으로, 감시선을 누르고 화선이 조조 본선에 닿을 길을 여는 적벽 결전입니다.', + 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: 'zhao-yun', role: 'flank', reason: '화선을 노리는 강안 기병과 감시병을 빠르게 끊습니다.' }, + { unitId: 'guan-yu', role: 'front', reason: '갑판 보병과 본선 친위를 정면에서 받아낼 전열입니다.' }, + { unitId: 'zhang-fei', role: 'front', 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: 23, role: 'reserve', unitId: 'liu-bei', label: '동맹 지휘' }, + { x: 6, y: 21, role: 'front', unitId: 'guan-yu', label: '갑판 전열' }, + { x: 6, y: 25, role: 'front', unitId: 'zhang-fei', label: '연환선 돌파' }, + { x: 8, y: 20, role: 'flank', unitId: 'zhao-yun', label: '강안 차단' }, + { x: 6, y: 22, role: 'support', unitId: 'zhuge-liang', label: '동남풍 판단' }, + { x: 5, y: 27, role: 'support', unitId: 'mi-zhu', label: '화공 보급' } + ], + note: '적벽 화공전은 강 위의 결전입니다. 유비와 제갈량을 반드시 포함하고, 조운으로 감시병과 기병을 끊은 뒤 관우와 장비가 화선 접안로와 연환선을 열어야 합니다.' + }, map: twentySecondBattleMap, units: twentySecondBattleUnits, bonds: twentySecondBattleBonds, mapTextureKey: 'battle-map-twenty-second', leaderUnitId: 'redcliff-fire-leader-cao-cao', - quickVictoryTurnLimit: 31, + quickVictoryTurnLimit: 42, baseVictoryGold: 2840, objectives: [ { @@ -3002,14 +3066,34 @@ export const twentySecondBattleScenario: BattleScenarioDefinition = { kind: 'secure-terrain', label: '화선 접안로 확보', rewardGold: 980, - terrain: 'village' + terrain: 'village', + targetTile: { x: 28, y: 20, radius: 3 }, + threatRadius: 0 + }, + { + id: 'wind-signal', + kind: 'secure-terrain', + label: '동남풍 신호 지점 확보', + rewardGold: 880, + terrain: 'village', + targetTile: { x: 35, y: 14, radius: 4 }, + threatRadius: 0 + }, + { + id: 'chain-fleet', + kind: 'secure-terrain', + label: '연환선 돌파 지점 확보', + rewardGold: 1040, + terrain: 'fort', + targetTile: { x: 36, y: 14, radius: 3 }, + threatRadius: 0 }, { id: 'quick', kind: 'quick-victory', - label: '31턴 이내 승리', + label: '42턴 이내 승리', rewardGold: 720, - maxTurn: 31 + maxTurn: 42 } ], defeatConditions: [ @@ -3017,6 +3101,13 @@ export const twentySecondBattleScenario: BattleScenarioDefinition = { { kind: 'unit-defeated', unitId: 'zhuge-liang' } ], itemRewards: ['콩 9', '상처약 6', '탁주 4', '화공 전과 +1', '동남풍 기록 +1'], + campaignReward: { + supplies: ['콩 9', '상처약 6', '탁주 4'], + reputation: ['적벽 화공 전과 +1', '동남풍 기록 +1', '손유 동맹 명성 +1'], + unlockBattleId: 'twenty-third-battle-jingzhou-south-entry', + unlockLabel: '형주 남부 진입전 개방', + note: '화선 접안로와 동남풍 신호 지점을 확보해 조조 본선을 몰아냈습니다. 조조의 남하가 꺾였으니 유비군은 형주 남부의 길과 민심을 열 차례입니다.' + }, victoryPages: twentySecondBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/campaignFlow.ts b/src/game/data/campaignFlow.ts index bc2b5ec..d01c727 100644 --- a/src/game/data/campaignFlow.ts +++ b/src/game/data/campaignFlow.ts @@ -444,8 +444,8 @@ const sortieFlows: Record = { eyebrow: '다음 전장', title: twentyThirdBattleScenario.title, description: - '적벽의 불길로 조조의 남하가 꺾였습니다. 유비군은 이제 형주 남부의 길목을 열고, 백성을 먼저 안정시키며 머물 땅을 마련해야 합니다.', - rewardHint: `예상 보상: ${twentyThirdBattleScenario.title} 개방 / 마량 합류`, + '화선 접안로와 동남풍 신호 지점을 열어 적벽의 불길이 조조 본선을 물러나게 했습니다. 유비군은 이제 형주 남부의 길목을 열고, 백성을 먼저 안정시키며 머물 땅을 마련해야 합니다.', + rewardHint: `예상 보상: ${twentyThirdBattleScenario.title} 개방 / 마량 합류 / 적벽 명성`, nextBattleId: twentyThirdBattleScenario.id, campaignStep: 'twenty-third-battle', pages: [...twentySecondBattleVictoryPages, ...twentyThirdBattleIntroPages] diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index 9a3411d..0921863 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -1705,7 +1705,7 @@ export const twentySecondBattleIntroPages: StoryPage[] = [ chapter: '황개의 결단', background: 'story-red-cliffs', speaker: '주유', - text: '황개 장군은 거짓 항복의 배를 준비했습니다. 조조가 그 배를 의심하지 않게 하려면, 유비군은 강안의 감시선을 흔들어 화선이 다가갈 길을 열어야 합니다.' + text: '배다리와 포구가 열렸으니 황개 장군의 거짓 항복선도 강 위로 나설 수 있습니다. 조조가 그 배를 의심하지 않게 하려면, 유비군은 강안의 감시선을 흔들어 화선이 다가갈 길을 열어야 합니다.' }, { id: 'twenty-second-zhuge-wind-watch', @@ -1713,7 +1713,7 @@ export const twentySecondBattleIntroPages: StoryPage[] = [ chapter: '동남풍을 기다리다', background: 'story-red-cliffs', speaker: '제갈량', - text: '바람은 아직 완전히 돌지 않았습니다. 그러나 때가 오면 불길은 강 위에서 산처럼 번질 것입니다. 그 전까지 조조의 척후와 갑판 궁병을 묶어 두어야 합니다.' + text: '바람은 아직 완전히 돌지 않았습니다. 그러나 신호 지점을 잡아 두면 때가 왔을 때 불길은 강 위에서 산처럼 번질 것입니다. 그 전까지 조조의 척후와 갑판 궁병을 묶어 두어야 합니다.' }, { id: 'twenty-second-liu-bei-fire-line', @@ -1730,7 +1730,7 @@ export const twentySecondBattleIntroPages: StoryPage[] = [ chapter: '적벽 화공전', background: 'story-red-cliffs', speaker: '제갈량', - text: '조조의 함대가 사슬로 묶인 채 강북에 모였습니다. 화선의 길을 막는 초병을 베고, 조조 본선이 불길에 휩싸일 때까지 전선을 지키십시오.' + text: '조조의 함대가 사슬로 묶인 채 강북에 모였습니다. 화선 접안로와 동남풍 신호 지점을 열고, 연환선이 불길에 휩싸일 때까지 전선을 지키십시오.' } ]; @@ -1740,7 +1740,7 @@ export const twentySecondBattleVictoryPages: StoryPage[] = [ bgm: 'battle-prep', chapter: '불길이 일다', background: 'story-red-cliffs', - text: '화선이 조조군 함대에 닿자 강 위가 붉게 일렁였습니다. 사슬로 묶인 배들은 서로를 구하지 못했고, 장강의 바람은 불길을 북쪽으로 몰아붙였습니다.' + text: '화선이 접안로를 지나 조조군 함대에 닿자 강 위가 붉게 일렁였습니다. 사슬로 묶인 배들은 서로를 구하지 못했고, 장강의 바람은 불길을 북쪽으로 몰아붙였습니다.' }, { id: 'twenty-second-cao-cao-retreat', @@ -1757,7 +1757,7 @@ export const twentySecondBattleVictoryPages: StoryPage[] = [ background: 'story-red-cliffs', speaker: '유비', portrait: 'liuBei', - text: '조조의 대군은 물러났지만 우리의 근본은 아직 없습니다. 이제 백성이 머물 땅을 얻고, 형주와 익주로 향할 길을 차근히 세워야 합니다.' + text: '조조의 대군은 물러났지만 우리의 근본은 아직 없습니다. 적벽에서 얻은 명성과 동맹의 신뢰를 헛되이 하지 않으려면, 이제 형주 남부의 길과 민심을 차근히 열어야 합니다.' } ]; diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index f6b0a68..7954400 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -857,15 +857,30 @@ const sortieRulesByBattleId: Partial