Add Lucheng pursuit chapter
This commit is contained in:
@@ -12,6 +12,7 @@ import fiftyNinthBattleMapUrl from '../../assets/images/battle/fifty-ninth-battl
|
||||
import sixtiethBattleMapUrl from '../../assets/images/battle/sixtieth-battle-map.svg';
|
||||
import sixtyFirstBattleMapUrl from '../../assets/images/battle/sixty-first-battle-map.svg';
|
||||
import sixtySecondBattleMapUrl from '../../assets/images/battle/sixty-second-battle-map.svg';
|
||||
import sixtyThirdBattleMapUrl from '../../assets/images/battle/sixty-third-battle-map.svg';
|
||||
import fiftySeventhBattleMapUrl from '../../assets/images/battle/fifty-seventh-battle-map.svg';
|
||||
import fiftySixthBattleMapUrl from '../../assets/images/battle/fifty-sixth-battle-map.svg';
|
||||
import fifthBattleMapUrl from '../../assets/images/battle/fifth-battle-map.svg';
|
||||
@@ -122,6 +123,7 @@ export const battleMapAssets: Record<string, string> = {
|
||||
'battle-map-sixtieth': sixtiethBattleMapUrl,
|
||||
'battle-map-sixty-first': sixtyFirstBattleMapUrl,
|
||||
'battle-map-sixty-second': sixtySecondBattleMapUrl,
|
||||
'battle-map-sixty-third': sixtyThirdBattleMapUrl,
|
||||
'battle-map-fifty-seventh': fiftySeventhBattleMapUrl,
|
||||
'battle-map-fifty-sixth': fiftySixthBattleMapUrl
|
||||
};
|
||||
|
||||
@@ -47,6 +47,10 @@ import {
|
||||
sixtySecondBattleMap,
|
||||
sixtySecondBattleUnits,
|
||||
sixtySecondBattleVictoryPages,
|
||||
sixtyThirdBattleBonds,
|
||||
sixtyThirdBattleMap,
|
||||
sixtyThirdBattleUnits,
|
||||
sixtyThirdBattleVictoryPages,
|
||||
fiftySeventhBattleBonds,
|
||||
fiftySeventhBattleMap,
|
||||
fiftySeventhBattleUnits,
|
||||
@@ -315,7 +319,8 @@ export type BattleScenarioId =
|
||||
| 'fifty-ninth-battle-chencang-siege'
|
||||
| 'sixtieth-battle-wudu-yinping'
|
||||
| 'sixty-first-battle-hanzhong-rain-defense'
|
||||
| 'sixty-second-battle-qishan-renewed-offensive';
|
||||
| 'sixty-second-battle-qishan-renewed-offensive'
|
||||
| 'sixty-third-battle-lucheng-pursuit';
|
||||
|
||||
export type BattleObjectiveKind = 'defeat-leader' | 'pacify-leader' | 'keep-unit-alive' | 'secure-terrain' | 'quick-victory';
|
||||
|
||||
@@ -4191,6 +4196,73 @@ export const sixtySecondBattleScenario: BattleScenarioDefinition = {
|
||||
nextCampScene: 'CampScene'
|
||||
};
|
||||
|
||||
export const sixtyThirdBattleScenario: BattleScenarioDefinition = {
|
||||
id: 'sixty-third-battle-lucheng-pursuit',
|
||||
title: '노성 추격전',
|
||||
victoryConditionLabel: '노성 추격로 확보와 회수 표식 유지',
|
||||
defeatConditionLabel: '제갈량 퇴각 또는 보급 수레 붕괴',
|
||||
openingObjectiveLines: [
|
||||
'기산 재출정으로 노성 앞 지연선을 밀어 낸 촉한군은 더 깊은 추격로를 열려 합니다. 그러나 사마의는 물러나는 척하며 회수 표식과 보급 수레를 끊으려 합니다.',
|
||||
'강유와 위연은 낮은 길과 돌파선을 나누고, 조운과 왕평은 장합의 기병이 뒤를 흔들기 전에 예비대와 표식을 이어야 합니다.',
|
||||
'사마의의 노성 방어 본영, 장합의 회수선 추격대, 곽회의 봉화 차단로를 동시에 끊으십시오. 추격로를 얻어도 수레와 마을을 잃으면 다음 북벌은 깊어질 수 없습니다.'
|
||||
],
|
||||
map: sixtyThirdBattleMap,
|
||||
units: sixtyThirdBattleUnits,
|
||||
bonds: sixtyThirdBattleBonds,
|
||||
mapTextureKey: 'battle-map-sixty-third',
|
||||
leaderUnitId: 'northern-ninth-leader-sima-yi',
|
||||
quickVictoryTurnLimit: 126,
|
||||
baseVictoryGold: 19880,
|
||||
objectives: [
|
||||
{
|
||||
id: 'break-sima-yi-lucheng-defense',
|
||||
kind: 'defeat-leader',
|
||||
label: '사마의 노성 방어 돌파',
|
||||
rewardGold: 14100,
|
||||
unitId: 'northern-ninth-leader-sima-yi'
|
||||
},
|
||||
{
|
||||
id: 'stop-zhang-he-return-raid',
|
||||
kind: 'defeat-leader',
|
||||
label: '장합 회수선 추격 저지',
|
||||
rewardGold: 8500,
|
||||
unitId: 'northern-ninth-officer-zhang-he'
|
||||
},
|
||||
{
|
||||
id: 'silence-guo-huai-beacons',
|
||||
kind: 'defeat-leader',
|
||||
label: '곽회 봉화 차단',
|
||||
rewardGold: 7900,
|
||||
unitId: 'northern-ninth-officer-guo-huai'
|
||||
},
|
||||
{
|
||||
id: 'hold-return-supply-camps',
|
||||
kind: 'secure-terrain',
|
||||
label: '회수 보급 진영 유지',
|
||||
rewardGold: 6640,
|
||||
terrain: 'camp'
|
||||
},
|
||||
{
|
||||
id: 'reassure-lucheng-villages',
|
||||
kind: 'secure-terrain',
|
||||
label: '노성 주변 마을 안심',
|
||||
rewardGold: 6440,
|
||||
terrain: 'village'
|
||||
},
|
||||
{
|
||||
id: 'quick',
|
||||
kind: 'quick-victory',
|
||||
label: '126턴 이내 추격로 확보',
|
||||
rewardGold: 4360,
|
||||
maxTurn: 126
|
||||
}
|
||||
],
|
||||
defeatConditions: [{ kind: 'unit-defeated', unitId: 'zhuge-liang' }],
|
||||
itemRewards: ['금 132', '상처약 102', '군주 50', '노성 추격 장부 1', '회수 표식 기록 1'],
|
||||
victoryPages: sixtyThirdBattleVictoryPages,
|
||||
nextCampScene: 'CampScene'
|
||||
};
|
||||
|
||||
export const defaultBattleScenarioId: BattleScenarioId = firstBattleScenario.id;
|
||||
|
||||
export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition> = {
|
||||
@@ -4255,7 +4327,8 @@ export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition>
|
||||
'fifty-ninth-battle-chencang-siege': fiftyNinthBattleScenario,
|
||||
'sixtieth-battle-wudu-yinping': sixtiethBattleScenario,
|
||||
'sixty-first-battle-hanzhong-rain-defense': sixtyFirstBattleScenario,
|
||||
'sixty-second-battle-qishan-renewed-offensive': sixtySecondBattleScenario
|
||||
'sixty-second-battle-qishan-renewed-offensive': sixtySecondBattleScenario,
|
||||
'sixty-third-battle-lucheng-pursuit': sixtyThirdBattleScenario
|
||||
};
|
||||
|
||||
export const defaultBattleScenario = battleScenarios[defaultBattleScenarioId];
|
||||
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
sixtiethBattleScenario,
|
||||
sixtyFirstBattleScenario,
|
||||
sixtySecondBattleScenario,
|
||||
sixtyThirdBattleScenario,
|
||||
fortiethBattleScenario,
|
||||
fortyFirstBattleScenario,
|
||||
fortySecondBattleScenario,
|
||||
@@ -84,6 +85,8 @@ import {
|
||||
sixtyFirstBattleVictoryPages,
|
||||
sixtySecondBattleIntroPages,
|
||||
sixtySecondBattleVictoryPages,
|
||||
sixtyThirdBattleIntroPages,
|
||||
sixtyThirdBattleVictoryPages,
|
||||
fiftyFirstBattleIntroPages,
|
||||
fiftyFirstBattleVictoryPages,
|
||||
fiftySecondBattleIntroPages,
|
||||
@@ -911,13 +914,24 @@ const sortieFlows: Record<string, SortieFlow> = {
|
||||
},
|
||||
[sixtySecondBattleScenario.id]: {
|
||||
afterBattleId: sixtySecondBattleScenario.id,
|
||||
eyebrow: '다음 장 준비',
|
||||
title: '기산 재출정 이후',
|
||||
eyebrow: '다음 전장',
|
||||
title: sixtyThirdBattleScenario.title,
|
||||
description:
|
||||
'사마의의 지연선을 밀어 냈지만 북방 전선은 더 깊어졌습니다. 다음 계산에서는 노성 앞에서 확보한 길을 어디까지 밀고, 누가 돌아올 표식과 군량 장부를 맡을지 다시 정해야 합니다.',
|
||||
rewardHint: '다음 목표: 노성 전선 재정비 / 더 깊은 북벌 공격로 검토',
|
||||
pages: sixtySecondBattleVictoryPages,
|
||||
unavailableNotice: '기산 재출정 이후의 다음 북벌 전투는 이어지는 작업에서 확장합니다. 현재는 사마의 지연선 돌파, 회수선 표식, 기산 보급로 전진을 확인할 수 있습니다.'
|
||||
'사마의의 지연선을 밀어 냈지만 노성 뒤의 전선은 아직 닫히지 않았습니다. 장합의 회수선 추격, 곽회의 봉화 차단, 수레와 마을의 부담을 상대하려면 7명 안에서 전진과 회수를 다시 나누어야 합니다.',
|
||||
rewardHint: `예상 보상: ${sixtyThirdBattleScenario.title} 개방 / 노성 추격 장부`,
|
||||
nextBattleId: sixtyThirdBattleScenario.id,
|
||||
campaignStep: 'sixty-third-battle',
|
||||
pages: [...sixtySecondBattleVictoryPages, ...sixtyThirdBattleIntroPages]
|
||||
},
|
||||
[sixtyThirdBattleScenario.id]: {
|
||||
afterBattleId: sixtyThirdBattleScenario.id,
|
||||
eyebrow: '다음 장 준비',
|
||||
title: '노성 추격 이후',
|
||||
description:
|
||||
'노성 추격로와 회수 표식은 지켜 냈지만 북방 전선은 여전히 길고 무겁습니다. 다음 계산에서는 얻은 길을 지키는 장부와 더 깊은 북벌 공세를 다시 맞춰야 합니다.',
|
||||
rewardHint: '다음 목표: 북방 전선 재정비 / 다음 북벌 공격로 검토',
|
||||
pages: sixtyThirdBattleVictoryPages,
|
||||
unavailableNotice: '노성 추격 이후의 다음 북벌 전투는 이어지는 작업에서 확장합니다. 현재는 회수 표식, 장합 추격 저지, 노성 주변 보급과 민심 정비를 확인할 수 있습니다.'
|
||||
},
|
||||
'northern-campaign-prep-camp-legacy': {
|
||||
afterBattleId: fiftyFourthBattleScenario.id,
|
||||
|
||||
@@ -3960,6 +3960,59 @@ export const sixtySecondBattleVictoryPages: StoryPage[] = [
|
||||
}
|
||||
];
|
||||
|
||||
export const sixtyThirdBattleIntroPages: StoryPage[] = [
|
||||
{
|
||||
id: 'sixty-third-lucheng-pursuit-council',
|
||||
bgm: 'story-dark',
|
||||
chapter: '노성 추격',
|
||||
background: 'story-lucheng-pursuit',
|
||||
speaker: '제갈량',
|
||||
text: '사마의가 노성 뒤로 물러났다고 하여 길이 끝난 것은 아닙니다. 물러난 군은 추격당하는 척하며 돌아갈 길과 보급 수레를 끊으려 합니다.'
|
||||
},
|
||||
{
|
||||
id: 'sixty-third-zhanghe-rear-raid',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '장합의 뒷길',
|
||||
background: 'story-lucheng-pursuit',
|
||||
speaker: '조운',
|
||||
text: '장합의 기병은 앞의 성보다 뒤의 표식을 노릴 것입니다. 전진하는 부대가 승리를 보고 달릴수록, 돌아오는 병사는 어둠 속에서 길을 잃습니다.'
|
||||
},
|
||||
{
|
||||
id: 'sixty-third-supply-and-villages',
|
||||
bgm: 'story-dark',
|
||||
chapter: '이긴 길을 지키다',
|
||||
background: 'story-lucheng-pursuit',
|
||||
speaker: '황권',
|
||||
text: '노성으로 더 깊이 들어가려면 수레와 고시문이 군기보다 먼저 도착해야 합니다. 이번 출전에서는 추격과 회수, 장부와 민심을 한 전장 안에서 다시 나누어야 합니다.'
|
||||
}
|
||||
];
|
||||
|
||||
export const sixtyThirdBattleVictoryPages: StoryPage[] = [
|
||||
{
|
||||
id: 'sixty-third-victory-return-road-held',
|
||||
bgm: 'militia-theme',
|
||||
chapter: '돌아오는 길',
|
||||
background: 'story-lucheng-pursuit',
|
||||
text: '촉한군은 노성 추격로를 열었고, 장합의 기병이 회수 표식을 흔들기 전에 예비대를 움직였습니다. 전진한 병사들은 처음으로 깊이 들어간 뒤에도 돌아올 길을 보았습니다.'
|
||||
},
|
||||
{
|
||||
id: 'sixty-third-victory-ledger-and-signal',
|
||||
bgm: 'story-dark',
|
||||
chapter: '봉화와 장부',
|
||||
background: 'story-lucheng-pursuit',
|
||||
speaker: '강유',
|
||||
text: '곽회의 봉화가 끊기자 노성 앞 마을과 수레 진영이 한 줄로 이어졌습니다. 강유는 낮은 길을 새 지도에 옮겼고, 왕평은 그 길마다 멈출 표식을 남겼습니다.'
|
||||
},
|
||||
{
|
||||
id: 'sixty-third-next-northern-plan',
|
||||
bgm: 'story-dark',
|
||||
chapter: '다음 북방의 무게',
|
||||
background: 'story-lucheng-pursuit',
|
||||
speaker: '제갈량',
|
||||
text: '오늘의 추격은 길을 얻었을 뿐, 아직 전쟁의 끝은 아닙니다. 더 깊은 북방으로 가려면 누가 길을 열고 누가 나라의 숨을 아낄지 다시 정해야 합니다.'
|
||||
}
|
||||
];
|
||||
|
||||
export const firstBattleMap: BattleMap = {
|
||||
width: 20,
|
||||
height: 18,
|
||||
@@ -4477,6 +4530,12 @@ export const sixtySecondBattleMap: BattleMap = {
|
||||
terrain: createSixtySecondBattleTerrain()
|
||||
};
|
||||
|
||||
export const sixtyThirdBattleMap: BattleMap = {
|
||||
width: 126,
|
||||
height: 108,
|
||||
terrain: createSixtyThirdBattleTerrain()
|
||||
};
|
||||
|
||||
export const firstBattleUnits: UnitData[] = [
|
||||
{
|
||||
id: 'liu-bei',
|
||||
@@ -17876,6 +17935,103 @@ export const sixtySecondBattleUnits: UnitData[] = [
|
||||
createThirtyFirstEnemyUnit('northern-eighth-leader-sima-yi', '사마의', '위군 지연 총지휘', 'rebelLeader', 222, 1740, 410, 116, 40)
|
||||
];
|
||||
|
||||
const sixtyThirdBattleAllyPositions: Record<string, { x: number; y: number }> = {
|
||||
'guan-yu': { x: 16, y: 96 },
|
||||
'zhang-fei': { x: 24, y: 99 },
|
||||
'jian-yong': { x: 8, y: 104 },
|
||||
'mi-zhu': { x: 13, y: 105 },
|
||||
'sun-qian': { x: 19, y: 105 },
|
||||
'zhao-yun': { x: 31, y: 94 },
|
||||
'zhuge-liang': { x: 18, y: 91 },
|
||||
'ma-liang': { x: 25, y: 88 },
|
||||
'yi-ji': { x: 8, y: 106 },
|
||||
'gong-zhi': { x: 29, y: 103 },
|
||||
'huang-zhong': { x: 39, y: 92 },
|
||||
'wei-yan': { x: 45, y: 93 },
|
||||
'pang-tong': { x: 15, y: 87 },
|
||||
'fa-zheng': { x: 29, y: 86 },
|
||||
'wu-yi': { x: 48, y: 101 },
|
||||
'yan-yan': { x: 52, y: 94 },
|
||||
'li-yan': { x: 34, y: 85 },
|
||||
'huang-quan': { x: 12, y: 90 },
|
||||
'ma-chao': { x: 55, y: 90 },
|
||||
'ma-dai': { x: 60, y: 97 },
|
||||
'wang-ping': { x: 41, y: 85 },
|
||||
'jiang-wei': { x: 35, y: 88 }
|
||||
};
|
||||
|
||||
const sixtyThirdEnemySpecs: ReadonlyArray<
|
||||
readonly [string, string, string, UnitClassKey, number, number, number, number, number]
|
||||
> = [
|
||||
['northern-ninth-scout-a', '노성 추격 척후병', '서쪽 추격 정찰', 'bandit', 223, 1090, 300, 48, 88],
|
||||
['northern-ninth-scout-b', '회수선 척후병', '회수선 정찰', 'bandit', 223, 1090, 300, 61, 84],
|
||||
['northern-ninth-scout-c', '낮은 길 척후병', '중앙 고개 정찰', 'bandit', 224, 1102, 302, 74, 78],
|
||||
['northern-ninth-scout-d', '동쪽 봉화 척후병', '동쪽 봉화 정찰', 'bandit', 224, 1102, 302, 88, 70],
|
||||
['northern-ninth-scout-e', '곽회 전초 척후병', '차단로 정찰', 'bandit', 225, 1114, 304, 103, 58],
|
||||
['northern-ninth-scout-f', '노성 뒤 척후병', '북쪽 절벽 정찰', 'bandit', 225, 1114, 304, 122, 36],
|
||||
['northern-ninth-infantry-a', '위군 추격 보병', '서쪽 추격 보병', 'yellowTurban', 224, 1620, 386, 55, 83],
|
||||
['northern-ninth-infantry-b', '위군 회수선 보병', '회수선 보병', 'yellowTurban', 224, 1620, 386, 68, 80],
|
||||
['northern-ninth-infantry-c', '위군 낮은 길 보병', '중앙 고개 보병', 'yellowTurban', 225, 1640, 390, 82, 73],
|
||||
['northern-ninth-infantry-d', '위군 봉화 보병', '봉화대 보병', 'yellowTurban', 225, 1640, 390, 96, 66],
|
||||
['northern-ninth-infantry-e', '곽회 차단 보병', '차단로 보병', 'yellowTurban', 226, 1660, 394, 108, 53],
|
||||
['northern-ninth-infantry-f', '노성 본영 보병', '본영 보병', 'yellowTurban', 226, 1660, 394, 118, 43],
|
||||
['northern-ninth-infantry-g', '수레길 차단병', '수레길 차단 보병', 'yellowTurban', 227, 1680, 398, 92, 88],
|
||||
['northern-ninth-infantry-h', '북쪽 문 보병', '북문 보병', 'yellowTurban', 227, 1680, 398, 124, 25],
|
||||
['northern-ninth-archer-a', '회수선 궁병', '서쪽 능선 궁병', 'archer', 224, 1180, 322, 64, 75],
|
||||
['northern-ninth-archer-b', '낮은 길 궁병', '중앙 능선 궁병', 'archer', 224, 1180, 322, 77, 69],
|
||||
['northern-ninth-archer-c', '봉화대 궁병', '봉화 능선 궁병', 'archer', 225, 1192, 324, 91, 60],
|
||||
['northern-ninth-archer-d', '차단로 궁병', '차단로 궁병', 'archer', 226, 1204, 326, 104, 49],
|
||||
['northern-ninth-archer-e', '본영 궁병', '노성 본영 궁병', 'archer', 226, 1204, 326, 116, 33],
|
||||
['northern-ninth-archer-f', '북쪽 절벽 궁병', '절벽 궁병', 'archer', 227, 1216, 328, 124, 17],
|
||||
['northern-ninth-cavalry-a', '장합 추격 기병', '서쪽 추격 기병', 'cavalry', 225, 1700, 410, 50, 76],
|
||||
['northern-ninth-cavalry-b', '장합 추격 기병', '회수선 추격 기병', 'cavalry', 225, 1700, 410, 63, 73],
|
||||
['northern-ninth-cavalry-c', '장합 추격 기병', '중앙 추격 기병', 'cavalry', 226, 1722, 414, 79, 65],
|
||||
['northern-ninth-cavalry-d', '곽회 차단 기병', '동쪽 차단 기병', 'cavalry', 227, 1744, 418, 96, 57],
|
||||
['northern-ninth-cavalry-e', '사마의 예비 기병', '본영 예비 기병', 'cavalry', 227, 1744, 418, 111, 43],
|
||||
['northern-ninth-cavalry-f', '북쪽 절벽 기병', '절벽 차단 기병', 'cavalry', 228, 1766, 422, 122, 28],
|
||||
['northern-ninth-ridge-guard-a', '노성 서로 수비대', '서쪽 고개 수비', 'yellowTurban', 225, 1640, 392, 42, 62],
|
||||
['northern-ninth-ridge-guard-b', '회수 표식 수비대', '표식 수비', 'yellowTurban', 225, 1640, 392, 59, 58],
|
||||
['northern-ninth-ridge-guard-c', '낮은 길 수비대', '중앙 고개 수비', 'yellowTurban', 226, 1660, 396, 76, 51],
|
||||
['northern-ninth-ridge-guard-d', '봉화 길 수비대', '봉화 길 수비', 'yellowTurban', 226, 1660, 396, 94, 42],
|
||||
['northern-ninth-ridge-guard-e', '사마의 본영 수비대', '본영 수비', 'yellowTurban', 227, 1680, 400, 110, 34],
|
||||
['northern-ninth-ridge-guard-f', '북쪽 절벽 수비대', '북쪽 절벽 수비', 'yellowTurban', 227, 1680, 400, 124, 22],
|
||||
['northern-ninth-strategist-a', '위군 추격 군리', '추격 장부 군리', 'strategist', 225, 1260, 342, 80, 58],
|
||||
['northern-ninth-strategist-b', '위군 보급 군리', '수레 차단 군리', 'strategist', 226, 1272, 344, 96, 46],
|
||||
['northern-ninth-strategist-c', '사마의 본영 군리', '본영 장부 군리', 'strategist', 226, 1272, 344, 112, 36],
|
||||
['northern-ninth-strategist-d', '곽회 봉화 군리', '봉화 장부 군리', 'strategist', 227, 1284, 346, 119, 66],
|
||||
['northern-ninth-officer-lucheng', '노성 추격장', '노성 추격 장수', 'rebelLeader', 229, 1760, 424, 84, 80],
|
||||
['northern-ninth-officer-supply', '수레 차단장', '수레 차단 장수', 'rebelLeader', 229, 1760, 424, 104, 72],
|
||||
['northern-ninth-officer-guo-huai', '곽회', '봉화 차단 장수', 'rebelLeader', 228, 1740, 420, 114, 70],
|
||||
['northern-ninth-officer-relay', '봉화 연락장', '노성 뒤 봉화 장수', 'rebelLeader', 228, 1740, 420, 118, 52],
|
||||
['northern-ninth-officer-zhang-he', '장합', '회수선 추격대장', 'rebelLeader', 230, 1800, 430, 120, 31],
|
||||
['northern-ninth-leader-sima-yi', '사마의', '노성 방어 총지휘', 'rebelLeader', 231, 1840, 436, 116, 43]
|
||||
];
|
||||
|
||||
export const sixtyThirdBattleUnits: UnitData[] = [
|
||||
...[
|
||||
...firstBattleUnits.filter((unit) => unit.faction === 'ally' && unit.id !== 'liu-bei'),
|
||||
...xuzhouRecruitUnits,
|
||||
...caoBreakRecruitUnits,
|
||||
...liuBiaoRecruitUnits,
|
||||
...zhugeRecruitUnits,
|
||||
...jingzhouRecruitUnits,
|
||||
...guiyangRecruitUnits,
|
||||
...wulingRecruitUnits,
|
||||
...changshaRecruitUnits,
|
||||
...yizhouRecruitUnits,
|
||||
...fuPassRecruitUnits,
|
||||
...luoCastleRecruitUnits,
|
||||
...luoCastleProperRecruitUnits,
|
||||
...chengduPressureRecruitUnits,
|
||||
...chengduSurrenderRecruitUnits,
|
||||
...hanzhongOpeningRecruitUnits,
|
||||
...hanzhongScoutRecruitUnits,
|
||||
...hanzhongMainRecruitUnits,
|
||||
...jiangWeiRecruitUnits
|
||||
].map((unit) => placeScenarioUnit(unit, sixtyThirdBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
|
||||
...sixtyThirdEnemySpecs.map((spec) => createThirtyFirstEnemyUnit(...spec))
|
||||
];
|
||||
|
||||
export const firstBattleBonds: BattleBond[] = [
|
||||
{
|
||||
id: 'liu-bei__guan-yu',
|
||||
@@ -19273,6 +19429,46 @@ export const sixtySecondBattleBonds: BattleBond[] = [
|
||||
...northernEighthBattleBonds
|
||||
].map(cloneBattleBondForScenario);
|
||||
|
||||
export const northernNinthBattleBonds: BattleBond[] = [
|
||||
{
|
||||
id: 'jiang-wei__zhao-yun_northern-ninth',
|
||||
unitIds: ['jiang-wei', 'zhao-yun'],
|
||||
title: '길잡이와 회수기',
|
||||
level: 56,
|
||||
exp: 0,
|
||||
description: '강유가 낮은 길을 읽고 조운이 예비대를 회수하면, 추격전에서도 앞선 병사가 길을 잃지 않습니다.'
|
||||
},
|
||||
{
|
||||
id: 'wei-yan__wang-ping_northern-ninth',
|
||||
unitIds: ['wei-yan', 'wang-ping'],
|
||||
title: '칼끝과 정지선',
|
||||
level: 54,
|
||||
exp: 0,
|
||||
description: '위연의 돌파와 왕평의 정지선이 함께 움직이면, 노성 추격로를 밀어붙이면서도 돌아올 표식을 남길 수 있습니다.'
|
||||
},
|
||||
{
|
||||
id: 'huang-quan__li-yan_northern-ninth',
|
||||
unitIds: ['huang-quan', 'li-yan'],
|
||||
title: '장부와 수레',
|
||||
level: 50,
|
||||
exp: 0,
|
||||
description: '황권의 군량 계산과 이엄의 운송 기준이 맞물리면, 더 깊은 추격도 한중 창고의 숨을 끊지 않습니다.'
|
||||
},
|
||||
{
|
||||
id: 'ma-liang__ma-dai_northern-ninth',
|
||||
unitIds: ['ma-liang', 'ma-dai'],
|
||||
title: '고시문과 측면',
|
||||
level: 46,
|
||||
exp: 0,
|
||||
description: '마량의 민심 문서와 마대의 측면 기동은 노성 앞 마을을 안심시키면서 곽회의 우회로를 견제합니다.'
|
||||
}
|
||||
];
|
||||
|
||||
export const sixtyThirdBattleBonds: BattleBond[] = [
|
||||
...sixtySecondBattleBonds,
|
||||
...northernNinthBattleBonds
|
||||
].map(cloneBattleBondForScenario);
|
||||
|
||||
function createEighthBattleTerrain(): TerrainType[][] {
|
||||
return Array.from({ length: 22 }, (_, y) =>
|
||||
Array.from({ length: 26 }, (_, x): TerrainType => {
|
||||
@@ -22749,6 +22945,88 @@ function createSixtySecondBattleTerrain(): TerrainType[][] {
|
||||
);
|
||||
}
|
||||
|
||||
function createSixtyThirdBattleTerrain(): TerrainType[][] {
|
||||
return Array.from({ length: 108 }, (_, y) =>
|
||||
Array.from({ length: 126 }, (_, x): TerrainType => {
|
||||
if (
|
||||
(x >= 6 && x <= 13 && y >= 0 && y <= 107) ||
|
||||
(x >= 66 && x <= 73 && y >= 10 && y <= 107) ||
|
||||
(x >= 0 && x <= 125 && y >= 100)
|
||||
) {
|
||||
return 'river';
|
||||
}
|
||||
if (
|
||||
(x >= 6 && x <= 86 && y >= 92 && y <= 98) ||
|
||||
(x >= 24 && x <= 106 && y >= 80 && y <= 88) ||
|
||||
(x >= 48 && x <= 114 && y >= 68 && y <= 78) ||
|
||||
(x >= 78 && x <= 122 && y >= 54 && y <= 66) ||
|
||||
(x >= 96 && x <= 125 && y >= 38 && y <= 50) ||
|
||||
(x >= 31 && x <= 41 && y >= 72 && y <= 102) ||
|
||||
(x >= 57 && x <= 66 && y >= 58 && y <= 94) ||
|
||||
(x >= 87 && x <= 97 && y >= 44 && y <= 84) ||
|
||||
(x >= 100 && x <= 110 && y >= 24 && y <= 70) ||
|
||||
(x >= 42 && x <= 86 && y >= 84 && y <= 90)
|
||||
) {
|
||||
return 'road';
|
||||
}
|
||||
if (
|
||||
(x >= 0 && x <= 39 && y >= 62 && y <= 96) ||
|
||||
(x >= 43 && x <= 84 && y >= 77 && y <= 99) ||
|
||||
(x >= 90 && x <= 125 && y >= 71 && y <= 97) ||
|
||||
(x >= 15 && x <= 44 && y >= 45 && y <= 66) ||
|
||||
(x >= 100 && x <= 125 && y >= 54 && y <= 76) ||
|
||||
(x >= 117 && x <= 125 && y >= 27 && y <= 50)
|
||||
) {
|
||||
return 'forest';
|
||||
}
|
||||
if (
|
||||
(x >= 0 && x <= 54 && y <= 42) ||
|
||||
(x >= 47 && x <= 96 && y <= 36) ||
|
||||
(x >= 88 && x <= 125 && y <= 55) ||
|
||||
(x >= 99 && x <= 125 && y >= 47 && y <= 76)
|
||||
) {
|
||||
return 'hill';
|
||||
}
|
||||
if (
|
||||
(x <= 2 && y <= 98) ||
|
||||
(x >= 123 && y <= 92) ||
|
||||
(x >= 40 && x <= 47 && y >= 0 && y <= 68) ||
|
||||
(x >= 79 && x <= 85 && y >= 0 && y <= 50) ||
|
||||
(x >= 62 && x <= 70 && y >= 88 && y <= 107)
|
||||
) {
|
||||
return 'cliff';
|
||||
}
|
||||
if (
|
||||
(x >= 12 && x <= 31 && y >= 88 && y <= 98) ||
|
||||
(x >= 44 && x <= 66 && y >= 75 && y <= 87) ||
|
||||
(x >= 82 && x <= 102 && y >= 61 && y <= 73) ||
|
||||
(x >= 104 && x <= 122 && y >= 45 && y <= 59) ||
|
||||
(x >= 112 && x <= 124 && y >= 28 && y <= 38)
|
||||
) {
|
||||
return 'village';
|
||||
}
|
||||
if (
|
||||
(x >= 21 && x <= 50 && y >= 82 && y <= 96) ||
|
||||
(x >= 56 && x <= 84 && y >= 69 && y <= 82) ||
|
||||
(x >= 91 && x <= 116 && y >= 55 && y <= 68) ||
|
||||
(x >= 100 && x <= 120 && y >= 25 && y <= 41)
|
||||
) {
|
||||
return 'camp';
|
||||
}
|
||||
if (
|
||||
(x >= 50 && x <= 72 && y >= 50 && y <= 66) ||
|
||||
(x >= 74 && x <= 102 && y >= 40 && y <= 55) ||
|
||||
(x >= 96 && x <= 122 && y >= 49 && y <= 65) ||
|
||||
(x >= 105 && x <= 125 && y >= 15 && y <= 38) ||
|
||||
(x >= 112 && x <= 125 && y >= 68 && y <= 86)
|
||||
) {
|
||||
return 'fort';
|
||||
}
|
||||
return 'plain';
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
function placeScenarioUnit(unit: UnitData, position: { x: number; y: number }): UnitData {
|
||||
return {
|
||||
...cloneUnitForScenario(unit),
|
||||
|
||||
@@ -19,6 +19,7 @@ import storyJietingCrisisUrl from '../../assets/images/story/18-jieting-crisis.p
|
||||
import storyChencangSiegeUrl from '../../assets/images/story/19-chencang-siege.png';
|
||||
import storyWuduYinpingUrl from '../../assets/images/story/20-wudu-yinping.png';
|
||||
import storyHanzhongRainDefenseUrl from '../../assets/images/story/21-hanzhong-rain-defense.png';
|
||||
import storyLuchengPursuitUrl from '../../assets/images/story/22-lucheng-pursuit.png';
|
||||
|
||||
export const storyBackgroundAssets: Record<string, string> = {
|
||||
'story-chaos': storyChaosUrl,
|
||||
@@ -42,5 +43,6 @@ export const storyBackgroundAssets: Record<string, string> = {
|
||||
'story-chencang-siege': storyChencangSiegeUrl,
|
||||
'story-wudu-yinping': storyWuduYinpingUrl,
|
||||
'story-hanzhong-rain': storyHanzhongRainDefenseUrl,
|
||||
'story-lucheng-pursuit': storyLuchengPursuitUrl,
|
||||
'story-resolve': storyLiuBeiUrl
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user