diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index e4cfaa1..bb81d0c 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -3601,22 +3601,88 @@ export const twentySixthBattleScenario: BattleScenarioDefinition = { victoryConditionLabel: '한현 퇴각', defeatConditionLabel: '유비 또는 제갈량 퇴각', openingObjectiveLines: [ - '무릉 산길을 연 유비군은 장사로 향합니다. 장사에는 노장 황충과 의심 많은 태수 한현이 버티고 있습니다.', - '이번 전투는 황충을 욕보이지 않고 한현의 의심을 꺾어야 합니다. 마을을 안정시키고 성문 전열을 흔들어 장사 내부의 길을 여십시오.', - '유비와 제갈량을 지키며 한현을 물러나게 하면 황충과 위연이 군영에 합류합니다.' + '무릉 산길을 연 유비군은 공지가 알려 준 길을 따라 장사로 향합니다. 장사에는 노장 황충과 의심 많은 태수 한현이 버티고 있습니다.', + '한현은 황충의 명망까지 의심하며 성문 병력을 몰아세우고 있습니다. 마을을 안정시키고 황충 전열을 예로 대하면, 위연이 성 안의 부당함을 더는 따르지 못할 것입니다.', + '유비와 제갈량을 지키며 장사 성문 의심선을 흔들고 한현을 물러나게 하면 황충과 위연이 군영에 합류합니다.' ], + tacticalGuide: { + summary: + '장사 전투는 노장 황충을 꺾어 모욕하는 싸움이 아니라, 한현의 의심을 전장에서 무너뜨리고 장사 내부의 사람을 얻는 싸움입니다. 공지의 길 정보와 이적의 예법을 함께 살리십시오.', + route: '서남 유비군 진영 → 서문 마을 안정 → 황충 전열 예우 → 성문 의심선 압박 → 한현 퇴각', + focus: + '관우가 황충의 전열을 정면에서 받아 예를 세우는 동안 조운은 동문 기병과 척후를 끊으십시오. 공지는 장사 길 정보를 읽고, 이적은 황충과 위연에게 닿을 문안을 준비하면 좋습니다.', + roles: [ + '유비: 장사 항복 명분과 패배 조건의 중심', + '공지: 무릉에서 얻은 장사 접근로와 성 안 소문', + '제갈량: 한현의 의심을 꺾는 성문 압박 판단', + '관우: 노장 황충의 전열을 받아내는 무인의 예', + '장비: 서문 보병 전열을 밀어내는 돌파 역할', + '조운: 동문 기병과 척후 차단' + ], + events: { + 'village-approach': { + title: '장사 서문 마을', + lines: [ + '공지: 이 마을이 흔들리면 장사 사람들은 한현의 말만 듣게 됩니다. 먼저 길과 창고를 지켜 주십시오.', + '이적: 백성이 다치지 않아야 황충 장군에게도 예가 닿습니다. 싸움보다 군율을 먼저 보일 때입니다.' + ] + }, + 'vanguard-broken': { + title: '황충 전열 예우', + lines: [ + '관우: 노장의 활은 꺾을 것이 아니라 예로 맞을 상대다. 전열을 흐트러뜨리되 이름을 욕보이지 마라.', + '제갈량: 황충을 얕보지 않는 태도가 장사 병사들의 마음을 흔들 것입니다.' + ] + }, + 'leader-wavering': { + title: '한현의 의심', + lines: [ + '황충의 전열이 예를 잃지 않은 채 물러서자, 한현의 의심 많은 명령은 성 안에서도 힘을 잃기 시작합니다.', + '위연: 백성을 지키는 군이라면 성문을 닫고 있을 이유가 없겠군.' + ] + } + } + }, + sortie: { + sortieLimit: 6, + requiredUnits: ['liu-bei', 'zhuge-liang'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'reserve', reason: '장사 항복 명분이자 패배 조건의 중심입니다.' }, + { unitId: 'guan-yu', role: 'front', reason: '황충과 무인의 예를 나누며 전열을 받아낼 주력입니다.' }, + { unitId: 'zhang-fei', role: 'front', reason: '서문 보병 전열을 밀어내고 성문 압박을 유지하는 돌파 역할입니다.' }, + { unitId: 'zhao-yun', role: 'flank', reason: '장사 성문 주변 기병과 척후를 빠르게 정리하기 좋습니다.' }, + { unitId: 'zhuge-liang', role: 'support', reason: '한현의 의심과 성문 방어선을 끊는 작전 핵심입니다.' }, + { unitId: 'gong-zhi', 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: 27, role: 'reserve', unitId: 'liu-bei', label: '항복 명분' }, + { x: 6, y: 25, role: 'front', unitId: 'guan-yu', label: '노장 전열' }, + { x: 6, y: 29, role: 'front', unitId: 'zhang-fei', label: '서문 돌파' }, + { x: 8, y: 25, role: 'flank', unitId: 'zhao-yun', label: '동문 차단' }, + { x: 5, y: 27, role: 'support', unitId: 'zhuge-liang', label: '의심 해소' }, + { x: 9, y: 30, role: 'support', unitId: 'gong-zhi', label: '장사 길' } + ], + note: + '장사 노장 대면전은 공지의 현지 정보가 처음 강하게 추천되는 전장입니다. 서문 마을을 안정시키고, 황충 전열을 예로 받아낸 뒤 한현의 의심선을 압박하십시오.' + }, map: twentySixthBattleMap, units: twentySixthBattleUnits, bonds: twentySixthBattleBonds, mapTextureKey: 'battle-map-twenty-sixth', leaderUnitId: 'changsha-leader-han-xuan', - quickVictoryTurnLimit: 35, + quickVictoryTurnLimit: 46, baseVictoryGold: 3560, objectives: [ { id: 'leader', - kind: 'defeat-leader', - label: '한현 퇴각', + kind: 'pacify-leader', + label: '한현 의심 해소', rewardGold: 2320, unitId: 'changsha-leader-han-xuan' }, @@ -3634,19 +3700,48 @@ export const twentySixthBattleScenario: BattleScenarioDefinition = { rewardGold: 940, unitId: 'zhuge-liang' }, + { + id: 'west-village', + kind: 'secure-terrain', + label: '서문 마을 안정', + rewardGold: 980, + terrain: 'village', + targetTile: { x: 40, y: 20, radius: 12 }, + threatRadius: 0 + }, { id: 'changsha-village', kind: 'secure-terrain', label: '장사 마을 안정', rewardGold: 1120, - terrain: 'village' + terrain: 'village', + targetTile: { x: 37, y: 16, radius: 4 }, + threatRadius: 0 + }, + { + id: 'huang-zhong-line', + kind: 'secure-terrain', + label: '황충 전열 예우', + rewardGold: 1180, + terrain: 'road', + targetTile: { x: 45, y: 16, radius: 8 }, + threatRadius: 0 + }, + { + id: 'gate-pressure', + kind: 'secure-terrain', + label: '성문 의심선 압박', + rewardGold: 1100, + terrain: 'fort', + targetTile: { x: 45, y: 16, radius: 6 }, + threatRadius: 0 }, { id: 'quick', kind: 'quick-victory', - label: '35턴 이내 승리', + label: '46턴 이내 승리', rewardGold: 880, - maxTurn: 35 + maxTurn: 46 } ], defeatConditions: [ @@ -3654,6 +3749,14 @@ export const twentySixthBattleScenario: BattleScenarioDefinition = { { kind: 'unit-defeated', unitId: 'zhuge-liang' } ], itemRewards: ['콩 12', '상처약 8', '탁주 5', '장사 사절 문서 +1', '황충 합류', '위연 합류'], + campaignReward: { + supplies: ['콩 12', '상처약 8', '탁주 5'], + reputation: ['장사 사절 문서 +1', '황충 예우 +1'], + recruits: ['huang-zhong', 'wei-yan'], + unlockBattleId: 'twenty-seventh-battle-yizhou-relief-road', + unlockLabel: '익주 원군로 개방', + note: '황충의 명예를 지키며 한현의 의심을 꺾었습니다. 황충과 위연이 합류하고, 익주 원군 요청으로 다음 길이 열립니다.' + }, victoryPages: twentySixthBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/campaignFlow.ts b/src/game/data/campaignFlow.ts index cc04fcf..7f10d24 100644 --- a/src/game/data/campaignFlow.ts +++ b/src/game/data/campaignFlow.ts @@ -488,8 +488,8 @@ const sortieFlows: Record = { eyebrow: '다음 전장', title: twentySeventhBattleScenario.title, description: - '장사까지 열리며 형주 남부의 뿌리가 단단해졌습니다. 이제 유장의 원군 요청을 명분으로 익주 원군로를 열고, 봉추 방통의 마음까지 얻어야 합니다.', - rewardHint: `예상 보상: ${twentySeventhBattleScenario.title} 개방 / 방통 합류`, + '서문 마을을 지키고 황충의 명예를 세운 끝에 장사까지 열렸습니다. 황충과 위연이 합류하며 형주 남부의 뿌리가 단단해졌고, 이제 유장의 원군 요청을 명분으로 익주 원군로를 열어야 합니다.', + rewardHint: `예상 보상: ${twentySeventhBattleScenario.title} 개방 / 황충·위연 전력화 / 방통 합류`, nextBattleId: twentySeventhBattleScenario.id, campaignStep: 'twenty-seventh-battle', pages: [...twentySixthBattleVictoryPages, ...twentySeventhBattleIntroPages] diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index 0eec47c..ce01916 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -1954,7 +1954,7 @@ export const twentySixthBattleIntroPages: StoryPage[] = [ chapter: '장사의 노장', background: 'story-yizhou', speaker: '공지', - text: '장사에는 황충이라는 노장이 있습니다. 나이는 들었으나 활은 여전히 매섭고, 성 안 병사들은 그 이름을 믿고 버팁니다.' + text: '장사 서문으로 가는 길은 제가 안내하겠습니다. 그 성에는 황충이라는 노장이 있습니다. 활은 여전히 매섭고, 성 안 병사들은 그 이름을 믿고 버팁니다.' }, { id: 'twenty-sixth-han-xuan-suspicion', @@ -1962,7 +1962,7 @@ export const twentySixthBattleIntroPages: StoryPage[] = [ chapter: '의심 많은 태수', background: 'story-yizhou', speaker: '이적', - text: '한현은 황충의 명망도 의심한다고 합니다. 성을 무너뜨리기보다 황충의 체면을 지키면, 장사 사람들의 마음도 흔들릴 것입니다.' + text: '한현은 황충의 명망도 의심한다고 합니다. 성을 부수기보다 서문 마을을 지키고 황충 장군의 체면을 세우면, 장사 사람들의 마음도 흔들릴 것입니다.' }, { id: 'twenty-sixth-wei-yan-rumor', @@ -1970,7 +1970,7 @@ export const twentySixthBattleIntroPages: StoryPage[] = [ chapter: '성문 안의 불씨', background: 'story-yizhou', speaker: '마량', - text: '위연이라는 장수는 성 안의 부당함을 참지 못한다고 들었습니다. 백성을 해치지 않고 한현의 의심을 꺾으면, 성 안에서 길이 열릴 수 있습니다.' + text: '위연이라는 장수는 한현의 의심과 부당한 명령을 참지 못한다고 들었습니다. 성문 전열을 흔들되 백성을 해치지 않으면, 성 안에서 길이 열릴 수 있습니다.' }, { id: 'twenty-sixth-changsha-sortie', @@ -1979,7 +1979,7 @@ export const twentySixthBattleIntroPages: StoryPage[] = [ background: 'story-yizhou', speaker: '유비', portrait: 'liuBei', - text: '오늘은 노장의 이름을 꺾으러 가는 것이 아니오. 예를 갖추고 한현의 의심을 물리쳐, 장사의 사람을 얻어야 하오.' + text: '오늘은 노장의 이름을 꺾으러 가는 것이 아니오. 마을을 지키고 예를 갖춘 뒤 한현의 의심을 물리쳐, 장사의 사람을 얻어야 하오.' } ]; @@ -1989,7 +1989,7 @@ export const twentySixthBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '장사 성문이 열리다', background: 'story-yizhou', - text: '한현의 의심이 전장 위에서 무너지자, 장사 성문은 크게 흔들렸습니다. 유비군은 황충의 명예를 욕보이지 않고 병사들에게 길을 열었습니다.' + text: '서문 마을이 안정되고 황충의 전열이 예를 잃지 않은 채 물러서자, 한현의 의심은 성 안에서도 힘을 잃었습니다. 장사 성문은 크게 흔들렸습니다.' }, { id: 'twenty-sixth-huang-zhong-joins', @@ -1997,7 +1997,7 @@ export const twentySixthBattleVictoryPages: StoryPage[] = [ chapter: '황충의 합류', background: 'story-yizhou', speaker: '황충', - text: '늙은 몸이라 하나, 아직 활은 뜻을 향해 날아갈 수 있습니다. 장사를 예로 대하신 주공의 군에 제 활을 맡기겠습니다.' + text: '전장에서 늙은 이름을 욕보이지 않고 예로 맞아 주셨습니다. 아직 활은 뜻을 향해 날아갈 수 있으니, 장사를 예로 대하신 주공의 군에 제 활을 맡기겠습니다.' }, { id: 'twenty-sixth-wei-yan-joins', @@ -2005,7 +2005,7 @@ export const twentySixthBattleVictoryPages: StoryPage[] = [ chapter: '위연의 결심', background: 'story-yizhou', speaker: '위연', - text: '의심과 두려움으로 닫힌 성문을 더는 따를 수 없습니다. 제 창은 닫힌 문을 여는 데 쓰겠습니다.' + text: '마을을 지키는 군을 향해 의심만 내세우는 성문을 더는 따를 수 없습니다. 제 창은 닫힌 문을 여는 데 쓰겠습니다.' }, { id: 'twenty-sixth-next-yi-province', diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index 07c6105..a996f77 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -965,15 +965,30 @@ const sortieRulesByBattleId: Partial