Add Weishui camps chapter
This commit is contained in:
@@ -13,6 +13,7 @@ import sixtiethBattleMapUrl from '../../assets/images/battle/sixtieth-battle-map
|
||||
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 sixtyFourthBattleMapUrl from '../../assets/images/battle/sixty-fourth-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';
|
||||
@@ -124,6 +125,7 @@ export const battleMapAssets: Record<string, string> = {
|
||||
'battle-map-sixty-first': sixtyFirstBattleMapUrl,
|
||||
'battle-map-sixty-second': sixtySecondBattleMapUrl,
|
||||
'battle-map-sixty-third': sixtyThirdBattleMapUrl,
|
||||
'battle-map-sixty-fourth': sixtyFourthBattleMapUrl,
|
||||
'battle-map-fifty-seventh': fiftySeventhBattleMapUrl,
|
||||
'battle-map-fifty-sixth': fiftySixthBattleMapUrl
|
||||
};
|
||||
|
||||
@@ -51,6 +51,10 @@ import {
|
||||
sixtyThirdBattleMap,
|
||||
sixtyThirdBattleUnits,
|
||||
sixtyThirdBattleVictoryPages,
|
||||
sixtyFourthBattleBonds,
|
||||
sixtyFourthBattleMap,
|
||||
sixtyFourthBattleUnits,
|
||||
sixtyFourthBattleVictoryPages,
|
||||
fiftySeventhBattleBonds,
|
||||
fiftySeventhBattleMap,
|
||||
fiftySeventhBattleUnits,
|
||||
@@ -320,7 +324,8 @@ export type BattleScenarioId =
|
||||
| 'sixtieth-battle-wudu-yinping'
|
||||
| 'sixty-first-battle-hanzhong-rain-defense'
|
||||
| 'sixty-second-battle-qishan-renewed-offensive'
|
||||
| 'sixty-third-battle-lucheng-pursuit';
|
||||
| 'sixty-third-battle-lucheng-pursuit'
|
||||
| 'sixty-fourth-battle-weishui-camps';
|
||||
|
||||
export type BattleObjectiveKind = 'defeat-leader' | 'pacify-leader' | 'keep-unit-alive' | 'secure-terrain' | 'quick-victory';
|
||||
|
||||
@@ -4263,6 +4268,73 @@ export const sixtyThirdBattleScenario: BattleScenarioDefinition = {
|
||||
nextCampScene: 'CampScene'
|
||||
};
|
||||
|
||||
export const sixtyFourthBattleScenario: BattleScenarioDefinition = {
|
||||
id: 'sixty-fourth-battle-weishui-camps',
|
||||
title: '위수 진영전',
|
||||
victoryConditionLabel: '위수 남안 진영 확보와 봉화 차단',
|
||||
defeatConditionLabel: '제갈량 퇴각 또는 보급 수레 붕괴',
|
||||
openingObjectiveLines: [
|
||||
'노성 추격 뒤에도 사마의는 위수 북안에 진영을 겹겹이 세우고 시간을 벌고 있습니다. 촉한군은 강을 성급히 넘기보다 남안의 진영과 물목, 봉화선을 먼저 끊어야 합니다.',
|
||||
'강유와 왕평은 낮은 길과 회수 표식을 맡고, 황권과 이엄은 긴 수레길을 전장 기준으로 맞춥니다. 위연과 마대는 장합의 기병이 뒤를 물기 전에 진영 사이를 흔들어야 합니다.',
|
||||
'사마의의 위수 본영, 장합의 물목 추격대, 곽회의 봉화선을 동시에 늦추십시오. 강가 마을과 보급 진영을 지키면 다음 북방 공세가 더 깊게 이어집니다.'
|
||||
],
|
||||
map: sixtyFourthBattleMap,
|
||||
units: sixtyFourthBattleUnits,
|
||||
bonds: sixtyFourthBattleBonds,
|
||||
mapTextureKey: 'battle-map-sixty-fourth',
|
||||
leaderUnitId: 'northern-tenth-leader-sima-yi',
|
||||
quickVictoryTurnLimit: 128,
|
||||
baseVictoryGold: 20560,
|
||||
objectives: [
|
||||
{
|
||||
id: 'break-sima-yi-weishui-camps',
|
||||
kind: 'defeat-leader',
|
||||
label: '사마의 위수 본영 압박',
|
||||
rewardGold: 14600,
|
||||
unitId: 'northern-tenth-leader-sima-yi'
|
||||
},
|
||||
{
|
||||
id: 'stop-zhang-he-crossing-raid',
|
||||
kind: 'defeat-leader',
|
||||
label: '장합 물목 추격 저지',
|
||||
rewardGold: 8840,
|
||||
unitId: 'northern-tenth-officer-zhang-he'
|
||||
},
|
||||
{
|
||||
id: 'silence-guo-huai-weishui-beacons',
|
||||
kind: 'defeat-leader',
|
||||
label: '곽회 위수 봉화 차단',
|
||||
rewardGold: 8220,
|
||||
unitId: 'northern-tenth-officer-guo-huai'
|
||||
},
|
||||
{
|
||||
id: 'hold-weishui-supply-camps',
|
||||
kind: 'secure-terrain',
|
||||
label: '위수 보급 진영 확보',
|
||||
rewardGold: 6880,
|
||||
terrain: 'camp'
|
||||
},
|
||||
{
|
||||
id: 'reassure-river-villages',
|
||||
kind: 'secure-terrain',
|
||||
label: '강가 마을 안심',
|
||||
rewardGold: 6660,
|
||||
terrain: 'village'
|
||||
},
|
||||
{
|
||||
id: 'quick',
|
||||
kind: 'quick-victory',
|
||||
label: '128턴 이내 위수 진영 장악',
|
||||
rewardGold: 4540,
|
||||
maxTurn: 128
|
||||
}
|
||||
],
|
||||
defeatConditions: [{ kind: 'unit-defeated', unitId: 'zhuge-liang' }],
|
||||
itemRewards: ['금 138', '상처약 106', '군주 52', '위수 진영 장부 1', '강안 봉화 기록 1'],
|
||||
victoryPages: sixtyFourthBattleVictoryPages,
|
||||
nextCampScene: 'CampScene'
|
||||
};
|
||||
|
||||
export const defaultBattleScenarioId: BattleScenarioId = firstBattleScenario.id;
|
||||
|
||||
export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition> = {
|
||||
@@ -4328,7 +4400,8 @@ export const battleScenarios: Record<BattleScenarioId, BattleScenarioDefinition>
|
||||
'sixtieth-battle-wudu-yinping': sixtiethBattleScenario,
|
||||
'sixty-first-battle-hanzhong-rain-defense': sixtyFirstBattleScenario,
|
||||
'sixty-second-battle-qishan-renewed-offensive': sixtySecondBattleScenario,
|
||||
'sixty-third-battle-lucheng-pursuit': sixtyThirdBattleScenario
|
||||
'sixty-third-battle-lucheng-pursuit': sixtyThirdBattleScenario,
|
||||
'sixty-fourth-battle-weishui-camps': sixtyFourthBattleScenario
|
||||
};
|
||||
|
||||
export const defaultBattleScenario = battleScenarios[defaultBattleScenarioId];
|
||||
|
||||
@@ -18,6 +18,7 @@ import {
|
||||
sixtyFirstBattleScenario,
|
||||
sixtySecondBattleScenario,
|
||||
sixtyThirdBattleScenario,
|
||||
sixtyFourthBattleScenario,
|
||||
fortiethBattleScenario,
|
||||
fortyFirstBattleScenario,
|
||||
fortySecondBattleScenario,
|
||||
@@ -87,6 +88,8 @@ import {
|
||||
sixtySecondBattleVictoryPages,
|
||||
sixtyThirdBattleIntroPages,
|
||||
sixtyThirdBattleVictoryPages,
|
||||
sixtyFourthBattleIntroPages,
|
||||
sixtyFourthBattleVictoryPages,
|
||||
fiftyFirstBattleIntroPages,
|
||||
fiftyFirstBattleVictoryPages,
|
||||
fiftySecondBattleIntroPages,
|
||||
@@ -925,13 +928,24 @@ const sortieFlows: Record<string, SortieFlow> = {
|
||||
},
|
||||
[sixtyThirdBattleScenario.id]: {
|
||||
afterBattleId: sixtyThirdBattleScenario.id,
|
||||
eyebrow: '다음 장 준비',
|
||||
title: '노성 추격 이후',
|
||||
eyebrow: '다음 전장',
|
||||
title: sixtyFourthBattleScenario.title,
|
||||
description:
|
||||
'노성 추격로와 회수 표식은 지켜 냈지만 북방 전선은 여전히 길고 무겁습니다. 다음 계산에서는 얻은 길을 지키는 장부와 더 깊은 북벌 공세를 다시 맞춰야 합니다.',
|
||||
rewardHint: '다음 목표: 북방 전선 재정비 / 다음 북벌 공격로 검토',
|
||||
pages: sixtyThirdBattleVictoryPages,
|
||||
unavailableNotice: '노성 추격 이후의 다음 북벌 전투는 이어지는 작업에서 확장합니다. 현재는 회수 표식, 장합 추격 저지, 노성 주변 보급과 민심 정비를 확인할 수 있습니다.'
|
||||
'노성 추격로와 회수 표식은 지켰지만 사마의는 위수 북안에 진영을 겹겹이 세웠습니다. 이번에는 강을 무리하게 넘기보다 남안 진영, 물목, 봉화선을 먼저 끊어 다음 북방 공세의 발판을 만들어야 합니다.',
|
||||
rewardHint: `예상 보상: ${sixtyFourthBattleScenario.title} 개방 / 위수 진영 장부`,
|
||||
nextBattleId: sixtyFourthBattleScenario.id,
|
||||
campaignStep: 'sixty-fourth-battle',
|
||||
pages: [...sixtyThirdBattleVictoryPages, ...sixtyFourthBattleIntroPages]
|
||||
},
|
||||
[sixtyFourthBattleScenario.id]: {
|
||||
afterBattleId: sixtyFourthBattleScenario.id,
|
||||
eyebrow: '다음 장 준비',
|
||||
title: '위수 진영 이후',
|
||||
description:
|
||||
'위수 남안 진영과 봉화선은 흔들었지만, 북방의 길은 아직 끝나지 않았습니다. 다음 계산에서는 강가 장기전의 보급, 사마의 본영 압박, 장합의 재추격을 다시 나누어야 합니다.',
|
||||
rewardHint: '다음 목표: 위수 전선 재정비 / 다음 북방 공세 검토',
|
||||
pages: sixtyFourthBattleVictoryPages,
|
||||
unavailableNotice: '위수 진영 이후의 다음 북방 전투는 이어지는 작업에서 확장합니다. 현재는 위수 진영 확보, 장합 물목 추격 저지, 곽회 봉화 차단과 강가 보급 정비를 확인할 수 있습니다.'
|
||||
},
|
||||
'northern-campaign-prep-camp-legacy': {
|
||||
afterBattleId: fiftyFourthBattleScenario.id,
|
||||
|
||||
@@ -4013,6 +4013,59 @@ export const sixtyThirdBattleVictoryPages: StoryPage[] = [
|
||||
}
|
||||
];
|
||||
|
||||
export const sixtyFourthBattleIntroPages: StoryPage[] = [
|
||||
{
|
||||
id: 'sixty-fourth-weishui-camp-council',
|
||||
bgm: 'story-dark',
|
||||
chapter: '위수 진영',
|
||||
background: 'story-weishui-camps',
|
||||
speaker: '제갈량',
|
||||
text: '노성 추격으로 돌아올 길은 지켰으나, 사마의는 위수 북안에 여러 진영을 겹겹이 세웠습니다. 강을 건너기보다 먼저 적의 진영 사이를 흔들어 보급 표식과 물목을 빼앗아야 합니다.'
|
||||
},
|
||||
{
|
||||
id: 'sixty-fourth-river-camps-ledger',
|
||||
bgm: 'battle-prep',
|
||||
chapter: '강가의 장부',
|
||||
background: 'story-weishui-camps',
|
||||
speaker: '황권',
|
||||
text: '위수까지 나아가면 길은 넓어지지만 수레는 더 느려집니다. 진영 하나를 깨는 것보다, 얻은 진영에 군량과 표식을 남겨 다음 부대가 길을 잃지 않게 하는 일이 먼저입니다.'
|
||||
},
|
||||
{
|
||||
id: 'sixty-fourth-zhanghe-crossing-threat',
|
||||
bgm: 'story-dark',
|
||||
chapter: '장합의 물목',
|
||||
background: 'story-weishui-camps',
|
||||
speaker: '강유',
|
||||
text: '장합은 정면에서 기다리지 않을 것입니다. 강안의 낮은 길과 물목을 이용해 뒤를 물고, 곽회는 봉화로 사마의의 본영에 시간을 벌어 줄 것입니다. 이번 출전은 돌파와 회수, 진영 확보가 한꺼번에 얽힙니다.'
|
||||
}
|
||||
];
|
||||
|
||||
export const sixtyFourthBattleVictoryPages: StoryPage[] = [
|
||||
{
|
||||
id: 'sixty-fourth-victory-river-camps-held',
|
||||
bgm: 'militia-theme',
|
||||
chapter: '위수 진영 확보',
|
||||
background: 'story-weishui-camps',
|
||||
text: '촉한군은 위수 남안의 진영을 빼앗고 장합의 물목 추격을 늦췄습니다. 사마의의 본영은 여전히 멀지만, 강가의 표식과 군량 장부가 처음으로 북방 깊숙한 곳에 남았습니다.'
|
||||
},
|
||||
{
|
||||
id: 'sixty-fourth-victory-signal-lines',
|
||||
bgm: 'story-dark',
|
||||
chapter: '꺼진 봉화',
|
||||
background: 'story-weishui-camps',
|
||||
speaker: '마량',
|
||||
text: '곽회의 봉화는 늦어졌고, 강가 마을에는 촉한군이 지나간 까닭을 적은 고시문이 붙었습니다. 병사들은 이긴 길보다 돌아올 표식을 먼저 확인하며 다음 명령을 기다렸습니다.'
|
||||
},
|
||||
{
|
||||
id: 'sixty-fourth-next-northern-plan',
|
||||
bgm: 'story-dark',
|
||||
chapter: '더 먼 북방',
|
||||
background: 'story-weishui-camps',
|
||||
speaker: '제갈량',
|
||||
text: '위수 진영을 얻었다 해도 북방의 끝은 아직 보이지 않습니다. 강을 끼고 오래 싸울 사람, 수레를 붙들 사람, 적의 다음 계책을 먼저 읽을 사람을 다시 나누어야 합니다.'
|
||||
}
|
||||
];
|
||||
|
||||
export const firstBattleMap: BattleMap = {
|
||||
width: 20,
|
||||
height: 18,
|
||||
@@ -4536,6 +4589,12 @@ export const sixtyThirdBattleMap: BattleMap = {
|
||||
terrain: createSixtyThirdBattleTerrain()
|
||||
};
|
||||
|
||||
export const sixtyFourthBattleMap: BattleMap = {
|
||||
width: 128,
|
||||
height: 110,
|
||||
terrain: createSixtyFourthBattleTerrain()
|
||||
};
|
||||
|
||||
export const firstBattleUnits: UnitData[] = [
|
||||
{
|
||||
id: 'liu-bei',
|
||||
@@ -18032,6 +18091,103 @@ export const sixtyThirdBattleUnits: UnitData[] = [
|
||||
...sixtyThirdEnemySpecs.map((spec) => createThirtyFirstEnemyUnit(...spec))
|
||||
];
|
||||
|
||||
const sixtyFourthBattleAllyPositions: Record<string, { x: number; y: number }> = {
|
||||
'guan-yu': { x: 17, y: 98 },
|
||||
'zhang-fei': { x: 25, y: 101 },
|
||||
'jian-yong': { x: 8, y: 106 },
|
||||
'mi-zhu': { x: 14, y: 107 },
|
||||
'sun-qian': { x: 20, y: 107 },
|
||||
'zhao-yun': { x: 32, y: 96 },
|
||||
'zhuge-liang': { x: 19, y: 93 },
|
||||
'ma-liang': { x: 26, y: 90 },
|
||||
'yi-ji': { x: 8, y: 108 },
|
||||
'gong-zhi': { x: 30, y: 105 },
|
||||
'huang-zhong': { x: 40, y: 94 },
|
||||
'wei-yan': { x: 46, y: 95 },
|
||||
'pang-tong': { x: 16, y: 89 },
|
||||
'fa-zheng': { x: 30, y: 88 },
|
||||
'wu-yi': { x: 49, y: 103 },
|
||||
'yan-yan': { x: 53, y: 96 },
|
||||
'li-yan': { x: 35, y: 87 },
|
||||
'huang-quan': { x: 13, y: 92 },
|
||||
'ma-chao': { x: 56, y: 92 },
|
||||
'ma-dai': { x: 61, y: 99 },
|
||||
'wang-ping': { x: 42, y: 87 },
|
||||
'jiang-wei': { x: 36, y: 90 }
|
||||
};
|
||||
|
||||
const sixtyFourthEnemySpecs: ReadonlyArray<
|
||||
readonly [string, string, string, UnitClassKey, number, number, number, number, number]
|
||||
> = [
|
||||
['northern-tenth-scout-a', '위수 서안 척후병', '서쪽 강안 정찰', 'bandit', 232, 1120, 306, 50, 90],
|
||||
['northern-tenth-scout-b', '수레길 척후병', '수레길 정찰', 'bandit', 232, 1120, 306, 63, 86],
|
||||
['northern-tenth-scout-c', '물목 척후병', '중앙 물목 정찰', 'bandit', 233, 1132, 308, 77, 80],
|
||||
['northern-tenth-scout-d', '봉화 척후병', '동쪽 봉화 정찰', 'bandit', 233, 1132, 308, 91, 72],
|
||||
['northern-tenth-scout-e', '곽회 전초 척후병', '차단로 정찰', 'bandit', 234, 1144, 310, 106, 60],
|
||||
['northern-tenth-scout-f', '위수 뒤 척후병', '북쪽 진영 정찰', 'bandit', 234, 1144, 310, 124, 38],
|
||||
['northern-tenth-infantry-a', '위군 강안 보병', '서쪽 강안 보병', 'yellowTurban', 233, 1700, 404, 57, 85],
|
||||
['northern-tenth-infantry-b', '위군 수레길 보병', '수레길 보병', 'yellowTurban', 233, 1700, 404, 70, 82],
|
||||
['northern-tenth-infantry-c', '위군 물목 보병', '중앙 물목 보병', 'yellowTurban', 234, 1720, 408, 84, 75],
|
||||
['northern-tenth-infantry-d', '위군 봉화 보병', '봉화대 보병', 'yellowTurban', 234, 1720, 408, 98, 68],
|
||||
['northern-tenth-infantry-e', '곽회 차단 보병', '차단로 보병', 'yellowTurban', 235, 1740, 412, 110, 55],
|
||||
['northern-tenth-infantry-f', '위수 본영 보병', '본영 보병', 'yellowTurban', 235, 1740, 412, 121, 45],
|
||||
['northern-tenth-infantry-g', '강가 수레 차단병', '수레 차단 보병', 'yellowTurban', 236, 1760, 416, 94, 91],
|
||||
['northern-tenth-infantry-h', '북쪽 진문 보병', '진문 보병', 'yellowTurban', 236, 1760, 416, 126, 27],
|
||||
['northern-tenth-archer-a', '위수 서안 궁병', '서쪽 능선 궁병', 'archer', 233, 1230, 334, 66, 77],
|
||||
['northern-tenth-archer-b', '수레길 궁병', '수레길 궁병', 'archer', 233, 1230, 334, 79, 71],
|
||||
['northern-tenth-archer-c', '물목 궁병', '중앙 물목 궁병', 'archer', 234, 1242, 336, 93, 63],
|
||||
['northern-tenth-archer-d', '봉화대 궁병', '봉화 궁병', 'archer', 235, 1254, 338, 106, 52],
|
||||
['northern-tenth-archer-e', '본영 궁병', '위수 본영 궁병', 'archer', 235, 1254, 338, 118, 35],
|
||||
['northern-tenth-archer-f', '북쪽 절벽 궁병', '절벽 궁병', 'archer', 236, 1266, 340, 126, 19],
|
||||
['northern-tenth-cavalry-a', '장합 물목 기병', '서쪽 물목 기병', 'cavalry', 234, 1780, 428, 52, 78],
|
||||
['northern-tenth-cavalry-b', '장합 물목 기병', '수레길 추격 기병', 'cavalry', 234, 1780, 428, 65, 75],
|
||||
['northern-tenth-cavalry-c', '장합 물목 기병', '중앙 추격 기병', 'cavalry', 235, 1802, 432, 82, 67],
|
||||
['northern-tenth-cavalry-d', '곽회 차단 기병', '동쪽 차단 기병', 'cavalry', 236, 1824, 436, 98, 59],
|
||||
['northern-tenth-cavalry-e', '사마의 예비 기병', '본영 예비 기병', 'cavalry', 236, 1824, 436, 114, 45],
|
||||
['northern-tenth-cavalry-f', '북쪽 절벽 기병', '절벽 차단 기병', 'cavalry', 237, 1846, 440, 126, 30],
|
||||
['northern-tenth-camp-guard-a', '위수 서안 수비대', '서쪽 진영 수비', 'yellowTurban', 234, 1720, 410, 44, 64],
|
||||
['northern-tenth-camp-guard-b', '수레 표식 수비대', '표식 수비', 'yellowTurban', 234, 1720, 410, 61, 60],
|
||||
['northern-tenth-camp-guard-c', '물목 수비대', '중앙 물목 수비', 'yellowTurban', 235, 1740, 414, 79, 53],
|
||||
['northern-tenth-camp-guard-d', '봉화 길 수비대', '봉화 길 수비', 'yellowTurban', 235, 1740, 414, 97, 44],
|
||||
['northern-tenth-camp-guard-e', '사마의 본영 수비대', '본영 수비', 'yellowTurban', 236, 1760, 418, 113, 36],
|
||||
['northern-tenth-camp-guard-f', '북쪽 절벽 수비대', '절벽 수비', 'yellowTurban', 236, 1760, 418, 126, 23],
|
||||
['northern-tenth-strategist-a', '위군 위수 군리', '강안 장부 군리', 'strategist', 234, 1320, 354, 82, 60],
|
||||
['northern-tenth-strategist-b', '위군 보급 군리', '수레 차단 군리', 'strategist', 235, 1332, 356, 98, 48],
|
||||
['northern-tenth-strategist-c', '사마의 본영 군리', '본영 장부 군리', 'strategist', 235, 1332, 356, 114, 38],
|
||||
['northern-tenth-strategist-d', '곽회 봉화 군리', '봉화 장부 군리', 'strategist', 236, 1344, 358, 121, 68],
|
||||
['northern-tenth-officer-river', '위수 진영장', '위수 진영 장수', 'rebelLeader', 238, 1840, 440, 88, 82],
|
||||
['northern-tenth-officer-supply', '강가 수레 차단장', '수레 차단 장수', 'rebelLeader', 238, 1840, 440, 108, 74],
|
||||
['northern-tenth-officer-guo-huai', '곽회', '봉화 차단 장수', 'rebelLeader', 237, 1820, 436, 118, 72],
|
||||
['northern-tenth-officer-relay', '봉화 연락장', '위수 뒤 봉화 장수', 'rebelLeader', 237, 1820, 436, 121, 54],
|
||||
['northern-tenth-officer-zhang-he', '장합', '위수 물목 추격대장', 'rebelLeader', 239, 1880, 446, 124, 33],
|
||||
['northern-tenth-leader-sima-yi', '사마의', '위수 진영 총지휘', 'rebelLeader', 240, 1920, 452, 120, 45]
|
||||
];
|
||||
|
||||
export const sixtyFourthBattleUnits: 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, sixtyFourthBattleAllyPositions[unit.id] ?? { x: unit.x, y: unit.y })),
|
||||
...sixtyFourthEnemySpecs.map((spec) => createThirtyFirstEnemyUnit(...spec))
|
||||
];
|
||||
|
||||
export const firstBattleBonds: BattleBond[] = [
|
||||
{
|
||||
id: 'liu-bei__guan-yu',
|
||||
@@ -19469,6 +19625,46 @@ export const sixtyThirdBattleBonds: BattleBond[] = [
|
||||
...northernNinthBattleBonds
|
||||
].map(cloneBattleBondForScenario);
|
||||
|
||||
export const northernTenthBattleBonds: BattleBond[] = [
|
||||
{
|
||||
id: 'jiang-wei__wang-ping_northern-tenth',
|
||||
unitIds: ['jiang-wei', 'wang-ping'],
|
||||
title: '물목과 정지선',
|
||||
level: 58,
|
||||
exp: 0,
|
||||
description: '강유의 낮은 길 판단과 왕평의 정지선이 맞물리면, 위수 물목을 넘볼 때도 돌아올 표식을 잃지 않습니다.'
|
||||
},
|
||||
{
|
||||
id: 'zhuge-liang__huang-quan_northern-tenth',
|
||||
unitIds: ['zhuge-liang', 'huang-quan'],
|
||||
title: '강가의 장부',
|
||||
level: 56,
|
||||
exp: 0,
|
||||
description: '제갈량의 전선 계산과 황권의 군량 장부가 함께 움직이면, 강을 낀 장기전에서도 수레가 먼저 무너지지 않습니다.'
|
||||
},
|
||||
{
|
||||
id: 'wei-yan__ma-dai_northern-tenth',
|
||||
unitIds: ['wei-yan', 'ma-dai'],
|
||||
title: '돌파와 측면',
|
||||
level: 52,
|
||||
exp: 0,
|
||||
description: '위연의 돌파와 마대의 측면 기동은 위수 진영 사이를 흔들어 장합의 추격 기병을 분산시킵니다.'
|
||||
},
|
||||
{
|
||||
id: 'zhao-yun__li-yan_northern-tenth',
|
||||
unitIds: ['zhao-yun', 'li-yan'],
|
||||
title: '예비대와 수레',
|
||||
level: 50,
|
||||
exp: 0,
|
||||
description: '조운의 예비대 회수와 이엄의 운송 기준이 맞으면, 깊어진 진영전에서도 보급 수레를 버리지 않고 물릴 수 있습니다.'
|
||||
}
|
||||
];
|
||||
|
||||
export const sixtyFourthBattleBonds: BattleBond[] = [
|
||||
...sixtyThirdBattleBonds,
|
||||
...northernTenthBattleBonds
|
||||
].map(cloneBattleBondForScenario);
|
||||
|
||||
function createEighthBattleTerrain(): TerrainType[][] {
|
||||
return Array.from({ length: 22 }, (_, y) =>
|
||||
Array.from({ length: 26 }, (_, x): TerrainType => {
|
||||
@@ -23027,6 +23223,87 @@ function createSixtyThirdBattleTerrain(): TerrainType[][] {
|
||||
);
|
||||
}
|
||||
|
||||
function createSixtyFourthBattleTerrain(): TerrainType[][] {
|
||||
return Array.from({ length: 110 }, (_, y) =>
|
||||
Array.from({ length: 128 }, (_, x): TerrainType => {
|
||||
if (
|
||||
(x >= 2 && x <= 126 && y >= 21 && y <= 32) ||
|
||||
(x >= 2 && x <= 126 && y >= 36 && y <= 45)
|
||||
) {
|
||||
return 'river';
|
||||
}
|
||||
if (
|
||||
(x >= 7 && x <= 90 && y >= 95 && y <= 101) ||
|
||||
(x >= 24 && x <= 108 && y >= 83 && y <= 91) ||
|
||||
(x >= 48 && x <= 116 && y >= 71 && y <= 81) ||
|
||||
(x >= 78 && x <= 124 && y >= 58 && y <= 70) ||
|
||||
(x >= 99 && x <= 127 && y >= 44 && y <= 56) ||
|
||||
(x >= 33 && x <= 43 && y >= 75 && y <= 105) ||
|
||||
(x >= 59 && x <= 69 && y >= 61 && y <= 96) ||
|
||||
(x >= 88 && x <= 99 && y >= 47 && y <= 86) ||
|
||||
(x >= 102 && x <= 112 && y >= 27 && y <= 72) ||
|
||||
(x >= 43 && x <= 88 && y >= 87 && y <= 93)
|
||||
) {
|
||||
return 'road';
|
||||
}
|
||||
if (
|
||||
(x >= 0 && x <= 40 && y >= 65 && y <= 98) ||
|
||||
(x >= 44 && x <= 86 && y >= 80 && y <= 101) ||
|
||||
(x >= 92 && x <= 127 && y >= 74 && y <= 100) ||
|
||||
(x >= 16 && x <= 45 && y >= 48 && y <= 69) ||
|
||||
(x >= 102 && x <= 127 && y >= 57 && y <= 78) ||
|
||||
(x >= 118 && x <= 127 && y >= 30 && y <= 53)
|
||||
) {
|
||||
return 'forest';
|
||||
}
|
||||
if (
|
||||
(x >= 0 && x <= 55 && y <= 19) ||
|
||||
(x >= 47 && x <= 98 && y <= 22) ||
|
||||
(x >= 90 && x <= 127 && y <= 27) ||
|
||||
(x >= 100 && x <= 127 && y >= 50 && y <= 78)
|
||||
) {
|
||||
return 'hill';
|
||||
}
|
||||
if (
|
||||
(x <= 2 && y <= 101) ||
|
||||
(x >= 125 && y <= 94) ||
|
||||
(x >= 41 && x <= 48 && y >= 0 && y <= 70) ||
|
||||
(x >= 80 && x <= 87 && y >= 0 && y <= 53) ||
|
||||
(x >= 64 && x <= 72 && y >= 90 && y <= 109)
|
||||
) {
|
||||
return 'cliff';
|
||||
}
|
||||
if (
|
||||
(x >= 13 && x <= 33 && y >= 91 && y <= 101) ||
|
||||
(x >= 45 && x <= 68 && y >= 78 && y <= 90) ||
|
||||
(x >= 84 && x <= 105 && y >= 64 && y <= 76) ||
|
||||
(x >= 106 && x <= 125 && y >= 48 && y <= 62) ||
|
||||
(x >= 113 && x <= 127 && y >= 31 && y <= 41)
|
||||
) {
|
||||
return 'village';
|
||||
}
|
||||
if (
|
||||
(x >= 22 && x <= 52 && y >= 85 && y <= 99) ||
|
||||
(x >= 57 && x <= 86 && y >= 72 && y <= 85) ||
|
||||
(x >= 92 && x <= 118 && y >= 58 && y <= 71) ||
|
||||
(x >= 101 && x <= 122 && y >= 28 && y <= 44)
|
||||
) {
|
||||
return 'camp';
|
||||
}
|
||||
if (
|
||||
(x >= 51 && x <= 74 && y >= 52 && y <= 68) ||
|
||||
(x >= 75 && x <= 104 && y >= 42 && y <= 58) ||
|
||||
(x >= 97 && x <= 124 && y >= 51 && y <= 67) ||
|
||||
(x >= 106 && x <= 127 && y >= 16 && y <= 40) ||
|
||||
(x >= 113 && x <= 127 && y >= 70 && y <= 88)
|
||||
) {
|
||||
return 'fort';
|
||||
}
|
||||
return 'plain';
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
function placeScenarioUnit(unit: UnitData, position: { x: number; y: number }): UnitData {
|
||||
return {
|
||||
...cloneUnitForScenario(unit),
|
||||
|
||||
@@ -20,6 +20,7 @@ import storyChencangSiegeUrl from '../../assets/images/story/19-chencang-siege.p
|
||||
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';
|
||||
import storyWeishuiCampsUrl from '../../assets/images/story/23-weishui-camps.png';
|
||||
|
||||
export const storyBackgroundAssets: Record<string, string> = {
|
||||
'story-chaos': storyChaosUrl,
|
||||
@@ -44,5 +45,6 @@ export const storyBackgroundAssets: Record<string, string> = {
|
||||
'story-wudu-yinping': storyWuduYinpingUrl,
|
||||
'story-hanzhong-rain': storyHanzhongRainDefenseUrl,
|
||||
'story-lucheng-pursuit': storyLuchengPursuitUrl,
|
||||
'story-weishui-camps': storyWeishuiCampsUrl,
|
||||
'story-resolve': storyLiuBeiUrl
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user