From 3b8e8ad9690633fdd04f490c9c10156c9e7e4ac4 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Sat, 4 Jul 2026 17:05:16 +0900 Subject: [PATCH] Refine Yuan refuge battle flow --- src/game/data/battles.ts | 106 ++++++++++++++++++++++++++++++++--- src/game/data/scenario.ts | 16 +++--- src/game/scenes/CampScene.ts | 13 +++-- 3 files changed, 114 insertions(+), 21 deletions(-) diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index 89374b3..32e0408 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -1973,16 +1973,88 @@ export const fifteenthBattleScenario: BattleScenarioDefinition = { victoryConditionLabel: '채양 격파', defeatConditionLabel: '유비 퇴각', openingObjectiveLines: [ - '유비군은 조조의 추격을 피해 원소 진영으로 향합니다. 채양을 격파하면 북상로의 압박을 끊고 접선지로 나아갈 수 있습니다.', - '강줄기와 고갯길 사이로 추격 기병이 파고들고, 궁병은 접선지를 향한 길을 끊으려 합니다. 전열을 세우면서도 손건과 간옹의 책략 지원을 살려야 합니다.', - '원소 사자가 기다리는 북동쪽 접선지를 확보하고 24턴 안에 승리하면 다음 의탁 장을 더 유리하게 시작합니다.' + '유비군은 조조의 추격을 피해 원소 진영으로 향합니다. 손건의 통행 문서가 닿으려면 채양의 추격대를 떨쳐 내고 북동쪽 접선지까지 길을 열어야 합니다.', + '채양 본진의 봉화대를 끊지 못하면 후방 추격 기병이 계속 따라붙습니다. 장비는 남쪽 추격로를 막고, 관우는 고갯길을 밀어 접선지 앞 수비선을 흔드십시오.', + '원소 사자가 기다리는 북동쪽 요새 접선지를 확보하고 55턴 안에 승리하면, 조운의 재합류와 다음 의탁로를 더 안정적으로 준비할 수 있습니다.' ], + tacticalGuide: { + summary: '서남 진영에서 중앙 고갯길을 밀고, 채양 본진 봉화대를 끊어 북동쪽 원소 접선지로 나아가는 도주/접선 전투입니다.', + route: '서남 진영 → 중앙 고갯길 → 채양 본진 봉화대 → 원소 사자 접선지', + focus: + '채양만 향해 달리면 뒤따라온 기병과 고지 궁병이 유비의 후방을 찌릅니다. 장비는 남쪽 추격로를 막고, 관우는 중앙 고갯길을 지나 채양 본진 봉화대를 끊으며, 손건과 간옹은 접선 문서와 책략 지원을 맡아야 합니다.', + roles: [ + '유비: 의탁 명분 유지와 생존', + '관우: 중앙 고갯길 정면 돌파', + '장비: 남쪽 추격 기병 차단', + '손건: 원소 접선 문서 정리', + '간옹: 추격대 동요와 책략 지원', + '미축: 장기 도주전 보급 유지' + ], + events: { + 'village-approach': { + title: '접선 핵심 지점 접근', + lines: [ + '이 지점을 잡으면 조조군의 추격로와 원소 사자에게 닿는 길이 함께 열립니다.', + '주변 방어 병력을 정리한 뒤 손건의 문서를 앞세우면 접선 명분을 잃지 않고 북상할 수 있습니다.' + ] + }, + 'enemy-posture': { + title: '채양의 추격 진형', + lines: [ + '채양은 북동쪽 요새에 버티고, 기병은 남쪽 길을 타고 후방을 물려 합니다.', + '장비로 추격로를 끊고 관우가 중앙을 누르면 손건과 간옹이 접선 문서를 안전하게 밀어 올릴 수 있습니다.' + ] + }, + 'cavalry-approach': { + title: '조조군 추격 기병', + lines: [ + '기병이 길을 따라 유비의 후방을 노립니다.', + '장비를 남쪽 길목에 세워 먼저 받아치면 접선지로 나아갈 전열이 흐트러지지 않습니다.' + ] + }, + 'leader-wavering': { + title: '채양 수비선 동요', + lines: [ + '추격로와 접선지가 흔들리자 채양의 봉쇄선이 좁아지고 있습니다.', + '유비를 무리하게 앞세우지 말고 관우와 장비가 양쪽 압박을 유지하면 북상로가 열립니다.' + ] + } + } + }, + sortie: { + sortieLimit: 6, + requiredUnits: ['liu-bei'], + recommendedUnits: [ + { unitId: 'liu-bei', role: 'support', reason: '원소에게 의탁할 명분과 생존 조건을 모두 짊어집니다. 후방 지휘를 맡깁니다.' }, + { unitId: 'guan-yu', role: 'front', reason: '중앙 고갯길과 접선지 앞 수비선을 정면에서 밀어낼 핵심 전열입니다.' }, + { unitId: 'zhang-fei', role: 'flank', reason: '남쪽으로 붙는 추격 기병을 받아쳐 후방 길목을 끊는 역할입니다.' }, + { unitId: 'sun-qian', role: 'support', reason: '원소 사자와의 접선 문서를 정리해 접선지 확보 목표에 직접 힘을 보탭니다.' }, + { unitId: 'jian-yong', role: 'support', reason: '간옹의 말과 책략은 채양 추격대의 전열을 늦추는 데 유리합니다.' }, + { unitId: 'mi-zhu', role: 'reserve', reason: '긴 도주전에서 회복품과 보급선을 유지해 다음 의탁로까지 피해를 줄입니다.' } + ], + recommendedClasses: [ + { label: '의탁 지휘', classKeys: ['lord'], reason: '유비 생존과 전후 명분이 원소 의탁 흐름을 좌우합니다.' }, + { label: '고갯길 전열', classKeys: ['infantry'], reason: '중앙 수비선과 채양 본진 앞 보병을 안정적으로 밀 수 있습니다.' }, + { label: '추격 차단', classKeys: ['spearman'], reason: '길을 따라 따라붙는 기병을 받아치고 후방을 지키기 좋습니다.' }, + { label: '접선 문서', classKeys: ['strategist'], reason: '원소 사자와의 접선 명분, 궁병 견제, 책략 지원이 함께 필요합니다.' }, + { label: '보급 유지', classKeys: ['quartermaster'], reason: '도주전은 피해 누적이 크므로 회복품과 보급 보존이 다음 전투 여유로 이어집니다.' } + ], + deploymentSlots: [ + { role: 'support', unitId: 'liu-bei', x: 3, y: 18, label: '후방 지휘' }, + { role: 'front', unitId: 'guan-yu', x: 4, y: 17, label: '고갯길 전열' }, + { role: 'flank', unitId: 'zhang-fei', x: 4, y: 19, label: '추격 차단' }, + { role: 'support', unitId: 'sun-qian', x: 5, y: 18, label: '접선 문서' }, + { role: 'support', unitId: 'jian-yong', x: 5, y: 20, label: '책략 지원' }, + { role: 'reserve', unitId: 'mi-zhu', x: 3, y: 20, label: '보급 유지' } + ], + note: '원소 의탁로는 중앙 고갯길을 열고 채양 본진 봉화대를 끊은 뒤 북동쪽 접선지로 오르는 전투입니다. 추천 배치는 장비가 남쪽 기병을 막고, 관우가 고갯길을 열며, 손건과 간옹이 접선 문서와 책략으로 전열을 받치는 형태입니다.' + }, map: fifteenthBattleMap, units: fifteenthBattleUnits, bonds: fifteenthBattleBonds, mapTextureKey: 'battle-map-fifteenth', leaderUnitId: 'yuan-refuge-leader-cai-yang', - quickVictoryTurnLimit: 24, + quickVictoryTurnLimit: 55, baseVictoryGold: 1760, objectives: [ { @@ -2004,18 +2076,38 @@ export const fifteenthBattleScenario: BattleScenarioDefinition = { kind: 'secure-terrain', label: '원소 사자 접선지 확보', rewardGold: 640, - terrain: 'fort' + terrain: 'fort', + targetTile: { x: 31, y: 12, radius: 4 }, + threatRadius: 0 + }, + { + id: 'rear-guard', + kind: 'secure-terrain', + label: '채양 본진 봉화대 차단', + rewardGold: 520, + terrain: 'fort', + targetTile: { x: 31, y: 11, radius: 3 }, + threatRadius: 0 }, { id: 'quick', kind: 'quick-victory', - label: '24턴 이내 승리', + label: '55턴 이내 승리', rewardGold: 500, - maxTurn: 24 + maxTurn: 55 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], itemRewards: ['콩 6', '상처약 4', '탁주 2', '원소 접선 문서 +1'], + campaignReward: { + supplies: ['콩 6', '상처약 4', '탁주 2'], + equipment: ['원소 접선 문서 1'], + reputation: ['조조 추격 차단 +1', '원소 의탁 명분 +1'], + recruits: ['zhao-yun'], + unlockBattleId: 'sixteenth-battle-liu-biao-refuge', + unlockLabel: '유표 의탁로 개방', + note: '채양 본진 봉화대와 원소 사자 접선지를 함께 확보해 조조군의 추격 명분을 끊고, 조운이 다시 유비군에 합류할 길을 엽니다.' + }, victoryPages: fifteenthBattleVictoryPages, nextCampScene: 'CampScene' }; diff --git a/src/game/data/scenario.ts b/src/game/data/scenario.ts index e6fa0dc..688084c 100644 --- a/src/game/data/scenario.ts +++ b/src/game/data/scenario.ts @@ -1263,7 +1263,7 @@ export const fifteenthBattleIntroPages: StoryPage[] = [ chapter: '북쪽의 초대', background: 'story-wandering', speaker: '손건', - text: '원소 진영에서 사자가 내려왔습니다. 조조를 떠난 주공을 받아들일 뜻은 있으나, 북상로 곳곳에는 조조군 추격대가 깔려 있습니다.' + text: '원소 진영에서 사자가 내려왔습니다. 북동쪽 요새 앞에서 접선하자 하나, 채양의 추격대가 강가 길목과 고갯길을 나누어 막고 있습니다.' }, { id: 'fifteenth-liu-bei-under-yuan-shadow', @@ -1272,7 +1272,7 @@ export const fifteenthBattleIntroPages: StoryPage[] = [ background: 'story-wandering', speaker: '유비', portrait: 'liuBei', - text: '원소의 깃발 아래로 들어가는 일은 뜻을 접는 일이 아니다. 지금은 큰 세력의 틈에서 백성을 지킬 시간을 얻어야 한다.' + text: '원소의 깃발 아래로 들어가는 일은 뜻을 접는 일이 아니다. 조조의 칼끝을 피하고 백성을 지킬 시간을 얻기 위해, 오늘은 의탁할 길을 열어야 한다.' }, { id: 'fifteenth-guan-yu-pursuit-road', @@ -1281,7 +1281,7 @@ export const fifteenthBattleIntroPages: StoryPage[] = [ background: 'story-wandering', speaker: '관우', portrait: 'guanYu', - text: '추격대가 강가와 고갯길을 나누어 막고 있습니다. 채양의 군세를 물리치고 접선지를 확보해야 원소 진영과 이어질 수 있습니다.' + text: '채양 본진의 봉화대를 그냥 두면 후방 기병이 계속 따라붙습니다. 제가 고갯길을 밀겠습니다. 장비가 남쪽 추격로를 끊으면 접선지 앞 수비선이 흔들릴 것입니다.' }, { id: 'fifteenth-yuan-road-sortie', @@ -1290,7 +1290,7 @@ export const fifteenthBattleIntroPages: StoryPage[] = [ background: 'story-wandering', speaker: '장비', portrait: 'zhangFei', - text: '쫓아오는 놈들이 조조의 명이라 떠들어도 결국 길을 막는 적일 뿐입니다. 형님, 이번엔 북쪽 길을 시원하게 열어 봅시다!' + text: '좋습니다. 저는 남쪽 길에서 달려드는 놈들을 받아치겠습니다. 손건은 문서를 챙기고, 간옹은 적 전열을 흔드시오. 형님은 뒤에서 접선 명분을 지켜 주십시오!' } ]; @@ -1300,7 +1300,7 @@ export const fifteenthBattleVictoryPages: StoryPage[] = [ bgm: 'militia-theme', chapter: '추격을 끊다', background: 'story-wandering', - text: '채양의 추격대가 흩어지자 북상로의 먼지가 잠시 가라앉았다. 유비군은 원소의 사자가 기다리는 접선지에 닿을 수 있었다.' + text: '채양 본진 봉화대와 북동쪽 접선지가 차례로 열리자 추격대는 더는 유비군의 뒤를 물지 못했다. 원소의 사자는 손건의 문서를 확인하고 군막 안으로 길을 내주었다.' }, { id: 'fifteenth-yuan-camp-opens', @@ -1308,16 +1308,16 @@ export const fifteenthBattleVictoryPages: StoryPage[] = [ chapter: '원소의 장막', background: 'story-wandering', speaker: '간옹', - text: '원소의 진영은 넓고 군세는 크지만, 그만큼 말과 눈도 많습니다. 몸을 맡기되 마음까지 맡기지는 말아야 하겠지요.' + text: '원소의 진영은 넓고 군세는 크지만, 그만큼 말과 눈도 많습니다. 오늘 접선은 살 길을 얻은 일이지, 마음까지 맡긴 일은 아니라고 보아야 하겠지요.' }, { id: 'fifteenth-road-to-liu-biao', bgm: 'battle-prep', - chapter: '다음 의탁의 그림자', + chapter: '백마의 소식', background: 'story-wandering', speaker: '유비', portrait: 'liuBei', - text: '큰 깃발 아래에서도 우리의 뜻은 작아져서는 안 된다. 원소의 군영에서 기회를 살피고, 다시 백성을 지킬 길을 찾아야 한다.' + text: '원소의 군영에 머물며 때를 보자. 공손찬 장군의 옛 장수 조운이 이 근처에 있다는 말도 들었다. 다시 뜻을 같이할 인연이 있다면, 다음 길은 더 단단해질 것이다.' } ]; diff --git a/src/game/scenes/CampScene.ts b/src/game/scenes/CampScene.ts index ef6df5e..0404218 100644 --- a/src/game/scenes/CampScene.ts +++ b/src/game/scenes/CampScene.ts @@ -729,13 +729,14 @@ const sortieRulesByBattleId: Partial